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

Commit 96c2f8c5 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Progress towards split storage categories.

Cleans up StorageVolumePreferenceCategory creation, and uses new
isPrimary() API instead of passing around hacky "i == 0" derived
value.

Bug: 7003520
Change-Id: I9eb7164035b5368ee795e35b22e750aebbf3b159
parent 88220b72
Loading
Loading
Loading
Loading
+48 −58
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Environment;
@@ -46,30 +45,32 @@ import android.widget.Toast;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.google.common.collect.Lists;

import java.util.ArrayList;

/**
 * Panel showing storage usage on disk for known {@link StorageVolume} returned
 * by {@link StorageManager}. Calculates and displays usage of data types.
 */
public class Memory extends SettingsPreferenceFragment {
    private static final String TAG = "MemorySettings";

    private static final int DLG_CONFIRM_UNMOUNT = 1;
    private static final int DLG_ERROR_UNMOUNT = 2;

    private Resources mResources;

    // The mountToggle Preference that has last been clicked.
    // Assumes no two successive unmount event on 2 different volumes are performed before the first
    // one's preference is disabled
    private static Preference mLastClickedMountToggle;
    private static String mClickedMountPoint;
    private static Preference sLastClickedMountToggle;
    private static String sClickedMountPoint;

    // Access using getMountService()
    private IMountService mMountService = null;

    private StorageManager mStorageManager = null;

    private UsbManager mUsbManager = null;

    private StorageVolumePreferenceCategory mInternalStorageVolumePreferenceCategory;
    private StorageVolumePreferenceCategory[] mStorageVolumePreferenceCategories;
    private ArrayList<StorageVolumePreferenceCategory> mCategories = Lists.newArrayList();

