summaryrefslogtreecommitdiff
path: root/packages/PackageInstaller/src
diff options
context:
space:
mode:
authorPhilip P. Moltmann <moltmann@google.com>2018-12-10 17:02:35 -0800
committerPhilip P. Moltmann <moltmann@google.com>2018-12-11 21:06:03 +0000
commit38ea50c63e8a031a6430d26b1f5b561402007243 (patch)
tree5d379367773a7330a346b076e00b3a30e7484ac7 /packages/PackageInstaller/src
parentb4815ebf76d734d46ae3d03e97e0544ebb6d99e2 (diff)
Checkbox for removing contributes files
Apps might have contributed files. During uninstall the files are usually left on the system. To avoid filling up the storage we allow the user to delete the files during uninstall. Bug: 112002130 Test: Uninstalled an app that contributed files Change-Id: I7e71ed524055bdda91ce9e66f995540363ceb229
Diffstat (limited to 'packages/PackageInstaller/src')
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java11
-rwxr-xr-xpackages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java12
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java64
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/television/UninstallAlertFragment.java2
4 files changed, 80 insertions, 9 deletions
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
index 1c0aec18dd30..d13bb65604af 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
@@ -50,6 +50,8 @@ public class UninstallUninstalling extends Activity implements
"com.android.packageinstaller.ACTION_UNINSTALL_COMMIT";
static final String EXTRA_APP_LABEL = "com.android.packageinstaller.extra.APP_LABEL";
+ static final String EXTRA_CLEAR_CONTRIBUTED_FILES =
+ "com.android.packageinstaller.extra.CLEAR_CONTRIBUTED_FILES";
private int mUninstallId;
private ApplicationInfo mAppInfo;
@@ -72,6 +74,8 @@ public class UninstallUninstalling extends Activity implements
if (savedInstanceState == null) {
boolean allUsers = getIntent().getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS,
false);
+ boolean clearContributedFiles = getIntent().getBooleanExtra(
+ EXTRA_CLEAR_CONTRIBUTED_FILES, false);
UserHandle user = getIntent().getParcelableExtra(Intent.EXTRA_USER);
// Show dialog, which is the whole UI
@@ -95,12 +99,15 @@ public class UninstallUninstalling extends Activity implements
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, mUninstallId,
broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ int flags = allUsers ? PackageManager.DELETE_ALL_USERS : 0;
+ flags |= clearContributedFiles ? PackageManager.DELETE_CONTRIBUTED_MEDIA : 0;
+
try {
ActivityThread.getPackageManager().getPackageInstaller().uninstall(
new VersionedPackage(mAppInfo.packageName,
PackageManager.VERSION_CODE_HIGHEST),
- getPackageName(), allUsers ? PackageManager.DELETE_ALL_USERS : 0,
- pendingIntent.getIntentSender(), user.getIdentifier());
+ getPackageName(), flags, pendingIntent.getIntentSender(),
+ user.getIdentifier());
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
index 1a01dc019bf7..0fa8c9a688c7 100755
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
@@ -285,7 +285,7 @@ public class UninstallerActivity extends Activity {
fragment.show(ft, "dialog");
}
- public void startUninstallProgress() {
+ public void startUninstallProgress(boolean clearContributedFiles) {
boolean returnResult = getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false);
CharSequence label = mDialogInfo.appInfo.loadSafeLabel(getPackageManager());
@@ -310,6 +310,8 @@ public class UninstallerActivity extends Activity {
newIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, mDialogInfo.allUsers);
newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mDialogInfo.appInfo);
newIntent.putExtra(UninstallUninstalling.EXTRA_APP_LABEL, label);
+ newIntent.putExtra(UninstallUninstalling.EXTRA_CLEAR_CONTRIBUTED_FILES,
+ clearContributedFiles);
newIntent.putExtra(PackageInstaller.EXTRA_CALLBACK, mDialogInfo.callback);
if (returnResult) {
@@ -358,12 +360,14 @@ public class UninstallerActivity extends Activity {
try {
Log.i(TAG, "Uninstalling extras=" + broadcastIntent.getExtras());
+ int flags = mDialogInfo.allUsers ? PackageManager.DELETE_ALL_USERS : 0;
+ flags |= clearContributedFiles ? PackageManager.DELETE_CONTRIBUTED_MEDIA : 0;
+
ActivityThread.getPackageManager().getPackageInstaller().uninstall(
new VersionedPackage(mDialogInfo.appInfo.packageName,
PackageManager.VERSION_CODE_HIGHEST),
- getPackageName(), mDialogInfo.allUsers
- ? PackageManager.DELETE_ALL_USERS : 0,
- pendingIntent.getIntentSender(), mDialogInfo.user.getIdentifier());
+ getPackageName(), flags, pendingIntent.getIntentSender(),
+ mDialogInfo.user.getIdentifier());
} catch (Exception e) {
notificationManager.cancel(uninstallId);
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
index e0ca74eb99c9..e4e12759211d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
@@ -16,6 +16,9 @@
package com.android.packageinstaller.handheld;
+import static android.text.format.Formatter.formatFileSize;
+
+import android.annotation.NonNull;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
@@ -24,14 +27,41 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.Bundle;
+import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.MediaStore;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
import com.android.packageinstaller.R;
import com.android.packageinstaller.UninstallerActivity;
+import java.io.IOException;
+import java.util.List;
+
public class UninstallAlertDialogFragment extends DialogFragment implements
DialogInterface.OnClickListener {
+ private CheckBox mClearContributedFiles;
+
+ /**
+ * Get number of bytes of the combined files contributed by the package.
+ *
+ * @param pkg The package that might have contibuted files.
+ * @param user The user the package belongs to.
+ *
+ * @return The number of bytes.
+ */
+ private long getContributedMediaSize(@NonNull String pkg, @NonNull UserHandle user) {
+ try {
+ return MediaStore.getContributedMediaSize(getContext(), pkg, user);
+ } catch (IOException e) {
+ return 0;
+ }
+ }
+
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final PackageManager pm = getActivity().getPackageManager();
@@ -76,14 +106,44 @@ public class UninstallAlertDialogFragment extends DialogFragment implements
dialogBuilder.setTitle(appLabel);
dialogBuilder.setPositiveButton(android.R.string.ok, this);
dialogBuilder.setNegativeButton(android.R.string.cancel, this);
- dialogBuilder.setMessage(messageBuilder.toString());
+
+ String pkg = dialogInfo.appInfo.packageName;
+ long contributedFileSize = 0;
+ if (dialogInfo.allUsers) {
+ List<UserInfo> users = userManager.getUsers();
+
+ int numUsers = users.size();
+ for (int i = 0; i < numUsers; i++) {
+ UserHandle user = UserHandle.of(users.get(i).id);
+
+ contributedFileSize += getContributedMediaSize(pkg, user);
+ }
+ } else {
+ contributedFileSize = getContributedMediaSize(pkg, dialogInfo.user);
+ }
+
+ if (contributedFileSize == 0) {
+ dialogBuilder.setMessage(messageBuilder.toString());
+ } else {
+ LayoutInflater inflater = getContext().getSystemService(LayoutInflater.class);
+ ViewGroup content = (ViewGroup) inflater.inflate(R.layout.uninstall_content_view, null);
+
+ ((TextView) content.requireViewById(R.id.message)).setText(messageBuilder.toString());
+ mClearContributedFiles = content.requireViewById(R.id.checkbox);
+ mClearContributedFiles.setText(getString(R.string.uninstall_remove_contributed_files,
+ formatFileSize(getContext(), contributedFileSize)));
+
+ dialogBuilder.setView(content);
+ }
+
return dialogBuilder.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == Dialog.BUTTON_POSITIVE) {
- ((UninstallerActivity) getActivity()).startUninstallProgress();
+ ((UninstallerActivity) getActivity()).startUninstallProgress(
+ mClearContributedFiles != null && mClearContributedFiles.isChecked());
} else {
((UninstallerActivity) getActivity()).dispatchAborted();
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/television/UninstallAlertFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/television/UninstallAlertFragment.java
index 828e5dbcfe5b..21d25f5b030f 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/television/UninstallAlertFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/television/UninstallAlertFragment.java
@@ -99,7 +99,7 @@ public class UninstallAlertFragment extends GuidedStepFragment {
public void onGuidedActionClicked(GuidedAction action) {
if (isAdded()) {
if (action.getId() == GuidedAction.ACTION_ID_OK) {
- ((UninstallerActivity) getActivity()).startUninstallProgress();
+ ((UninstallerActivity) getActivity()).startUninstallProgress(false);
getActivity().finish();
} else {
((UninstallerActivity) getActivity()).dispatchAborted();