Merge "Reset component enabled settings when clearing app data"
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