Reset component enabled settings when clearing app data
Introduces a new attriubte named resetEnabledSettingsOnAppDataCleared for the components in the manifest such as activity, receiver, provider and service. If the value is true, the enabled settings of components in the application will be reset to the default value when the application's user data is cleared. Bug: 148803217 Test: atest PackageManagerTest Test: atest AndroidPackageTest Change-Id: Id10ae9768835b20619122a6435442fbdaefb9318
This commit is contained in:
@@ -1204,6 +1204,7 @@ package android {
|
||||
field public static final int requiredSplitTypes;
|
||||
field public static final int requiresFadingEdge = 16843685; // 0x10103a5
|
||||
field public static final int requiresSmallestWidthDp = 16843620; // 0x1010364
|
||||
field public static final int resetEnabledSettingsOnAppDataCleared;
|
||||
field public static final int resizeClip = 16843983; // 0x10104cf
|
||||
field public static final int resizeMode = 16843619; // 0x1010363
|
||||
field public static final int resizeable = 16843405; // 0x101028d
|
||||
|
||||
@@ -362,6 +362,9 @@ public interface ParsingPackage extends ParsingPackageRead {
|
||||
|
||||
ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible);
|
||||
|
||||
ParsingPackage setResetEnabledSettingsOnAppDataCleared(
|
||||
boolean resetEnabledSettingsOnAppDataCleared);
|
||||
|
||||
// TODO(b/135203078): This class no longer has access to ParsedPackage, find a replacement
|
||||
// for moving to the next step
|
||||
@CallSuper
|
||||
|
||||
@@ -517,6 +517,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
|
||||
private static final long DISALLOW_PROFILING = 1L << 45;
|
||||
private static final long REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1L << 46;
|
||||
private static final long ATTRIBUTIONS_ARE_USER_VISIBLE = 1L << 47;
|
||||
private static final long RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED = 1L << 48;
|
||||
}
|
||||
|
||||
private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) {
|
||||
@@ -2215,6 +2216,11 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
|
||||
return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isResetEnabledSettingsOnAppDataCleared() {
|
||||
return getBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParsingPackageImpl setBaseRevisionCode(int value) {
|
||||
baseRevisionCode = value;
|
||||
@@ -2771,4 +2777,12 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
|
||||
setBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE, attributionsAreUserVisible);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParsingPackage setResetEnabledSettingsOnAppDataCleared(
|
||||
boolean resetEnabledSettingsOnAppDataCleared) {
|
||||
setBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED,
|
||||
resetEnabledSettingsOnAppDataCleared);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,4 +297,12 @@ public interface ParsingPackageRead extends PkgWithoutStateAppInfo, PkgWithoutSt
|
||||
* @see R.styleable#AndroidManifestService_visibleToInstantApps
|
||||
*/
|
||||
boolean isVisibleToInstantApps();
|
||||
|
||||
/**
|
||||
* Whether the enabled settings of components in the application should be reset to the default,
|
||||
* when the application's user data is cleared.
|
||||
*
|
||||
* @see R.styleable#AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared
|
||||
*/
|
||||
boolean isResetEnabledSettingsOnAppDataCleared();
|
||||
}
|
||||
|
||||
@@ -2288,6 +2288,9 @@ public class ParsingPackageUtils {
|
||||
.setVmSafeMode(bool(false, R.styleable.AndroidManifestApplication_vmSafeMode, sa))
|
||||
.setAutoRevokePermissions(anInt(R.styleable.AndroidManifestApplication_autoRevokePermissions, sa))
|
||||
.setAttributionsAreUserVisible(bool(false, R.styleable.AndroidManifestApplication_attributionsAreUserVisible, sa))
|
||||
.setResetEnabledSettingsOnAppDataCleared(bool(false,
|
||||
R.styleable.AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared,
|
||||
sa))
|
||||
// targetSdkVersion gated
|
||||
.setAllowAudioPlaybackCapture(bool(targetSdk >= Build.VERSION_CODES.Q, R.styleable.AndroidManifestApplication_allowAudioPlaybackCapture, sa))
|
||||
.setBaseHardwareAccelerated(bool(targetSdk >= Build.VERSION_CODES.ICE_CREAM_SANDWICH, R.styleable.AndroidManifestApplication_hardwareAccelerated, sa))
|
||||
|
||||
@@ -1991,6 +1991,12 @@
|
||||
|
||||
<!-- Whether attributions provided are meant to be user-visible. -->
|
||||
<attr name="attributionsAreUserVisible" format="boolean" />
|
||||
|
||||
<!-- Specifies whether enabled settings of components in the application should be
|
||||
reset to {@link android.content.pm.PackageManager#COMPONENT_ENABLED_STATE_DEFAULT}
|
||||
when the application's user data is cleared. The default value is false.
|
||||
-->
|
||||
<attr name="resetEnabledSettingsOnAppDataCleared" format="boolean" />
|
||||
</declare-styleable>
|
||||
|
||||
<!-- An attribution is a logical part of an app and is identified by a tag.
|
||||
|
||||
@@ -3305,6 +3305,7 @@
|
||||
<public name="splitTypes" />
|
||||
<public name="canDisplayOnRemoteDevices" />
|
||||
<public name="supportedTypes" />
|
||||
<public name="resetEnabledSettingsOnAppDataCleared" />
|
||||
</staging-public-group>
|
||||
|
||||
<staging-public-group type="id" first-id="0x01de0000">
|
||||
|
||||
@@ -5646,6 +5646,9 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
synchronized (mLock) {
|
||||
mInstantAppRegistry.deleteInstantApplicationMetadataLPw(
|
||||
packageName, userId);
|
||||
if (succeeded) {
|
||||
resetComponentEnabledSettingsIfNeededLPw(packageName, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (succeeded) {
|
||||
@@ -5721,6 +5724,62 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update component enabled settings to {@link PackageManager#COMPONENT_ENABLED_STATE_DEFAULT}
|
||||
* if the resetEnabledSettingsOnAppDataCleared is {@code true}.
|
||||
*/
|
||||
private void resetComponentEnabledSettingsIfNeededLPw(String packageName, int userId) {
|
||||
final AndroidPackage pkg = packageName != null ? mPackages.get(packageName) : null;
|
||||
if (pkg == null || !pkg.isResetEnabledSettingsOnAppDataCleared()) {
|
||||
return;
|
||||
}
|
||||
final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
|
||||
if (pkgSetting == null) {
|
||||
return;
|
||||
}
|
||||
final ArrayList<String> updatedComponents = new ArrayList<>();
|
||||
final Consumer<? super ParsedMainComponent> resetSettings = (component) -> {
|
||||
if (pkgSetting.restoreComponentLPw(component.getClassName(), userId)) {
|
||||
updatedComponents.add(component.getClassName());
|
||||
}
|
||||
};
|
||||
for (int i = 0; i < pkg.getActivities().size(); i++) {
|
||||
resetSettings.accept(pkg.getActivities().get(i));
|
||||
}
|
||||
for (int i = 0; i < pkg.getReceivers().size(); i++) {
|
||||
resetSettings.accept(pkg.getReceivers().get(i));
|
||||
}
|
||||
for (int i = 0; i < pkg.getServices().size(); i++) {
|
||||
resetSettings.accept(pkg.getServices().get(i));
|
||||
}
|
||||
for (int i = 0; i < pkg.getProviders().size(); i++) {
|
||||
resetSettings.accept(pkg.getProviders().get(i));
|
||||
}
|
||||
if (ArrayUtils.isEmpty(updatedComponents)) {
|
||||
// nothing changed
|
||||
return;
|
||||
}
|
||||
|
||||
updateSequenceNumberLP(pkgSetting, new int[] { userId });
|
||||
updateInstantAppInstallerLocked(packageName);
|
||||
scheduleWritePackageRestrictionsLocked(userId);
|
||||
|
||||
final ArrayList<String> pendingComponents = mPendingBroadcasts.get(userId, packageName);
|
||||
if (pendingComponents == null) {
|
||||
mPendingBroadcasts.put(userId, packageName, updatedComponents);
|
||||
} else {
|
||||
for (int i = 0; i < updatedComponents.size(); i++) {
|
||||
final String updatedComponent = updatedComponents.get(i);
|
||||
if (!pendingComponents.contains(updatedComponent)) {
|
||||
pendingComponents.add(updatedComponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) {
|
||||
mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove entries from the keystore daemon. Will only remove it if the
|
||||
* {@code appId} is valid.
|
||||
|
||||
@@ -223,6 +223,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag
|
||||
AndroidPackage::isVendor,
|
||||
AndroidPackage::isVisibleToInstantApps,
|
||||
AndroidPackage::isVmSafeMode,
|
||||
AndroidPackage::isResetEnabledSettingsOnAppDataCleared,
|
||||
AndroidPackage::getMaxAspectRatio,
|
||||
AndroidPackage::getMinAspectRatio,
|
||||
AndroidPackage::hasPreserveLegacyExternalStorage,
|
||||
|
||||
Reference in New Issue
Block a user