Handle uninstall from notifications list

Don't crash in InstalledAppDetails on invalid app and finish app
notification details when the app goes away.

Bug: 22311566
Change-Id: I0bb7302dc16dd1a6f3aca152037705ad657d5554
This commit is contained in:
Jason Monk
2015-07-07 14:57:47 -04:00
parent 2bd619d5ed
commit 38f1889fea
2 changed files with 23 additions and 10 deletions

View File

@@ -379,6 +379,9 @@ public class InstalledAppDetails extends AppInfoBase
@Override @Override
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareOptionsMenu(Menu menu) {
if (mFinishing) {
return;
}
boolean showIt = true; boolean showIt = true;
if (mUpdatedSysApp) { if (mUpdatedSysApp) {
showIt = false; showIt = false;

View File

@@ -74,6 +74,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
private AppRow mAppRow; private AppRow mAppRow;
private boolean mCreated; private boolean mCreated;
private boolean mIsSystemPackage; private boolean mIsSystemPackage;
private int mUid;
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { 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) final String pkg = args != null && args.containsKey(AppInfoBase.ARG_PACKAGE_NAME)
? args.getString(AppInfoBase.ARG_PACKAGE_NAME) ? args.getString(AppInfoBase.ARG_PACKAGE_NAME)
: intent.getStringExtra(Settings.EXTRA_APP_PACKAGE); : 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) ? args.getInt(AppInfoBase.ARG_PACKAGE_UID)
: intent.getIntExtra(Settings.EXTRA_APP_UID, -1); : 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 + ", " Log.w(TAG, "Missing extras: " + Settings.EXTRA_APP_PACKAGE + " was " + pkg + ", "
+ Settings.EXTRA_APP_UID + " was " + uid); + Settings.EXTRA_APP_UID + " was " + mUid);
toastAndFinish(); toastAndFinish();
return; 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 PackageManager pm = getPackageManager();
final PackageInfo info = findPackageInfo(pm, pkg, uid); final PackageInfo info = findPackageInfo(pm, pkg, mUid);
if (info == null) { if (info == null) {
Log.w(TAG, "Failed to find package info: " + Settings.EXTRA_APP_PACKAGE + " was " + pkg 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(); toastAndFinish();
return; return;
} }
@@ -157,7 +158,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
if (banned) { if (banned) {
MetricsLogger.action(getActivity(), MetricsLogger.ACTION_BAN_APP_NOTES, pkg); 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) { if (success) {
updateDependents(banned); updateDependents(banned);
} }
@@ -169,7 +170,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean priority = (Boolean) 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 @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean peekable = (Boolean) 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 @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean sensitive = (Boolean) 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) { private void updateDependents(boolean banned) {
final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure( final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure(
UserHandle.myUserId()); UserHandle.myUserId());