Loading res/layout/preference_memoryusage.xml +21 −2 Original line number Diff line number Diff line Loading @@ -20,8 +20,27 @@ android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingEnd="?android:attr/scrollbarSize" android:paddingStart="@*android:dimen/preference_widget_width"> android:paddingEnd="?android:attr/scrollbarSize"> <ImageView android:id="@+id/memory_usage_rescan_media" android:layout_width="48dip" android:layout_height="48dip" android:padding="6dp" android:layout_gravity="center" android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" android:src="@drawable/ic_menu_refresh_holo_dark" android:background="@*android:drawable/list_selector_holo_dark" android:contentDescription="@string/storage_rescan_media"/> <ProgressBar android:id="@+id/memory_usage_rescan_media_waiting" android:layout_width="48dip" android:layout_height="48dip" android:padding="6dp" android:layout_gravity="center" android:visibility="gone" android:indeterminateOnly="true"/> <com.android.settings.deviceinfo.PercentageBarChart android:id="@+id/percentage_bar_chart" Loading res/values/cm_strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -885,6 +885,8 @@ two in order to insert additional control points. \'Remove\' deletes the selecte <!-- USB Mass Storage --> <string name="usb_mass_storage_title">Mass storage (UMS)</string> <string name="usb_mass_storage_summary">Lets you transfer any files between your computer and your SD card by mounting it as a flash device</string> <string name="storage_rescan_media">Rescan media for the storage volume</string> <string name="storage_rescan_media_complete">Scan completed</string> <!-- WhisperPush --> <string name="whisperpush_title">WhisperPush</string> Loading src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java +61 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityThread; import android.app.DownloadManager; Loading @@ -25,28 +27,40 @@ import android.content.pm.IPackageManager; import android.content.pm.UserInfo; import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.OnScanCompletedListener; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.os.UserManager; import android.os.Environment.UserEnvironment; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.preference.Preference; import android.preference.PreferenceCategory; import android.provider.MediaStore; import android.text.format.Formatter; import android.util.Log; import android.widget.Toast; import com.android.settings.R; import com.android.settings.deviceinfo.StorageMeasurement.MeasurementDetails; import com.android.settings.deviceinfo.StorageMeasurement.MeasurementReceiver; import com.android.settings.deviceinfo.UsageBarPreference.OnRequestMediaRescanListener; import com.google.android.collect.Lists; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; public class StorageVolumePreferenceCategory extends PreferenceCategory { public class StorageVolumePreferenceCategory extends PreferenceCategory implements OnRequestMediaRescanListener, OnScanCompletedListener { public static final String TAG = "StorageVolumePreferenceCategory"; public static final String KEY_CACHE = "cache"; private static final int ORDER_USAGE_BAR = -2; Loading @@ -55,6 +69,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { /** Physical volume being measured, or {@code null} for internal. */ private final StorageVolume mVolume; private final StorageMeasurement mMeasure; private final boolean mIsInternal; private final boolean mIsPrimary; private final Resources mResources; private final StorageManager mStorageManager; Loading Loading @@ -121,6 +137,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { super(context); mVolume = volume; mIsInternal = mVolume == null; mIsPrimary = mVolume != null ? mVolume.isPrimary() : false; mMeasure = StorageMeasurement.getInstance(context, volume); mResources = context.getResources(); Loading Loading @@ -150,8 +168,17 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { final List<UserInfo> otherUsers = getUsersExcluding(currentUser); final boolean showUsers = mVolume == null && otherUsers.size() > 0; boolean allowMediaScan = false; if ((mIsInternal && Environment.isExternalStorageEmulated()) || mIsPrimary) { allowMediaScan = true; } else if (mVolume != null && !mVolume.isRemovable()) { allowMediaScan = true; } mUsageBarPreference = new UsageBarPreference(context); mUsageBarPreference.setOrder(ORDER_USAGE_BAR); mUsageBarPreference.setOnRequestMediaRescanListener(this); mUsageBarPreference.setAllowMediaScan(allowMediaScan); addPreference(mUsageBarPreference); mItemTotal = buildItem(R.string.memory_size, 0); Loading Loading @@ -477,4 +504,37 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { } return users; } @Override public void onRequestMediaRescan() { final int currentUser = ActivityManager.getCurrentUser(); final UserEnvironment currentEnv = new UserEnvironment(currentUser); File path = null; if ((mIsInternal && Environment.isExternalStorageEmulated()) || mIsPrimary) { path = currentEnv.getExternalStorageDirectory(); } else { path = mVolume.getPathFile(); } Log.d(TAG, "Request scan of " + path.getAbsolutePath()); MediaScannerConnection.scanFile( getContext(), new String[]{path.getAbsolutePath()}, null, this); } @Override public void onScanCompleted(String path, final Uri uri) { if (uri != null) { measure(); } ((Activity)getContext()).runOnUiThread(new Runnable() { @Override public void run() { mUsageBarPreference.notifyScanCompleted(); if (uri != null) { Toast.makeText(getContext(), R.string.storage_rescan_media_complete, Toast.LENGTH_SHORT).show(); } } }); } } src/com/android/settings/deviceinfo/UsageBarPreference.java +62 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,13 @@ package com.android.settings.deviceinfo; import android.content.Context; import android.os.Handler; import android.preference.Preference; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.ProgressBar; import com.android.settings.R; import com.google.android.collect.Lists; Loading @@ -31,23 +35,42 @@ import java.util.List; * Creates a percentage bar chart inside a preference. */ public class UsageBarPreference extends Preference { public interface OnRequestMediaRescanListener { void onRequestMediaRescan(); } private ImageView mRescanMedia = null; private ProgressBar mRescanMediaWaiting = null; private PercentageBarChart mChart = null; private boolean mAllowMediaScan; private OnRequestMediaRescanListener mOnRequestMediaRescanListener; private final List<PercentageBarChart.Entry> mEntries = Lists.newArrayList(); private Handler mHandler; public UsageBarPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutResource(R.layout.preference_memoryusage); init(); } public UsageBarPreference(Context context) { super(context); setLayoutResource(R.layout.preference_memoryusage); init(); } public UsageBarPreference(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setLayoutResource(R.layout.preference_memoryusage); mHandler = new Handler(); mAllowMediaScan = false; } public void addEntry(int order, float percentage, int color) { Loading @@ -55,12 +78,49 @@ public class UsageBarPreference extends Preference { Collections.sort(mEntries); } protected void setOnRequestMediaRescanListener(OnRequestMediaRescanListener listener) { mOnRequestMediaRescanListener = listener; } protected void setAllowMediaScan(boolean allow) { mAllowMediaScan = allow; notifyScanCompleted(); } protected void notifyScanCompleted() { if (mRescanMedia != null) { mRescanMedia.setVisibility(mAllowMediaScan ? View.VISIBLE : View.INVISIBLE); mRescanMediaWaiting.setVisibility(View.GONE); } } @Override protected void onBindView(View view) { super.onBindView(view); mChart = (PercentageBarChart) view.findViewById(R.id.percentage_bar_chart); mChart.setEntries(mEntries); mRescanMediaWaiting = (ProgressBar) view.findViewById(R.id.memory_usage_rescan_media_waiting); mRescanMedia = (ImageView) view.findViewById(R.id.memory_usage_rescan_media); mRescanMedia.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mOnRequestMediaRescanListener != null) { mRescanMedia.setVisibility(View.GONE); mRescanMediaWaiting.setVisibility(View.VISIBLE); mHandler.post(new Runnable() { @Override public void run() { mOnRequestMediaRescanListener.onRequestMediaRescan(); } }); } } }); notifyScanCompleted(); } public void commit() { Loading Loading
res/layout/preference_memoryusage.xml +21 −2 Original line number Diff line number Diff line Loading @@ -20,8 +20,27 @@ android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingEnd="?android:attr/scrollbarSize" android:paddingStart="@*android:dimen/preference_widget_width"> android:paddingEnd="?android:attr/scrollbarSize"> <ImageView android:id="@+id/memory_usage_rescan_media" android:layout_width="48dip" android:layout_height="48dip" android:padding="6dp" android:layout_gravity="center" android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" android:src="@drawable/ic_menu_refresh_holo_dark" android:background="@*android:drawable/list_selector_holo_dark" android:contentDescription="@string/storage_rescan_media"/> <ProgressBar android:id="@+id/memory_usage_rescan_media_waiting" android:layout_width="48dip" android:layout_height="48dip" android:padding="6dp" android:layout_gravity="center" android:visibility="gone" android:indeterminateOnly="true"/> <com.android.settings.deviceinfo.PercentageBarChart android:id="@+id/percentage_bar_chart" Loading
res/values/cm_strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -885,6 +885,8 @@ two in order to insert additional control points. \'Remove\' deletes the selecte <!-- USB Mass Storage --> <string name="usb_mass_storage_title">Mass storage (UMS)</string> <string name="usb_mass_storage_summary">Lets you transfer any files between your computer and your SD card by mounting it as a flash device</string> <string name="storage_rescan_media">Rescan media for the storage volume</string> <string name="storage_rescan_media_complete">Scan completed</string> <!-- WhisperPush --> <string name="whisperpush_title">WhisperPush</string> Loading
src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java +61 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityThread; import android.app.DownloadManager; Loading @@ -25,28 +27,40 @@ import android.content.pm.IPackageManager; import android.content.pm.UserInfo; import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.OnScanCompletedListener; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.os.UserManager; import android.os.Environment.UserEnvironment; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.preference.Preference; import android.preference.PreferenceCategory; import android.provider.MediaStore; import android.text.format.Formatter; import android.util.Log; import android.widget.Toast; import com.android.settings.R; import com.android.settings.deviceinfo.StorageMeasurement.MeasurementDetails; import com.android.settings.deviceinfo.StorageMeasurement.MeasurementReceiver; import com.android.settings.deviceinfo.UsageBarPreference.OnRequestMediaRescanListener; import com.google.android.collect.Lists; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; public class StorageVolumePreferenceCategory extends PreferenceCategory { public class StorageVolumePreferenceCategory extends PreferenceCategory implements OnRequestMediaRescanListener, OnScanCompletedListener { public static final String TAG = "StorageVolumePreferenceCategory"; public static final String KEY_CACHE = "cache"; private static final int ORDER_USAGE_BAR = -2; Loading @@ -55,6 +69,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { /** Physical volume being measured, or {@code null} for internal. */ private final StorageVolume mVolume; private final StorageMeasurement mMeasure; private final boolean mIsInternal; private final boolean mIsPrimary; private final Resources mResources; private final StorageManager mStorageManager; Loading Loading @@ -121,6 +137,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { super(context); mVolume = volume; mIsInternal = mVolume == null; mIsPrimary = mVolume != null ? mVolume.isPrimary() : false; mMeasure = StorageMeasurement.getInstance(context, volume); mResources = context.getResources(); Loading Loading @@ -150,8 +168,17 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { final List<UserInfo> otherUsers = getUsersExcluding(currentUser); final boolean showUsers = mVolume == null && otherUsers.size() > 0; boolean allowMediaScan = false; if ((mIsInternal && Environment.isExternalStorageEmulated()) || mIsPrimary) { allowMediaScan = true; } else if (mVolume != null && !mVolume.isRemovable()) { allowMediaScan = true; } mUsageBarPreference = new UsageBarPreference(context); mUsageBarPreference.setOrder(ORDER_USAGE_BAR); mUsageBarPreference.setOnRequestMediaRescanListener(this); mUsageBarPreference.setAllowMediaScan(allowMediaScan); addPreference(mUsageBarPreference); mItemTotal = buildItem(R.string.memory_size, 0); Loading Loading @@ -477,4 +504,37 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory { } return users; } @Override public void onRequestMediaRescan() { final int currentUser = ActivityManager.getCurrentUser(); final UserEnvironment currentEnv = new UserEnvironment(currentUser); File path = null; if ((mIsInternal && Environment.isExternalStorageEmulated()) || mIsPrimary) { path = currentEnv.getExternalStorageDirectory(); } else { path = mVolume.getPathFile(); } Log.d(TAG, "Request scan of " + path.getAbsolutePath()); MediaScannerConnection.scanFile( getContext(), new String[]{path.getAbsolutePath()}, null, this); } @Override public void onScanCompleted(String path, final Uri uri) { if (uri != null) { measure(); } ((Activity)getContext()).runOnUiThread(new Runnable() { @Override public void run() { mUsageBarPreference.notifyScanCompleted(); if (uri != null) { Toast.makeText(getContext(), R.string.storage_rescan_media_complete, Toast.LENGTH_SHORT).show(); } } }); } }
src/com/android/settings/deviceinfo/UsageBarPreference.java +62 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,13 @@ package com.android.settings.deviceinfo; import android.content.Context; import android.os.Handler; import android.preference.Preference; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.ProgressBar; import com.android.settings.R; import com.google.android.collect.Lists; Loading @@ -31,23 +35,42 @@ import java.util.List; * Creates a percentage bar chart inside a preference. */ public class UsageBarPreference extends Preference { public interface OnRequestMediaRescanListener { void onRequestMediaRescan(); } private ImageView mRescanMedia = null; private ProgressBar mRescanMediaWaiting = null; private PercentageBarChart mChart = null; private boolean mAllowMediaScan; private OnRequestMediaRescanListener mOnRequestMediaRescanListener; private final List<PercentageBarChart.Entry> mEntries = Lists.newArrayList(); private Handler mHandler; public UsageBarPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutResource(R.layout.preference_memoryusage); init(); } public UsageBarPreference(Context context) { super(context); setLayoutResource(R.layout.preference_memoryusage); init(); } public UsageBarPreference(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setLayoutResource(R.layout.preference_memoryusage); mHandler = new Handler(); mAllowMediaScan = false; } public void addEntry(int order, float percentage, int color) { Loading @@ -55,12 +78,49 @@ public class UsageBarPreference extends Preference { Collections.sort(mEntries); } protected void setOnRequestMediaRescanListener(OnRequestMediaRescanListener listener) { mOnRequestMediaRescanListener = listener; } protected void setAllowMediaScan(boolean allow) { mAllowMediaScan = allow; notifyScanCompleted(); } protected void notifyScanCompleted() { if (mRescanMedia != null) { mRescanMedia.setVisibility(mAllowMediaScan ? View.VISIBLE : View.INVISIBLE); mRescanMediaWaiting.setVisibility(View.GONE); } } @Override protected void onBindView(View view) { super.onBindView(view); mChart = (PercentageBarChart) view.findViewById(R.id.percentage_bar_chart); mChart.setEntries(mEntries); mRescanMediaWaiting = (ProgressBar) view.findViewById(R.id.memory_usage_rescan_media_waiting); mRescanMedia = (ImageView) view.findViewById(R.id.memory_usage_rescan_media); mRescanMedia.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mOnRequestMediaRescanListener != null) { mRescanMedia.setVisibility(View.GONE); mRescanMediaWaiting.setVisibility(View.VISIBLE); mHandler.post(new Runnable() { @Override public void run() { mOnRequestMediaRescanListener.onRequestMediaRescan(); } }); } } }); notifyScanCompleted(); } public void commit() { Loading