diff --git a/res/values/strings.xml b/res/values/strings.xml index f533d89565a..76f573ffa57 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7598,4 +7598,10 @@ %1$s + + Remove %1$s from your device. + + + Remove + diff --git a/src/com/android/settings/deletionhelper/ConfirmDeletionDialog.java b/src/com/android/settings/deletionhelper/ConfirmDeletionDialog.java new file mode 100644 index 00000000000..fc6033e9341 --- /dev/null +++ b/src/com/android/settings/deletionhelper/ConfirmDeletionDialog.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.deletionhelper; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.text.format.Formatter; +import com.android.settings.R; + +/** + * Fragment used to confirm that the user wishes to delete a certain amount of data. + */ +public class ConfirmDeletionDialog extends DialogFragment implements + DialogInterface.OnClickListener { + public static final String TAG = "ConfirmDeletionDialog"; + private static final String ARG_TOTAL_SPACE = "total_freeable"; + + public static ConfirmDeletionDialog newInstance(long freeableBytes) { + Bundle args = new Bundle(1); + args.putLong(ARG_TOTAL_SPACE, freeableBytes); + + ConfirmDeletionDialog dialog = new ConfirmDeletionDialog(); + dialog.setArguments(args); + + return dialog; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Bundle args = getArguments(); + long totalFreeableSpace = args.getLong(ARG_TOTAL_SPACE); + + final Context context = getContext(); + return new AlertDialog.Builder(context) + .setMessage(context.getString(R.string.deletion_helper_clear_dialog_message, + Formatter.formatFileSize(context, totalFreeableSpace))) + .setPositiveButton(R.string.deletion_helper_clear_dialog_remove, this) + .setNegativeButton(android.R.string.cancel, null) + .create(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + ((DeletionHelperFragment) getTargetFragment()).clearData(); + } +} diff --git a/src/com/android/settings/deletionhelper/DeletionHelperFragment.java b/src/com/android/settings/deletionhelper/DeletionHelperFragment.java index b4c03e728bf..cc1a084e20e 100644 --- a/src/com/android/settings/deletionhelper/DeletionHelperFragment.java +++ b/src/com/android/settings/deletionhelper/DeletionHelperFragment.java @@ -46,7 +46,8 @@ import java.util.HashSet; */ public class DeletionHelperFragment extends SettingsPreferenceFragment implements ApplicationsState.Callbacks, AppStateBaseBridge.Callback, - Preference.OnPreferenceChangeListener, DeletionType.FreeableChangedListener { + Preference.OnPreferenceChangeListener, DeletionType.FreeableChangedListener, + View.OnClickListener { private static final String TAG = "DeletionHelperFragment"; private static final String EXTRA_HAS_BRIDGE = "hasBridge"; @@ -108,53 +109,11 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement private void initializeButtons(View v) { mCancel = (Button) v.findViewById(R.id.back_button); mCancel.setText(R.string.cancel); - mCancel.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finishFragment(); - } - }); + mCancel.setOnClickListener(this); mFree = (Button) v.findViewById(R.id.next_button); mFree.setText(R.string.storage_menu_free); - mFree.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // This should be fine as long as there is only one extra deletion feature. - // In the future, this should be done in an async queue in order to not interfere - // with the simultaneous PackageDeletionTask. - if (mPhotoPreference != null && mPhotoPreference.isChecked()) { - mPhotoVideoDeletion.clearFreeableData(); - } - if (mDownloadsPreference != null && mDownloadsPreference.isChecked()) { - mDownloadsDeletion.clearFreeableData(); - } - - ArraySet apps = new ArraySet<>(); - for (AppEntry entry : mAppEntries) { - if (mCheckedApplications.contains(entry.label)) { - synchronized (entry) { - apps.add(entry.info.packageName); - } - } - } - // TODO: If needed, add an action on the callback. - PackageDeletionTask task = new PackageDeletionTask( - getActivity().getPackageManager(), apps, - new PackageDeletionTask.Callback() { - @Override - public void onSuccess() { - } - - @Override - public void onError() { - Log.e(TAG, "An error occurred while uninstalling packages."); - } - }); - finishFragment(); - task.run(); - } - }); + mFree.setOnClickListener(this); } private void initializeDeletionPreferences() { @@ -329,6 +288,54 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement updateFreeButtonText(); } + @Override + public void onClick(View v) { + if (v.getId() == mFree.getId()) { + ConfirmDeletionDialog dialog = + ConfirmDeletionDialog.newInstance(getTotalFreeableSpace()); + // The 0 is a placeholder for an optional result code. + dialog.setTargetFragment(this, 0); + dialog.show(getFragmentManager(), ConfirmDeletionDialog.TAG); + } else { + finishFragment(); + } + } + + /** + * Clears out the selected apps and data from the device and closes the fragment. + */ + protected void clearData() { + // This should be fine as long as there is only one extra deletion feature. + // In the future, this should be done in an async queue in order to not + // interfere with the simultaneous PackageDeletionTask. + if (mPhotoPreference != null && mPhotoPreference.isChecked()) { + mPhotoVideoDeletion.clearFreeableData(); + } + + ArraySet apps = new ArraySet<>(); + for (AppEntry entry : mAppEntries) { + if (mCheckedApplications.contains(entry.label)) { + synchronized (entry) { + apps.add(entry.info.packageName); + } + } + } + // TODO: If needed, add an action on the callback. + PackageDeletionTask task = new PackageDeletionTask(getActivity().getPackageManager(), apps, + new PackageDeletionTask.Callback() { + @Override + public void onSuccess() { + } + + @Override + public void onError() { + Log.e(TAG, "An error occurred while uninstalling packages."); + } + }); + task.run(); + finishFragment(); + } + private long getTotalFreeableSpace() { long freeableSpace = 0; if (mAppEntries != null) {