diff options
-rw-r--r-- | res/values/colors.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 7 | ||||
-rw-r--r-- | src/com/android/settings/deviceinfo/Memory.java | 76 | ||||
-rw-r--r-- | src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java | 14 |
4 files changed, 97 insertions, 1 deletions
diff --git a/res/values/colors.xml b/res/values/colors.xml index d6e9150..e7a00c3 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -24,6 +24,7 @@ <color name="memory_downloads">#476093</color> <color name="memory_dcim">#793A7F</color> <color name="memory_music">#8E562A</color> + <color name="memory_cache">#479392</color> <color name="memory_misc">#7C3030</color> <color name="memory_user_light">#479392</color> <color name="memory_user_dark">#316665</color> diff --git a/res/values/strings.xml b/res/values/strings.xml index a6f40d3..d57d322 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1937,6 +1937,8 @@ <string name="memory_music_usage">Audio (music, ringtones, podcasts, etc.)</string> <!-- SD card & phone storage settings title. Displayed as a title when showing the total usage of misc files on the device. Below it will be a number like "123.4 MB" indicating used storage. [CHAR LIMIT=50] --> <string name="memory_media_misc_usage">Misc.</string> + <!-- Storage item representing all cached data on device. [CHAR LIMIT=48] --> + <string name="memory_media_cache_usage">Cached data</string> <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card. This will be done before the user phyiscally removes the SD card from the phone. Kind of like the "Safely remove" on some operating systems. [CHAR LIMIT=25] --> <string name="sd_eject" product="nosdcard">Unmount shared storage</string> <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card. This will be done before the user phyiscally removes the SD card from the phone. Kind of like the "Safely remove" on some operating systems. --> @@ -1971,6 +1973,11 @@ <string name="sd_format_summary" product="default">Erases all data on the SD card, such as music and photos</string> <!-- SD card status when it is mounted as read only. Will be appended to size, starts with an unbreakable space --> + <!-- Title of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] --> + <string name="memory_clear_cache_title">Clear cached data?</string> + <!-- Message of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] --> + <string name="memory_clear_cache_message">This will clear cached data for all apps.</string> + <!-- SD card & phone storage settings item summary that will result in the phone connected to PC and MTP/PTP enabled. [CHAR LIMIT=80] --> <string name="mtp_ptp_mode_summary">MTP or PTP function is active</string> diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java index 057f329..825a7be 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<PackageInfo> 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 44d40a0..1599ec7 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<StorageItemPreference> 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(); } |