Loading services/java/com/android/server/MountService.java +83 −39 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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 */ Loading @@ -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); } Loading Loading @@ -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)) { Loading @@ -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; } /** Loading Loading
services/java/com/android/server/MountService.java +83 −39 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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 */ Loading @@ -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); } Loading Loading @@ -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)) { Loading @@ -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; } /** Loading