Merge "Fix crash in Storage app info when the corresponding app is uninstalled in the background."
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 0725386..a37039f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -515,7 +515,7 @@
         if (resultTo == null) {
             context.startActivity(intent);
         } else {
-            resultTo.startActivityForResult(intent, resultRequestCode);
+            resultTo.getActivity().startActivityForResult(intent, resultRequestCode);
         }
     }
 
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 8a99e03..f7992cc 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -22,8 +22,10 @@
 import android.app.DialogFragment;
 import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -74,6 +76,7 @@
     protected static final int DLG_BASE = 0;
 
     protected boolean mFinishing;
+    protected boolean mListeningToPackageRemove;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -90,6 +93,7 @@
         mUsbManager = IUsbManager.Stub.asInterface(b);
 
         retrieveAppEntry();
+        startListeningToPackageRemove();
     }
 
     @Override
@@ -114,6 +118,7 @@
 
     @Override
     public void onDestroy() {
+        stopListeningToPackageRemove();
         mSession.release();
         super.onDestroy();
     }
@@ -246,4 +251,37 @@
             return dialogFragment;
         }
     }
+
+    protected void startListeningToPackageRemove() {
+        if (mListeningToPackageRemove) {
+            return;
+        }
+        mListeningToPackageRemove = true;
+        final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
+        filter.addDataScheme("package");
+        getContext().registerReceiver(mPackageRemovedReceiver, filter);
+    }
+
+    protected void stopListeningToPackageRemove() {
+        if (!mListeningToPackageRemove) {
+            return;
+        }
+        mListeningToPackageRemove = false;
+        getContext().unregisterReceiver(mPackageRemovedReceiver);
+    }
+
+    protected void onPackageRemoved() {
+        getActivity().finishAndRemoveTask();
+    }
+
+    protected final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String packageName = intent.getData().getSchemeSpecificPart();
+            if (!mFinishing && mAppEntry.info.packageName.equals(packageName)) {
+                onPackageRemoved();
+            }
+        }
+    };
+
 }
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 3f42293..1cf55a4 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -29,7 +29,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.Loader;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -165,8 +164,6 @@
     private Preference mMemoryPreference;
 
     private boolean mDisableAfterUninstall;
-    private boolean mListeningToPackageRemove;
-
     // Used for updating notification preference.
     private final NotificationBackend mBackend = new NotificationBackend();
 
@@ -326,7 +323,6 @@
             removePreference(KEY_DATA);
         }
         mBatteryHelper = new BatteryStatsHelper(getActivity(), true);
-        startListeningToPackageRemove();
     }
 
     @Override
@@ -362,7 +358,6 @@
     @Override
     public void onDestroy() {
         TrafficStats.closeQuietly(mStatsSession);
-        stopListeningToPackageRemove();
         super.onDestroy();
     }
 
@@ -742,7 +737,7 @@
         intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName);
         intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);
         try {
-            startActivity(intent);
+            getActivity().startActivityForResult(intent, SUB_INFO_FRAGMENT);
         } catch (ActivityNotFoundException e) {
             Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
         }
@@ -1090,6 +1085,12 @@
         return summary.toString();
     }
 
+    @Override
+    protected void onPackageRemoved() {
+        getActivity().finishActivity(SUB_INFO_FRAGMENT);
+        super.onPackageRemoved();
+    }
+
     private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> {
 
         @Override
@@ -1246,33 +1247,4 @@
             mPermissionsPreference.setSummary(summary);
         }
     };
-
-    private void startListeningToPackageRemove() {
-        if (mListeningToPackageRemove) {
-            return;
-        }
-        mListeningToPackageRemove = true;
-        final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
-        filter.addDataScheme("package");
-        getContext().registerReceiver(mPackageRemovedReceiver, filter);
-    }
-
-    private void stopListeningToPackageRemove() {
-        if (!mListeningToPackageRemove) {
-            return;
-        }
-        mListeningToPackageRemove = false;
-        getContext().unregisterReceiver(mPackageRemovedReceiver);
-    }
-
-    private final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String packageName = intent.getData().getSchemeSpecificPart();
-            if (!mFinishing && mAppEntry.info.packageName.equals(packageName)) {
-                getActivity().finishAndRemoveTask();
-            }
-        }
-    };
-
 }