OSDN Git Service

Handle uninstall from notifications list
authorJason Monk <jmonk@google.com>
Tue, 7 Jul 2015 18:57:47 +0000 (14:57 -0400)
committerJason Monk <jmonk@google.com>
Tue, 7 Jul 2015 18:57:47 +0000 (14:57 -0400)
Don't crash in InstalledAppDetails on invalid app and finish app
notification details when the app goes away.

Bug: 22311566
Change-Id: I0bb7302dc16dd1a6f3aca152037705ad657d5554

src/com/android/settings/applications/InstalledAppDetails.java
src/com/android/settings/notification/AppNotificationSettings.java

index 94705d2..0ab9610 100755 (executable)
@@ -379,6 +379,9 @@ public class InstalledAppDetails extends AppInfoBase
 
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
+        if (mFinishing) {
+            return;
+        }
         boolean showIt = true;
         if (mUpdatedSysApp) {
             showIt = false;
index 8e995fe..2ed6d85 100644 (file)
@@ -74,6 +74,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
     private AppRow mAppRow;
     private boolean mCreated;
     private boolean mIsSystemPackage;
+    private int mUid;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
@@ -110,22 +111,22 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
         final String pkg = args != null && args.containsKey(AppInfoBase.ARG_PACKAGE_NAME)
                 ? args.getString(AppInfoBase.ARG_PACKAGE_NAME)
                 : intent.getStringExtra(Settings.EXTRA_APP_PACKAGE);
-        final int uid = args != null && args.containsKey(AppInfoBase.ARG_PACKAGE_UID)
+        mUid = args != null && args.containsKey(AppInfoBase.ARG_PACKAGE_UID)
                 ? args.getInt(AppInfoBase.ARG_PACKAGE_UID)
                 : intent.getIntExtra(Settings.EXTRA_APP_UID, -1);
-        if (uid == -1 || TextUtils.isEmpty(pkg)) {
+        if (mUid == -1 || TextUtils.isEmpty(pkg)) {
             Log.w(TAG, "Missing extras: " + Settings.EXTRA_APP_PACKAGE + " was " + pkg + ", "
-                    + Settings.EXTRA_APP_UID + " was " + uid);
+                    + Settings.EXTRA_APP_UID + " was " + mUid);
             toastAndFinish();
             return;
         }
 
-        if (DEBUG) Log.d(TAG, "Load details for pkg=" + pkg + " uid=" + uid);
+        if (DEBUG) Log.d(TAG, "Load details for pkg=" + pkg + " uid=" + mUid);
         final PackageManager pm = getPackageManager();
-        final PackageInfo info = findPackageInfo(pm, pkg, uid);
+        final PackageInfo info = findPackageInfo(pm, pkg, mUid);
         if (info == null) {
             Log.w(TAG, "Failed to find package info: " + Settings.EXTRA_APP_PACKAGE + " was " + pkg
-                    + ", " + Settings.EXTRA_APP_UID + " was " + uid);
+                    + ", " + Settings.EXTRA_APP_UID + " was " + mUid);
             toastAndFinish();
             return;
         }
@@ -157,7 +158,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
                 if (banned) {
                     MetricsLogger.action(getActivity(), MetricsLogger.ACTION_BAN_APP_NOTES, pkg);
                 }
-                final boolean success =  mBackend.setNotificationsBanned(pkg, uid, banned);
+                final boolean success =  mBackend.setNotificationsBanned(pkg, mUid, banned);
                 if (success) {
                     updateDependents(banned);
                 }
@@ -169,7 +170,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
                 final boolean priority = (Boolean) newValue;
-                return mBackend.setHighPriority(pkg, uid, priority);
+                return mBackend.setHighPriority(pkg, mUid, priority);
             }
         });
 
@@ -177,7 +178,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
                 final boolean peekable = (Boolean) newValue;
-                return mBackend.setPeekable(pkg, uid, peekable);
+                return mBackend.setPeekable(pkg, mUid, peekable);
             }
         });
 
@@ -185,7 +186,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
                 final boolean sensitive = (Boolean) newValue;
-                return mBackend.setSensitive(pkg, uid, sensitive);
+                return mBackend.setSensitive(pkg, mUid, sensitive);
             }
         });
 
@@ -203,6 +204,15 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
         }
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (mUid != -1 && getPackageManager().getPackagesForUid(mUid) == null) {
+            // App isn't around anymore, must have been removed.
+            finish();
+        }
+    }
+
     private void updateDependents(boolean banned) {
         final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure(
                 UserHandle.myUserId());