Merge "Reset component enabled settings when clearing app data"

This commit is contained in:
Rhed Jao
2021-11-19 02:33:31 +00:00
committed by Android (Google) Code Review
9 changed files with 96 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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();
}

View File

@@ -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))

View File

@@ -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.

View File

@@ -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">

View File

@@ -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.

View File

@@ -223,6 +223,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag
AndroidPackage::isVendor,
AndroidPackage::isVisibleToInstantApps,
AndroidPackage::isVmSafeMode,
AndroidPackage::isResetEnabledSettingsOnAppDataCleared,
AndroidPackage::getMaxAspectRatio,
AndroidPackage::getMinAspectRatio,
AndroidPackage::hasPreserveLegacyExternalStorage,