From 0e9cf8a723c3e03207e905e8e03303ec4b5526dc Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Sun, 23 Sep 2012 17:40:47 -0700 Subject: [PATCH] Storage item to represent cached data. When touched, offers to clear all cached data. Bug: 7216370 Change-Id: I86afe66b819fb7deeba909bef507925fc5a590f3 --- res/values/colors.xml | 1 + res/values/strings.xml | 7 ++ .../android/settings/deviceinfo/Memory.java | 76 +++++++++++++++++++ .../StorageVolumePreferenceCategory.java | 14 +++- 4 files changed, 97 insertions(+), 1 deletion(-) diff --git a/res/values/colors.xml b/res/values/colors.xml index d6e915054b4..e7a00c335e1 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -24,6 +24,7 @@ #476093 #793A7F #8E562A + #479392 #7C3030 #479392 #316665 diff --git a/res/values/strings.xml b/res/values/strings.xml index a6f40d39c05..d57d3225856 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1937,6 +1937,8 @@ Audio (music, ringtones, podcasts, etc.) Misc. + + Cached data Unmount shared storage @@ -1971,6 +1973,11 @@ Erases all data on the SD card, such as music and photos + + Clear cached data? + + This will clear cached data for all apps. + MTP or PTP function is active diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java index 057f329786d..825a7be98a2 100644 --- a/src/com/android/settings/deviceinfo/Memory.java +++ b/src/com/android/settings/deviceinfo/Memory.java @@ -18,11 +18,15 @@ package com.android.settings.deviceinfo; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.IPackageDataObserver; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.Environment; @@ -48,6 +52,7 @@ import com.android.settings.Utils; import com.google.common.collect.Lists; import java.util.ArrayList; +import java.util.List; /** * Panel showing storage usage on disk for known {@link StorageVolume} returned @@ -56,6 +61,8 @@ import java.util.ArrayList; public class Memory extends SettingsPreferenceFragment { private static final String TAG = "MemorySettings"; + private static final String TAG_CONFIRM_CLEAR_CACHE = "confirmClearCache"; + private static final int DLG_CONFIRM_UNMOUNT = 1; private static final int DLG_ERROR_UNMOUNT = 2; @@ -202,6 +209,11 @@ public class Memory extends SettingsPreferenceFragment { @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (StorageVolumePreferenceCategory.KEY_CACHE.equals(preference.getKey())) { + ConfirmClearCacheFragment.show(this); + return true; + } + for (StorageVolumePreferenceCategory category : mCategories) { Intent intent = category.intentForClick(preference); if (intent != null) { @@ -339,4 +351,68 @@ public class Memory extends SettingsPreferenceFragment { // Not much can be done } } + + private void onCacheCleared() { + for (StorageVolumePreferenceCategory category : mCategories) { + category.onCacheCleared(); + } + } + + private static class ClearCacheObserver extends IPackageDataObserver.Stub { + private final Memory mTarget; + private int mRemaining; + + public ClearCacheObserver(Memory target, int remaining) { + mTarget = target; + mRemaining = remaining; + } + + @Override + public void onRemoveCompleted(final String packageName, final boolean succeeded) { + synchronized (this) { + if (--mRemaining == 0) { + mTarget.onCacheCleared(); + } + } + } + } + + /** + * Dialog to request user confirmation before clearing all cache data. + */ + public static class ConfirmClearCacheFragment extends DialogFragment { + public static void show(Memory parent) { + if (!parent.isAdded()) return; + + final ConfirmClearCacheFragment dialog = new ConfirmClearCacheFragment(); + dialog.setTargetFragment(parent, 0); + dialog.show(parent.getFragmentManager(), TAG_CONFIRM_CLEAR_CACHE); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.memory_clear_cache_title); + builder.setMessage(getString(R.string.memory_clear_cache_message)); + + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final Memory target = (Memory) getTargetFragment(); + final PackageManager pm = context.getPackageManager(); + final List infos = pm.getInstalledPackages(0); + final ClearCacheObserver observer = new ClearCacheObserver( + target, infos.size()); + for (PackageInfo info : infos) { + pm.deleteApplicationCacheFiles(info.packageName, observer); + } + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + + return builder.create(); + } + } } diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java index 44d40a0878c..1599ec7e9ee 100644 --- a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java +++ b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java @@ -46,6 +46,8 @@ import java.util.Iterator; import java.util.List; public class StorageVolumePreferenceCategory extends PreferenceCategory { + public static final String KEY_CACHE = "cache"; + private static final int ORDER_USAGE_BAR = -2; private static final int ORDER_STORAGE_LOW = -1; @@ -68,6 +70,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { private StorageItemPreference mItemDcim; private StorageItemPreference mItemMusic; private StorageItemPreference mItemDownloads; + private StorageItemPreference mItemCache; private StorageItemPreference mItemMisc; private List mItemUsers = Lists.newArrayList(); @@ -157,8 +160,11 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { mItemDcim = buildItem(R.string.memory_dcim_usage, R.color.memory_dcim); mItemMusic = buildItem(R.string.memory_music_usage, R.color.memory_music); mItemDownloads = buildItem(R.string.memory_downloads_usage, R.color.memory_downloads); + mItemCache = buildItem(R.string.memory_media_cache_usage, R.color.memory_cache); mItemMisc = buildItem(R.string.memory_media_misc_usage, R.color.memory_misc); + mItemCache.setKey(KEY_CACHE); + final boolean showDetails = mVolume == null || mVolume.isPrimary(); if (showDetails) { if (showUsers) { @@ -169,6 +175,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { addPreference(mItemDcim); addPreference(mItemMusic); addPreference(mItemDownloads); + addPreference(mItemCache); addPreference(mItemMisc); if (showUsers) { @@ -314,7 +321,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { // Count caches as available space, since system manages them mItemTotal.setSummary(formatSize(details.totalSize)); - mItemAvailable.setSummary(formatSize(details.availSize + details.cacheSize)); + mItemAvailable.setSummary(formatSize(details.availSize)); mUsageBarPreference.clear(); @@ -332,6 +339,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { final long downloadsSize = totalValues(details.mediaSize, Environment.DIRECTORY_DOWNLOADS); updatePreference(mItemDownloads, downloadsSize); + updatePreference(mItemCache, details.cacheSize); updatePreference(mItemMisc, details.miscSize); for (StorageItemPreference userPref : mItemUsers) { @@ -376,6 +384,10 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { measure(); } + public void onCacheCleared() { + measure(); + } + public void onPause() { mMeasure.cleanUp(); }