Merge "Don't allow RRO uninstall if overlay is enabled"

This commit is contained in:
TreeHugger Robot
2019-04-01 22:48:16 +00:00
committed by Android (Google) Code Review
3 changed files with 95 additions and 2 deletions

View File

@@ -25,6 +25,8 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.om.OverlayManager;
import android.content.om.OverlayInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -103,6 +105,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
private final int mRequestRemoveDeviceAdmin;
private final DevicePolicyManager mDpm;
private final UserManager mUserManager;
private final OverlayManager mOverlayManager;
private final PackageManager mPm;
private final SettingsActivity mActivity;
private final InstrumentedPreferenceFragment mFragment;
@@ -136,6 +139,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
mPm = activity.getPackageManager();
mOverlayManager = activity.getSystemService(OverlayManager.class);
mPackageName = packageName;
mActivity = activity;
mFragment = fragment;
@@ -435,6 +439,28 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
enabled = false;
}
// Resource overlays can be uninstalled iff they are public
// (installed on /data) and disabled. ("Enabled" means they
// are in use by resource management.) If they are
// system/vendor, they can never be uninstalled. :-(
if (mAppEntry.info.isResourceOverlay()) {
if (isBundled) {
enabled = false;
} else {
String pkgName = mAppEntry.info.packageName;
UserHandle user = UserHandle.getUserHandleForUid(mAppEntry.info.uid);
OverlayInfo overlayInfo = mOverlayManager.getOverlayInfo(pkgName, user);
if (overlayInfo != null && overlayInfo.isEnabled()) {
ApplicationsState.AppEntry targetEntry =
mState.getEntry(overlayInfo.targetPackageName,
UserHandle.getUserId(mAppEntry.info.uid));
if (targetEntry != null) {
enabled = false;
}
}
}
}
mButtonsPref.setButton2Enabled(enabled);
}

View File

@@ -640,10 +640,18 @@ public class AppInfoDashboardFragment extends DashboardFragment
final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (mFinishing) {
return;
}
final String packageName = intent.getData().getSchemeSpecificPart();
if (!mFinishing && (mAppEntry == null || mAppEntry.info == null
|| TextUtils.equals(mAppEntry.info.packageName, packageName))) {
if (mAppEntry == null
|| mAppEntry.info == null
|| TextUtils.equals(mAppEntry.info.packageName, packageName)) {
onPackageRemoved();
} else if (mAppEntry.info.isResourceOverlay()
&& TextUtils.equals(mPackageInfo.overlayTarget, packageName)) {
refreshUi();
}
}
};