Merge "Fix crash when selecting AppInfo for uninstalled app from Recents." into nyc-mr1-dev

This commit is contained in:
Doris Ling
2016-08-23 01:51:21 +00:00
committed by Android (Google) Code Review
3 changed files with 64 additions and 17 deletions

View File

@@ -515,7 +515,7 @@ public final class Utils extends com.android.settingslib.Utils {
if (resultTo == null) { if (resultTo == null) {
context.startActivity(intent); context.startActivity(intent);
} else { } else {
resultTo.startActivityForResult(intent, resultRequestCode); resultTo.getActivity().startActivityForResult(intent, resultRequestCode);
} }
} }

View File

@@ -22,8 +22,10 @@ import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.app.Fragment; import android.app.Fragment;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
@@ -74,6 +76,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
protected static final int DLG_BASE = 0; protected static final int DLG_BASE = 0;
protected boolean mFinishing; protected boolean mFinishing;
protected boolean mListeningToPackageRemove;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -90,6 +93,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
mUsbManager = IUsbManager.Stub.asInterface(b); mUsbManager = IUsbManager.Stub.asInterface(b);
retrieveAppEntry(); retrieveAppEntry();
startListeningToPackageRemove();
} }
@Override @Override
@@ -114,6 +118,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
@Override @Override
public void onDestroy() { public void onDestroy() {
stopListeningToPackageRemove();
mSession.release(); mSession.release();
super.onDestroy(); super.onDestroy();
} }
@@ -246,4 +251,37 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
return dialogFragment; 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();
}
}
};
} }

View File

@@ -483,21 +483,22 @@ public class InstalledAppDetails extends AppInfoBase
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_UNINSTALL) { switch (requestCode) {
if (mDisableAfterUninstall) { case REQUEST_UNINSTALL:
mDisableAfterUninstall = false; if (mDisableAfterUninstall) {
new DisableChanger(this, mAppEntry.info, mDisableAfterUninstall = false;
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) new DisableChanger(this, mAppEntry.info,
.execute((Object)null); PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
} .execute((Object)null);
if (!refreshUi()) { }
setIntentAndFinish(true, true); // continue with following operations
} case REQUEST_REMOVE_DEVICE_ADMIN:
} if (!refreshUi()) {
if (requestCode == REQUEST_REMOVE_DEVICE_ADMIN) { setIntentAndFinish(true, true);
if (!refreshUi()) { } else {
setIntentAndFinish(true, true); startListeningToPackageRemove();
} }
break;
} }
} }
@@ -675,6 +676,7 @@ public class InstalledAppDetails extends AppInfoBase
} }
private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) {
stopListeningToPackageRemove();
// Create new intent to launch Uninstaller activity // Create new intent to launch Uninstaller activity
Uri packageURI = Uri.parse("package:"+packageName); Uri packageURI = Uri.parse("package:"+packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
@@ -730,7 +732,7 @@ public class InstalledAppDetails extends AppInfoBase
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName);
intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);
try { try {
startActivity(intent); getActivity().startActivityForResult(intent, SUB_INFO_FRAGMENT);
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
} }
@@ -764,6 +766,7 @@ public class InstalledAppDetails extends AppInfoBase
String packageName = mAppEntry.info.packageName; String packageName = mAppEntry.info.packageName;
if (v == mUninstallButton) { if (v == mUninstallButton) {
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
stopListeningToPackageRemove();
Activity activity = getActivity(); Activity activity = getActivity();
Intent uninstallDAIntent = new Intent(activity, DeviceAdminAdd.class); Intent uninstallDAIntent = new Intent(activity, DeviceAdminAdd.class);
uninstallDAIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, uninstallDAIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME,
@@ -1077,6 +1080,12 @@ public class InstalledAppDetails extends AppInfoBase
return summary.toString(); return summary.toString();
} }
@Override
protected void onPackageRemoved() {
getActivity().finishActivity(SUB_INFO_FRAGMENT);
super.onPackageRemoved();
}
private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> { private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> {
@Override @Override