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

Commit 47495ab8 authored by atinm's avatar atinm
Browse files

Allow multiple shareable SD Cards by using getShareableVolumes()

to get all the volumes that are shareable and allowing
sharing/unsharing for all of them rather than just the hardcoded
getExternalStorage calls.

Unmount immediately if PM is not updating and not an ASEC
mount. Change from Josh Stone.
Change-Id: Iaf1a7a4484deac373e1c1d7bf16d5f22ca49fd64

Only allow package manager for sdcard (packages aren't on
external card).

Change-Id: I0d148ea52dc1285905a9dd061d1ceedcfb761b52

Take out extra logging.

Change-Id: I6beb007700ef4be04c3eb273bbf2069c87b30011
parent 5e241b6d
Loading
Loading
Loading
Loading
+76 −55
Original line number Diff line number Diff line
@@ -339,6 +339,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.
@@ -1012,18 +1019,23 @@ 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
             */
            final ArrayList<String> volumes = getShareableVolumes();
            new Thread() {
                public void run() {
                    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(
@@ -1031,6 +1043,7 @@ class MountService extends IMountService.Stub
                                        path, rc));
                                }
                            }
                        }
                    } catch (Exception ex) {
                        Slog.w(TAG, "Failed to mount media on UMS enabled-disconnect", ex);
                    }
@@ -1125,7 +1138,9 @@ class MountService extends IMountService.Stub

        Slog.i(TAG, "Shutting down");

        String path = Environment.getExternalStorageDirectory().getPath();
        ArrayList<String> volumesToShare = getShareableVolumes();

        for (String path: volumesToShare) {
            String state = getVolumeState(path);

            if (state.equals(Environment.MEDIA_SHARED)) {
@@ -1151,7 +1166,7 @@ class MountService extends IMountService.Stub
                        Slog.e(TAG, "Interrupted while waiting for media", iex);
                        break;
                    }
                state = Environment.getExternalStorageState();
                    state = getVolumeState(path);
                }
                if (retries == 0) {
                    Slog.e(TAG, "Timed out waiting for media to check");
@@ -1175,6 +1190,7 @@ class MountService extends IMountService.Stub
                }
            }
        }
    }

    private boolean getUmsEnabling() {
        synchronized (mListeners) {
@@ -1235,8 +1251,7 @@ class MountService extends IMountService.Stub
                // Override for isUsbMassStorageEnabled()
                setUmsEnabling(enable);
                UmsEnableCallBack umscb = new UmsEnableCallBack(path, method, true);
                int msg = isExternalStorage(path) ? H_UNMOUNT_PM_UPDATE : H_UNMOUNT_MS;
                mHandler.sendMessage(mHandler.obtainMessage(msg, umscb));
                mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, umscb));
                // Clear override
                setUmsEnabling(false);
            }
@@ -1260,7 +1275,14 @@ class MountService extends IMountService.Stub

    public boolean isUsbMassStorageEnabled() {
        waitForReady();
        return doGetVolumeShared(Environment.getExternalStorageDirectory().getPath(), "ums");

        ArrayList<String> volumesToShare = getShareableVolumes();
        for (String path: volumesToShare) {
            if (doGetVolumeShared(path, "ums"))
                return true;
        }
        // no volume is shared
        return false;
    }
    
    /**
@@ -1302,8 +1324,7 @@ class MountService extends IMountService.Stub
            return;
        }
        UnmountCallBack ucb = new UnmountCallBack(path, force);
        int msg = isExternalStorage(path) ? H_UNMOUNT_PM_UPDATE : H_UNMOUNT_MS;
        mHandler.sendMessage(mHandler.obtainMessage(msg, ucb));
        mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, ucb));
    }

    public int formatVolume(String path) {