Merge "Disabling exact alarm permission enforcement" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b3ff8dcffd
@@ -27,7 +27,7 @@ import android.annotation.SystemApi;
|
|||||||
import android.annotation.SystemService;
|
import android.annotation.SystemService;
|
||||||
import android.annotation.TestApi;
|
import android.annotation.TestApi;
|
||||||
import android.compat.annotation.ChangeId;
|
import android.compat.annotation.ChangeId;
|
||||||
import android.compat.annotation.EnabledAfter;
|
import android.compat.annotation.Disabled;
|
||||||
import android.compat.annotation.EnabledSince;
|
import android.compat.annotation.EnabledSince;
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -282,15 +282,14 @@ public class AlarmManager {
|
|||||||
public static final long ENABLE_USE_EXACT_ALARM = 218533173L;
|
public static final long ENABLE_USE_EXACT_ALARM = 218533173L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For apps targeting {@link Build.VERSION_CODES#TIRAMISU} or above, the permission
|
* The permission {@link Manifest.permission#SCHEDULE_EXACT_ALARM} will be denied, unless the
|
||||||
* {@link Manifest.permission#SCHEDULE_EXACT_ALARM} will be denied, unless the user explicitly
|
* user explicitly allows it from Settings.
|
||||||
* allows it from Settings.
|
|
||||||
*
|
*
|
||||||
* TODO (b/226439802): change to EnabledSince(T) after SDK finalization.
|
* TODO (b/226439802): Either enable it in the next SDK or replace it with a better alternative.
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@ChangeId
|
@ChangeId
|
||||||
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S_V2)
|
@Disabled
|
||||||
public static final long SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = 226439802L;
|
public static final long SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = 226439802L;
|
||||||
|
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
|
|||||||
@@ -565,9 +565,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final String KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED =
|
static final String KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED =
|
||||||
"kill_on_schedule_exact_alarm_revoked";
|
"kill_on_schedule_exact_alarm_revoked";
|
||||||
@VisibleForTesting
|
|
||||||
static final String KEY_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT =
|
|
||||||
"schedule_exact_alarm_denied_by_default";
|
|
||||||
|
|
||||||
private static final long DEFAULT_MIN_FUTURITY = 5 * 1000;
|
private static final long DEFAULT_MIN_FUTURITY = 5 * 1000;
|
||||||
private static final long DEFAULT_MIN_INTERVAL = 60 * 1000;
|
private static final long DEFAULT_MIN_INTERVAL = 60 * 1000;
|
||||||
@@ -612,8 +609,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
|
|
||||||
private static final boolean DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED = true;
|
private static final boolean DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED = true;
|
||||||
|
|
||||||
private static final boolean DEFAULT_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = true;
|
|
||||||
|
|
||||||
// Minimum futurity of a new alarm
|
// Minimum futurity of a new alarm
|
||||||
public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY;
|
public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY;
|
||||||
|
|
||||||
@@ -701,14 +696,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
public boolean KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED =
|
public boolean KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED =
|
||||||
DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED;
|
DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED;
|
||||||
|
|
||||||
/**
|
|
||||||
* When this is {@code true}, apps with the change
|
|
||||||
* {@link AlarmManager#SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT} enabled will not get
|
|
||||||
* {@link Manifest.permission#SCHEDULE_EXACT_ALARM} unless the user grants it to them.
|
|
||||||
*/
|
|
||||||
public volatile boolean SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT =
|
|
||||||
DEFAULT_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT;
|
|
||||||
|
|
||||||
public boolean USE_TARE_POLICY = Settings.Global.DEFAULT_ENABLE_TARE == 1;
|
public boolean USE_TARE_POLICY = Settings.Global.DEFAULT_ENABLE_TARE == 1;
|
||||||
|
|
||||||
private long mLastAllowWhileIdleWhitelistDuration = -1;
|
private long mLastAllowWhileIdleWhitelistDuration = -1;
|
||||||
@@ -892,15 +879,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED,
|
KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED,
|
||||||
DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED);
|
DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED);
|
||||||
break;
|
break;
|
||||||
case KEY_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT:
|
|
||||||
final boolean oldValue = SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT;
|
|
||||||
|
|
||||||
SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = properties.getBoolean(
|
|
||||||
KEY_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT,
|
|
||||||
DEFAULT_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT);
|
|
||||||
handleScheduleExactAlarmDeniedByDefaultChange(oldValue,
|
|
||||||
SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if (name.startsWith(KEY_PREFIX_STANDBY_QUOTA) && !standbyQuotaUpdated) {
|
if (name.startsWith(KEY_PREFIX_STANDBY_QUOTA) && !standbyQuotaUpdated) {
|
||||||
// The quotas need to be updated in order, so we can't just rely
|
// The quotas need to be updated in order, so we can't just rely
|
||||||
@@ -971,15 +949,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleScheduleExactAlarmDeniedByDefaultChange(boolean oldValue,
|
|
||||||
boolean newValue) {
|
|
||||||
if (oldValue == newValue) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mHandler.obtainMessage(AlarmHandler.CHECK_EXACT_ALARM_PERMISSION_ON_FEATURE_TOGGLE,
|
|
||||||
newValue).sendToTarget();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void migrateAlarmsToNewStoreLocked() {
|
private void migrateAlarmsToNewStoreLocked() {
|
||||||
final AlarmStore newStore = LAZY_BATCHING ? new LazyAlarmStore()
|
final AlarmStore newStore = LAZY_BATCHING ? new LazyAlarmStore()
|
||||||
: new BatchingAlarmStore();
|
: new BatchingAlarmStore();
|
||||||
@@ -1156,9 +1125,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
pw.print(KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED,
|
pw.print(KEY_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED,
|
||||||
KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED);
|
KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED);
|
||||||
pw.println();
|
pw.println();
|
||||||
pw.print(KEY_SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT,
|
|
||||||
SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT);
|
|
||||||
pw.println();
|
|
||||||
|
|
||||||
pw.print(Settings.Global.ENABLE_TARE, USE_TARE_POLICY);
|
pw.print(Settings.Global.ENABLE_TARE, USE_TARE_POLICY);
|
||||||
pw.println();
|
pw.println();
|
||||||
@@ -2928,10 +2894,8 @@ public class AlarmManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isScheduleExactAlarmDeniedByDefault(String packageName, int userId) {
|
private boolean isScheduleExactAlarmDeniedByDefault(String packageName, int userId) {
|
||||||
return mConstants.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT
|
return CompatChanges.isChangeEnabled(AlarmManager.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT,
|
||||||
&& CompatChanges.isChangeEnabled(
|
packageName, UserHandle.of(userId));
|
||||||
AlarmManager.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, packageName,
|
|
||||||
UserHandle.of(userId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NeverCompile // Avoid size overhead of debugging code.
|
@NeverCompile // Avoid size overhead of debugging code.
|
||||||
@@ -4707,7 +4671,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
public static final int REFRESH_EXACT_ALARM_CANDIDATES = 11;
|
public static final int REFRESH_EXACT_ALARM_CANDIDATES = 11;
|
||||||
public static final int TARE_AFFORDABILITY_CHANGED = 12;
|
public static final int TARE_AFFORDABILITY_CHANGED = 12;
|
||||||
public static final int CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE = 13;
|
public static final int CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE = 13;
|
||||||
public static final int CHECK_EXACT_ALARM_PERMISSION_ON_FEATURE_TOGGLE = 14;
|
|
||||||
|
|
||||||
AlarmHandler() {
|
AlarmHandler() {
|
||||||
super(Looper.myLooper());
|
super(Looper.myLooper());
|
||||||
@@ -4827,32 +4790,6 @@ public class AlarmManagerService extends SystemService {
|
|||||||
removeExactAlarmsOnPermissionRevoked(uid, packageName, /*killUid = */false);
|
removeExactAlarmsOnPermissionRevoked(uid, packageName, /*killUid = */false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CHECK_EXACT_ALARM_PERMISSION_ON_FEATURE_TOGGLE:
|
|
||||||
final boolean defaultDenied = (Boolean) msg.obj;
|
|
||||||
|
|
||||||
final int[] startedUserIds = mActivityManagerInternal.getStartedUserIds();
|
|
||||||
for (int appId : mExactAlarmCandidates) {
|
|
||||||
for (int userId : startedUserIds) {
|
|
||||||
uid = UserHandle.getUid(userId, appId);
|
|
||||||
|
|
||||||
final AndroidPackage packageForUid =
|
|
||||||
mPackageManagerInternal.getPackage(uid);
|
|
||||||
if (packageForUid == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final String pkg = packageForUid.getPackageName();
|
|
||||||
if (defaultDenied) {
|
|
||||||
if (!hasScheduleExactAlarmInternal(pkg, uid)
|
|
||||||
&& !hasUseExactAlarmInternal(pkg, uid)) {
|
|
||||||
removeExactAlarmsOnPermissionRevoked(uid, pkg, true);
|
|
||||||
}
|
|
||||||
} else if (hasScheduleExactAlarmInternal(pkg, uid)) {
|
|
||||||
sendScheduleExactAlarmPermissionStateChangedBroadcast(pkg,
|
|
||||||
UserHandle.getUserId(uid));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
// nope, just ignore it
|
// nope, just ignore it
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -3220,8 +3220,7 @@ public class AlarmManagerServiceTest {
|
|||||||
when(mRoleManager.getRoleHolders(RoleManager.ROLE_SYSTEM_WELLBEING)).thenReturn(
|
when(mRoleManager.getRoleHolders(RoleManager.ROLE_SYSTEM_WELLBEING)).thenReturn(
|
||||||
Arrays.asList(package4));
|
Arrays.asList(package4));
|
||||||
|
|
||||||
mockChangeEnabled(SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, true);
|
mockChangeEnabled(SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, false);
|
||||||
mService.mConstants.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = false;
|
|
||||||
mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[] {
|
mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[] {
|
||||||
package1,
|
package1,
|
||||||
package3,
|
package3,
|
||||||
@@ -3233,21 +3232,7 @@ public class AlarmManagerServiceTest {
|
|||||||
assertFalse(mService.isScheduleExactAlarmAllowedByDefault(package3, uid3));
|
assertFalse(mService.isScheduleExactAlarmAllowedByDefault(package3, uid3));
|
||||||
assertTrue(mService.isScheduleExactAlarmAllowedByDefault(package4, uid4));
|
assertTrue(mService.isScheduleExactAlarmAllowedByDefault(package4, uid4));
|
||||||
|
|
||||||
mockChangeEnabled(SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, false);
|
|
||||||
mService.mConstants.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = true;
|
|
||||||
mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[] {
|
|
||||||
package1,
|
|
||||||
package3,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Same as above, deny listed packages will be false.
|
|
||||||
assertFalse(mService.isScheduleExactAlarmAllowedByDefault(package1, uid1));
|
|
||||||
assertTrue(mService.isScheduleExactAlarmAllowedByDefault(package2, uid2));
|
|
||||||
assertFalse(mService.isScheduleExactAlarmAllowedByDefault(package3, uid3));
|
|
||||||
assertTrue(mService.isScheduleExactAlarmAllowedByDefault(package4, uid4));
|
|
||||||
|
|
||||||
mockChangeEnabled(SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, true);
|
mockChangeEnabled(SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT, true);
|
||||||
mService.mConstants.SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = true;
|
|
||||||
mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[] {
|
mService.mConstants.EXACT_ALARM_DENY_LIST = new ArraySet<>(new String[] {
|
||||||
package1,
|
package1,
|
||||||
package3,
|
package3,
|
||||||
|
|||||||
Reference in New Issue
Block a user