    @Override
    public void onCreate(Bundle icicle) {
@@ -84,32 +85,29 @@ public class Memory extends SettingsPreferenceFragment {

        addPreferencesFromResource(R.xml.device_info_memory);

        mResources = getResources();

        if (!Environment.isExternalStorageEmulated()) {
            // External storage is separate from internal storage; need to
            // show internal storage as a separate item.
            mInternalStorageVolumePreferenceCategory = new StorageVolumePreferenceCategory(
                    getActivity(), mResources, null, mStorageManager, false);
            getPreferenceScreen().addPreference(mInternalStorageVolumePreferenceCategory);
            mInternalStorageVolumePreferenceCategory.init();
            addCategoryForVolume(null);
        }

        StorageVolume[] storageVolumes = mStorageManager.getVolumeList();
        int length = storageVolumes.length;
        mStorageVolumePreferenceCategories = new StorageVolumePreferenceCategory[length];
        for (int i = 0; i < length; i++) {
            StorageVolume storageVolume = storageVolumes[i];
            boolean isPrimary = i == 0;
            mStorageVolumePreferenceCategories[i] = new StorageVolumePreferenceCategory(
                    getActivity(), mResources, storageVolume, mStorageManager, isPrimary);
            getPreferenceScreen().addPreference(mStorageVolumePreferenceCategories[i]);
            mStorageVolumePreferenceCategories[i].init();
        final StorageVolume[] storageVolumes = mStorageManager.getVolumeList();
        for (StorageVolume volume : storageVolumes) {
            addCategoryForVolume(volume);
        }

        setHasOptionsMenu(true);
    }

    private void addCategoryForVolume(StorageVolume volume) {
        final StorageVolumePreferenceCategory category = new StorageVolumePreferenceCategory(
                getActivity(), volume, mStorageManager);
        // TODO: if primary emulated storage, then insert split items
        mCategories.add(category);
        getPreferenceScreen().addPreference(category);
        category.init();
    }

    private boolean isMassStorageEnabled() {
        // mass storage is enabled if primary volume supports it
        final StorageVolume[] storageVolumes = mStorageManager.getVolumeList();
@@ -128,11 +126,8 @@ public class Memory extends SettingsPreferenceFragment {
        intentFilter.addAction(UsbManager.ACTION_USB_STATE);
        getActivity().registerReceiver(mMediaScannerReceiver, intentFilter);

        if (mInternalStorageVolumePreferenceCategory != null) {
            mInternalStorageVolumePreferenceCategory.onResume();
        }
        for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
            mStorageVolumePreferenceCategories[i].onResume();
        for (StorageVolumePreferenceCategory category : mCategories) {
            category.onResume();
        }
    }

@@ -141,10 +136,10 @@ public class Memory extends SettingsPreferenceFragment {
        public void onStorageStateChanged(String path, String oldState, String newState) {
            Log.i(TAG, "Received storage state changed notification that " + path +
                    " changed state from " + oldState + " to " + newState);
            for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
                StorageVolumePreferenceCategory svpc = mStorageVolumePreferenceCategories[i];
                if (path.equals(svpc.getStorageVolume().getPath())) {
                    svpc.onStorageStateChanged();
            for (StorageVolumePreferenceCategory category : mCategories) {
                final StorageVolume volume = category.getStorageVolume();
                if (volume != null && path.equals(volume.getPath())) {
                    category.onStorageStateChanged();
                    break;
                }
            }
@@ -155,11 +150,8 @@ public class Memory extends SettingsPreferenceFragment {
    public void onPause() {
        super.onPause();
        getActivity().unregisterReceiver(mMediaScannerReceiver);
        if (mInternalStorageVolumePreferenceCategory != null) {
            mInternalStorageVolumePreferenceCategory.onPause();
        }
        for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
            mStorageVolumePreferenceCategories[i].onPause();
        for (StorageVolumePreferenceCategory category : mCategories) {
            category.onPause();
        }
    }

@@ -214,9 +206,8 @@ public class Memory extends SettingsPreferenceFragment {

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
            StorageVolumePreferenceCategory svpc = mStorageVolumePreferenceCategories[i];
            Intent intent = svpc.intentForClick(preference);
        for (StorageVolumePreferenceCategory category : mCategories) {
            Intent intent = category.intentForClick(preference);
            if (intent != null) {
                // Don't go across app boundary if monkey is running
                if (!Utils.isMonkeyRunning()) {
@@ -225,11 +216,11 @@ public class Memory extends SettingsPreferenceFragment {
                return true;
            }

            if (svpc.mountToggleClicked(preference)) {
                mLastClickedMountToggle = preference;
                final StorageVolume storageVolume = svpc.getStorageVolume();
                mClickedMountPoint = storageVolume.getPath();
                String state = mStorageManager.getVolumeState(storageVolume.getPath());
            final StorageVolume volume = category.getStorageVolume();
            if (volume != null && category.mountToggleClicked(preference)) {
                sLastClickedMountToggle = preference;
                sClickedMountPoint = volume.getPath();
                String state = mStorageManager.getVolumeState(volume.getPath());
                if (Environment.MEDIA_MOUNTED.equals(state) ||
                        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
                    unmount();
@@ -250,13 +241,12 @@ public class Memory extends SettingsPreferenceFragment {
            if (action.equals(UsbManager.ACTION_USB_STATE)) {
               boolean isUsbConnected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
               String usbFunction = mUsbManager.getDefaultFunction();
               for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
                   mStorageVolumePreferenceCategories[i].onUsbStateChanged(isUsbConnected, usbFunction);
               for (StorageVolumePreferenceCategory category : mCategories) {
                   category.onUsbStateChanged(isUsbConnected, usbFunction);
               }
            } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
                // mInternalStorageVolumePreferenceCategory is not affected by the media scanner
                for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
                    mStorageVolumePreferenceCategories[i].onMediaScannerFinished();
                for (StorageVolumePreferenceCategory category : mCategories) {
                    category.onMediaScannerFinished();
                }
            }
        }
@@ -290,10 +280,10 @@ public class Memory extends SettingsPreferenceFragment {
        Toast.makeText(getActivity(), R.string.unmount_inform_text, Toast.LENGTH_SHORT).show();
        IMountService mountService = getMountService();
        try {
            mLastClickedMountToggle.setEnabled(false);
            mLastClickedMountToggle.setTitle(mResources.getString(R.string.sd_ejecting_title));
            mLastClickedMountToggle.setSummary(mResources.getString(R.string.sd_ejecting_summary));
            mountService.unmountVolume(mClickedMountPoint, true, false);
            sLastClickedMountToggle.setEnabled(false);
            sLastClickedMountToggle.setTitle(getString(R.string.sd_ejecting_title));
            sLastClickedMountToggle.setSummary(getString(R.string.sd_ejecting_summary));
            mountService.unmountVolume(sClickedMountPoint, true, false);
        } catch (RemoteException e) {
            // Informative dialog to user that unmount failed.
            showDialogInner(DLG_ERROR_UNMOUNT);
@@ -307,7 +297,7 @@ public class Memory extends SettingsPreferenceFragment {

    private boolean hasAppsAccessingStorage() throws RemoteException {
        IMountService mountService = getMountService();
        int stUsers[] = mountService.getStorageUsers(mClickedMountPoint);
        int stUsers[] = mountService.getStorageUsers(sClickedMountPoint);
        if (stUsers != null && stUsers.length > 0) {
            return true;
        }
@@ -345,7 +335,7 @@ public class Memory extends SettingsPreferenceFragment {
        IMountService mountService = getMountService();
        try {
            if (mountService != null) {
                mountService.mountVolume(mClickedMountPoint);
                mountService.mountVolume(sClickedMountPoint);
            } else {
                Log.e(TAG, "Mount service is null, can't mount");
            }
+1 −1
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ public class MiscFilesHandler extends ListActivity {
            final StorageVolume storageVolume = activity.getIntent().getParcelableExtra(
                    StorageVolume.EXTRA_STORAGE_VOLUME);
            StorageMeasurement mMeasurement = StorageMeasurement.getInstance(
                    activity, storageVolume, new UserHandle(UserHandle.USER_CURRENT), false);
                    activity, storageVolume, UserHandle.CURRENT);
            if (mMeasurement == null) return;
            mData = (ArrayList<StorageMeasurement.FileInfo>) mMeasurement.mFileInfoForMisc;
            if (mData != null) {
+6 −7
Original line number Diff line number Diff line
@@ -115,12 +115,11 @@ public class StorageMeasurement {
        public void updateExact(StorageMeasurement meas, Bundle bundle);
    }

    private StorageMeasurement(
            Context context, StorageVolume storageVolume, UserHandle user, boolean isPrimary) {
        mStorageVolume = storageVolume;
    private StorageMeasurement(Context context, StorageVolume volume, UserHandle user) {
        mStorageVolume = volume;
        mUser = Preconditions.checkNotNull(user);
        mIsInternal = storageVolume == null;
        mIsPrimary = !mIsInternal && isPrimary;
        mIsInternal = volume == null;
        mIsPrimary = volume != null ? volume.isPrimary() : false;

        // Start the thread that will measure the disk usage.
        final HandlerThread handlerThread = new HandlerThread("MemoryMeasurement");
@@ -139,14 +138,14 @@ public class StorageMeasurement {
     * @param isPrimary true when this storage volume is the primary volume
     */
    public static StorageMeasurement getInstance(
            Context context, StorageVolume storageVolume, UserHandle user, boolean isPrimary) {
            Context context, StorageVolume storageVolume, UserHandle user) {
        final Pair<StorageVolume, UserHandle> key = new Pair<StorageVolume, UserHandle>(
                storageVolume, user);
        synchronized (sInstances) {
            StorageMeasurement value = sInstances.get(key);
            if (value == null) {
                value = new StorageMeasurement(
                        context.getApplicationContext(), storageVolume, user, isPrimary);
                        context.getApplicationContext(), storageVolume, user);
                sInstances.put(key, value);
            }
            return value;
+14 −9
Original line number Diff line number Diff line
@@ -166,16 +166,20 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory
        }
    };

    public StorageVolumePreferenceCategory(Context context, Resources resources,
            StorageVolume storageVolume, StorageManager storageManager, boolean isPrimary) {
    public StorageVolumePreferenceCategory(
            Context context, StorageVolume volume, StorageManager storageManager) {
        super(context);
        mResources = resources;
        mStorageVolume = storageVolume;
        mResources = context.getResources();

        mStorageVolume = volume;
        mStorageManager = storageManager;
        setTitle(storageVolume != null ? storageVolume.getDescription(context)
                : resources.getText(R.string.internal_storage));
        mLocalMeasure = StorageMeasurement.getInstance(
                context, storageVolume, new UserHandle(UserHandle.USER_CURRENT), isPrimary);

        final boolean isPrimary = volume != null ? volume.isPrimary() : false;

        setTitle(volume != null ? volume.getDescription(context)
                : context.getText(R.string.internal_storage));

        mLocalMeasure = StorageMeasurement.getInstance(context, volume, UserHandle.CURRENT);
        mAllMeasures.add(mLocalMeasure);

        // Cannot format emulated storage
@@ -233,7 +237,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory
                final String key = buildUserKey(user);

                final StorageMeasurement measure = StorageMeasurement.getInstance(
                        context, mStorageVolume, user, true);
                        context, mStorageVolume, user);
                measure.setIncludeAppCodeSize(false);
                mAllMeasures.add(measure);

@@ -448,6 +452,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory
        mUsbFunction = usbFunction;
        measure();
    }

    public void onMediaScannerFinished() {
        measure();
    }