Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf897d71 authored by Jorge Ruesga's avatar Jorge Ruesga Committed by Gerrit Code Review
Browse files

Merge "Storage Settings: Allow user to trigger a volume rescan" into cm-11.0

parents f2eb6580 34f236ca
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -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"
+2 −0
Original line number Diff line number Diff line
@@ -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>
+61 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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();
@@ -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);
@@ -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();
                }
            }
        });
    }
}
+62 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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() {