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();
}