Loading packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java 100644 → 100755 +10 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.os.HandlerThread; import android.os.UserHandle; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.SystemProperties; import android.provider.Settings; import android.util.Log; Loading Loading @@ -272,6 +273,15 @@ public class StorageNotification extends SystemUI { */ private synchronized void setUsbStorageNotification(int titleId, int messageId, int icon, boolean sound, boolean visible, PendingIntent pi) { // force to show UsbSettings screen to select usb mode if property is true if (SystemProperties.getBoolean("persist.sys.ums", true)) { titleId = 0; messageId = 0; icon = 0; sound = false; visible = false; pi = null; } if (!visible && mUsbStorageNotification == null) { return; Loading services/core/java/com/android/server/MountService.java +84 −47 Original line number Diff line number Diff line Loading @@ -749,6 +749,7 @@ class MountService extends IMountService.Stub MountServiceBinderListener bl = mListeners.get(i); try { bl.mListener.onStorageStateChanged(path, oldState, state); disbaleEnableUMSAfterStorageChanged(state); } catch (RemoteException rex) { Slog.e(TAG, "Listener dead"); mListeners.remove(i); Loading @@ -759,6 +760,20 @@ class MountService extends IMountService.Stub } } private void disbaleEnableUMSAfterStorageChanged(String state){ if (state.equals(Environment.MEDIA_SHARED)) { if (!mUmsAvailable) { setUsbMassStorageEnabled(false); } } else if (state.equals(Environment.MEDIA_MOUNTED)) { String usbMode = new UsbManager(null, null).getDefaultFunction(); final boolean isUmsMode = UsbManager.USB_FUNCTION_MASS_STORAGE.equals(usbMode); if (mUmsAvailable && isUmsMode) { setUsbMassStorageEnabled(true); } } } /** * Callback from NativeDaemonConnector */ Loading Loading @@ -1234,10 +1249,14 @@ class MountService extends IMountService.Stub mSendUmsConnectedOnBoot = avail; } final StorageVolume primary = getPrimaryPhysicalVolume(); if (avail == false && primary != null && Environment.MEDIA_SHARED.equals(getVolumeState(primary.getPath()))) { final String path = primary.getPath(); final ArrayList<String> volumes = getShareableVolumes(); boolean mediaShared = false; for (String path : volumes) { if (getVolumeState(path).equals(Environment.MEDIA_SHARED)) mediaShared = true; } if (!avail && mediaShared) { /* * USB mass storage disconnected while enabled */ Loading @@ -1247,17 +1266,24 @@ 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) { rc = doMountVolume(path); if (rc != 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); } } }.start(); } else if (avail && !mediaShared) { setUsbMassStorageEnabled(true); } } Loading Loading @@ -1471,7 +1497,9 @@ class MountService extends IMountService.Stub // Watch for USB changes on primary volume final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary != null && primary.allowMassStorage()) { if ((primary != null && primary.allowMassStorage()) || //ignore primary config, force to register if property is true SystemProperties.getBoolean("persist.sys.ums", true)) { mContext.registerReceiver( mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_STATE), null, mHandler); } Loading Loading @@ -1600,6 +1628,19 @@ class MountService extends IMountService.Stub } } 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 boolean isUsbMassStorageConnected() { waitForReady(); Loading @@ -1616,15 +1657,11 @@ class MountService extends IMountService.Stub validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); validateUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER); final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary == null) return; // 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 = primary.getPath(); String vs = getVolumeState(path); String method = "ums"; if (enable && vs.equals(Environment.MEDIA_MOUNTED)) { Loading @@ -1651,16 +1688,16 @@ class MountService extends IMountService.Stub } } } } public boolean isUsbMassStorageEnabled() { waitForReady(); final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary != null) { return doGetVolumeShared(primary.getPath(), "ums"); } else { return false; for (String path : getShareableVolumes()) { if (doGetVolumeShared(path, "ums")) return true; } // no volume is shared return false; } /** Loading Loading
packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java 100644 → 100755 +10 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.os.HandlerThread; import android.os.UserHandle; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.SystemProperties; import android.provider.Settings; import android.util.Log; Loading Loading @@ -272,6 +273,15 @@ public class StorageNotification extends SystemUI { */ private synchronized void setUsbStorageNotification(int titleId, int messageId, int icon, boolean sound, boolean visible, PendingIntent pi) { // force to show UsbSettings screen to select usb mode if property is true if (SystemProperties.getBoolean("persist.sys.ums", true)) { titleId = 0; messageId = 0; icon = 0; sound = false; visible = false; pi = null; } if (!visible && mUsbStorageNotification == null) { return; Loading
services/core/java/com/android/server/MountService.java +84 −47 Original line number Diff line number Diff line Loading @@ -749,6 +749,7 @@ class MountService extends IMountService.Stub MountServiceBinderListener bl = mListeners.get(i); try { bl.mListener.onStorageStateChanged(path, oldState, state); disbaleEnableUMSAfterStorageChanged(state); } catch (RemoteException rex) { Slog.e(TAG, "Listener dead"); mListeners.remove(i); Loading @@ -759,6 +760,20 @@ class MountService extends IMountService.Stub } } private void disbaleEnableUMSAfterStorageChanged(String state){ if (state.equals(Environment.MEDIA_SHARED)) { if (!mUmsAvailable) { setUsbMassStorageEnabled(false); } } else if (state.equals(Environment.MEDIA_MOUNTED)) { String usbMode = new UsbManager(null, null).getDefaultFunction(); final boolean isUmsMode = UsbManager.USB_FUNCTION_MASS_STORAGE.equals(usbMode); if (mUmsAvailable && isUmsMode) { setUsbMassStorageEnabled(true); } } } /** * Callback from NativeDaemonConnector */ Loading Loading @@ -1234,10 +1249,14 @@ class MountService extends IMountService.Stub mSendUmsConnectedOnBoot = avail; } final StorageVolume primary = getPrimaryPhysicalVolume(); if (avail == false && primary != null && Environment.MEDIA_SHARED.equals(getVolumeState(primary.getPath()))) { final String path = primary.getPath(); final ArrayList<String> volumes = getShareableVolumes(); boolean mediaShared = false; for (String path : volumes) { if (getVolumeState(path).equals(Environment.MEDIA_SHARED)) mediaShared = true; } if (!avail && mediaShared) { /* * USB mass storage disconnected while enabled */ Loading @@ -1247,17 +1266,24 @@ 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) { rc = doMountVolume(path); if (rc != 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); } } }.start(); } else if (avail && !mediaShared) { setUsbMassStorageEnabled(true); } } Loading Loading @@ -1471,7 +1497,9 @@ class MountService extends IMountService.Stub // Watch for USB changes on primary volume final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary != null && primary.allowMassStorage()) { if ((primary != null && primary.allowMassStorage()) || //ignore primary config, force to register if property is true SystemProperties.getBoolean("persist.sys.ums", true)) { mContext.registerReceiver( mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_STATE), null, mHandler); } Loading Loading @@ -1600,6 +1628,19 @@ class MountService extends IMountService.Stub } } 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 boolean isUsbMassStorageConnected() { waitForReady(); Loading @@ -1616,15 +1657,11 @@ class MountService extends IMountService.Stub validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); validateUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER); final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary == null) return; // 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 = primary.getPath(); String vs = getVolumeState(path); String method = "ums"; if (enable && vs.equals(Environment.MEDIA_MOUNTED)) { Loading @@ -1651,16 +1688,16 @@ class MountService extends IMountService.Stub } } } } public boolean isUsbMassStorageEnabled() { waitForReady(); final StorageVolume primary = getPrimaryPhysicalVolume(); if (primary != null) { return doGetVolumeShared(primary.getPath(), "ums"); } else { return false; for (String path : getShareableVolumes()) { if (doGetVolumeShared(path, "ums")) return true; } // no volume is shared return false; } /** Loading