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

Commit 29dea31c authored by Steve Kondik's avatar Steve Kondik Committed by Gerrit Code Review
Browse files

Merge "Allow mounting of multiple volumes via mass storage (framework part)" into jellybean

parents 92c3e610 cac91ee9
Loading
Loading
Loading
Loading
+83 −39
Original line number Diff line number Diff line
@@ -374,6 +374,13 @@ class MountService extends IMountService.Stub
                case H_UNMOUNT_PM_UPDATE: {
                    if (DEBUG_UNMOUNT) Slog.i(TAG, "H_UNMOUNT_PM_UPDATE");
                    UnmountCallBack ucb = (UnmountCallBack) msg.obj;
                    if (!mUpdatingStatus && !isExternalStorage(ucb.path)) {
                        // If PM isn't already updating, and this isn't an ASEC
                        // mount, then go ahead and do the unmount immediately.
                        if (DEBUG_UNMOUNT) Slog.i(TAG, " skipping PackageManager for " + ucb.path);
                        ucb.handleFinished();
                        break;
                    }
                    mForceUnmounts.add(ucb);
                    if (DEBUG_UNMOUNT) Slog.i(TAG, " registered = " + mUpdatingStatus);
                    // Register only if needed.
@@ -607,7 +614,9 @@ class MountService extends IMountService.Stub
            // Update state on PackageManager, but only of real events
            if (!mEmulateExternalStorage) {
                if (Environment.MEDIA_UNMOUNTED.equals(state)) {
                    if (isExternalStorage(path)) {
                        mPms.updateExternalMediaStatus(false, false);
                    }

                    /*
                     * Some OBBs might have been unmounted when this volume was
@@ -617,10 +626,12 @@ class MountService extends IMountService.Stub
                    mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(
                            OBB_FLUSH_MOUNT_STATE, path));
                } else if (Environment.MEDIA_MOUNTED.equals(state)) {
                    if (isExternalStorage(path)) {
                        mPms.updateExternalMediaStatus(true, false);
                    }
                }
            }
        }
        synchronized (mListeners) {
            for (int i = mListeners.size() -1; i >= 0; i--) {
                MountServiceBinderListener bl = mListeners.get(i);
@@ -935,7 +946,9 @@ class MountService extends IMountService.Stub
        Runtime.getRuntime().gc();

        // Redundant probably. But no harm in updating state again.
        if (isExternalStorage(path)) {
            mPms.updateExternalMediaStatus(false, false);
        }
        try {
            final Command cmd = new Command("volume", "unmount", path);
            if (removeEncryption) {
@@ -1017,8 +1030,13 @@ class MountService extends IMountService.Stub
            mSendUmsConnectedOnBoot = avail;
        }

        final String path = Environment.getExternalStorageDirectory().getPath();
        if (avail == false && getVolumeState(path).equals(Environment.MEDIA_SHARED)) {
        final ArrayList<String> volumes = getShareableVolumes();
        boolean mediaShared = false;
        for (String path : volumes) {
            if (getVolumeState(path).equals(Environment.MEDIA_SHARED))
                mediaShared = true;
        }
        if (avail == false && mediaShared) {
            /*
             * USB mass storage disconnected while enabled
             */
@@ -1028,12 +1046,16 @@ class MountService extends IMountService.Stub
                    try {
                        int rc;
                        Slog.w(TAG, "Disabling UMS after cable disconnect");
                        for (String path : volumes) {
                            if (getVolumeState(path).equals(Environment.MEDIA_SHARED)) {
                                doShareUnshareVolume(path, "ums", false);
                                if ((rc = doMountVolume(path)) != StorageResultCode.OperationSucceeded) {
                                    Slog.e(TAG, String.format(
                                            "Failed to remount {%s} on UMS enabled-disconnect (%d)",
                                                    path, rc));
                                }
                            }
                        }
                    } catch (Exception ex) {
                        Slog.w(TAG, "Failed to mount media on UMS enabled-disconnect", ex);
                    }
@@ -1308,16 +1330,32 @@ class MountService extends IMountService.Stub
        }
    }

    private boolean isExternalStorage(String path) {
        return Environment.getExternalStorageDirectory().getPath().equals(path);
    }

    private ArrayList<String> getShareableVolumes() {
        // Sharable volumes have android:allowMassStorage="true" in storage_list.xml
        ArrayList<String> volumesToMount = new ArrayList<String>();
        synchronized (mVolumes) {
            for (StorageVolume v : mVolumes) {
                if (v.allowMassStorage()) {
                    volumesToMount.add(v.getPath());
                }
            }
        }
        return volumesToMount;
    }

    public void setUsbMassStorageEnabled(boolean enable) {
        waitForReady();
        validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);

        // TODO: Add support for multiple share methods

        for (String path : getShareableVolumes()) {
            /*
             * If the volume is mounted and we're enabling then unmount it
             */
        String path = Environment.getExternalStorageDirectory().getPath();
            String vs = getVolumeState(path);
            String method = "ums";
            if (enable && vs.equals(Environment.MEDIA_MOUNTED)) {
@@ -1344,10 +1382,16 @@ class MountService extends IMountService.Stub
                }
            }
        }
    }

    public boolean isUsbMassStorageEnabled() {
        waitForReady();
        return doGetVolumeShared(Environment.getExternalStorageDirectory().getPath(), "ums");
        for (String path : getShareableVolumes()) {
            if (doGetVolumeShared(path, "ums"))
                return true;
        }
        // no volume is shared
        return false;
    }

    /**