Loading core/java/android/hardware/usb/IUsbManager.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,16 @@ interface IUsbManager /* Sets the current USB function. */ void setCurrentFunction(String function); /* Sets whether USB data (for example, MTP exposed pictures) should be made * available on the USB connection. Unlocking data should only be done with * user involvement, since exposing pictures or other data could leak sensitive * user information. */ void setUsbDataUnlocked(boolean unlock); /* Returns true iff sensitive user data is exposed on the USB connection. */ boolean isUsbDataUnlocked(); /* Allow USB debugging from the attached host. If alwaysAllow is true, add the * the public key to list of host keys that the user has approved. */ Loading core/java/android/hardware/usb/UsbManager.java +40 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,16 @@ public class UsbManager { */ public static final String USB_CONFIGURED = "configured"; /** * Boolean extra indicating whether confidential user data, such as photos, should be * made available on the USB connection. This variable will only be set when the user * has explicitly asked for this data to be unlocked. * Used in extras for the {@link #ACTION_USB_STATE} broadcast. * * {@hide} */ public static final String USB_DATA_UNLOCKED = "unlocked"; /** * Name of the USB mass storage USB function. * Used in extras for the {@link #ACTION_USB_STATE} broadcast Loading Loading @@ -464,4 +474,34 @@ public class UsbManager { Log.e(TAG, "RemoteException in setCurrentFunction", e); } } /** * Sets whether USB data (for example, MTP exposed pictures) should be made available * on the USB connection. Unlocking usb data should only be done with user involvement, * since exposing pictures or other data could leak sensitive user information. * * {@hide} */ public void setUsbDataUnlocked(boolean unlocked) { try { mService.setUsbDataUnlocked(unlocked); } catch (RemoteException e) { Log.e(TAG, "RemoteException in setUsbDataUnlocked", e); } } /** * Returns {@code true} iff access to sensitive USB data is currently allowed. * * {@hide} */ public boolean isUsbDataUnlocked() { try { return mService.isUsbDataUnlocked(); } catch (RemoteException e) { Log.e(TAG, "RemoteException in isUsbDataUnlocked", e); } return false; } } services/usb/java/com/android/server/usb/UsbDeviceManager.java +37 −3 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ public class UsbDeviceManager { private static final int MSG_SYSTEM_READY = 3; private static final int MSG_BOOT_COMPLETED = 4; private static final int MSG_USER_SWITCHED = 5; private static final int MSG_SET_USB_DATA_UNLOCKED = 6; private static final int AUDIO_MODE_SOURCE = 1; Loading Loading @@ -314,6 +315,7 @@ public class UsbDeviceManager { // current USB state private boolean mConnected; private boolean mConfigured; private boolean mUsbDataUnlocked; private String mCurrentFunctions; private UsbAccessory mCurrentAccessory; private int mUsbNotificationId; Loading Loading @@ -350,7 +352,7 @@ public class UsbDeviceManager { SystemProperties.get(UsbManager.ADB_PERSISTENT_PROPERTY, "adb"), UsbManager.USB_FUNCTION_ADB); mCurrentFunctions = mAdbEnabled ? "adb" : "none"; mCurrentFunctions = mAdbEnabled ? "adb" : UsbManager.USB_FUNCTION_MTP; String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); updateState(state); Loading Loading @@ -459,6 +461,15 @@ public class UsbDeviceManager { } } /** * Stop and start the USB driver. This is needed to close all outstanding * USB connections. */ private void restartCurrentFunction() { setUsbConfig("none"); setUsbConfig(mCurrentFunctions); } private void setEnabledFunctions(String functions) { if (DEBUG) Slog.d(TAG, "setEnabledFunctions " + functions); Loading Loading @@ -531,6 +542,7 @@ public class UsbDeviceManager { intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra(UsbManager.USB_CONNECTED, mConnected); intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); intent.putExtra(UsbManager.USB_DATA_UNLOCKED, mUsbDataUnlocked); if (mCurrentFunctions != null) { String[] functions = mCurrentFunctions.split(","); Loading Loading @@ -599,6 +611,10 @@ public class UsbDeviceManager { case MSG_UPDATE_STATE: mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); if (!mConnected) { // When a disconnect occurs, relock access to sensitive user data mUsbDataUnlocked = false; } updateUsbNotification(); updateAdbNotification(); if (containsFunction(mCurrentFunctions, Loading @@ -621,6 +637,12 @@ public class UsbDeviceManager { String functions = (String)msg.obj; setEnabledFunctions(functions); break; case MSG_SET_USB_DATA_UNLOCKED: mUsbDataUnlocked = (msg.arg1 == 1); updateUsbNotification(); updateUsbState(); restartCurrentFunction(); break; case MSG_SYSTEM_READY: setUsbConfig(mCurrentFunctions); updatePersistentProperty(); Loading Loading @@ -676,7 +698,9 @@ public class UsbDeviceManager { int id = 0; Resources r = mContext.getResources(); if (mConnected) { if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) { if (!mUsbDataUnlocked) { id = com.android.internal.R.string.usb_charging_notification_title; } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) { id = com.android.internal.R.string.usb_mtp_notification_title; } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP)) { id = com.android.internal.R.string.usb_ptp_notification_title; Loading Loading @@ -771,7 +795,7 @@ public class UsbDeviceManager { } private String getDefaultFunctions() { return "none"; return UsbManager.USB_FUNCTION_MTP; } public void dump(FileDescriptor fd, PrintWriter pw) { Loading Loading @@ -817,6 +841,16 @@ public class UsbDeviceManager { mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions); } public void setUsbDataUnlocked(boolean unlocked) { if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked(" + unlocked + ")"); mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, unlocked); } public boolean isUsbDataUnlocked() { if (DEBUG) Slog.d(TAG, "isUsbDataUnlocked() -> " + mHandler.mUsbDataUnlocked); return mHandler.mUsbDataUnlocked; } private void readOemUsbOverrideConfig() { String[] configList = mContext.getResources().getStringArray( com.android.internal.R.array.config_oemUsbModeOverride); Loading services/usb/java/com/android/server/usb/UsbService.java +12 −0 Original line number Diff line number Diff line Loading @@ -270,6 +270,18 @@ public class UsbService extends IUsbManager.Stub { } } @Override public void setUsbDataUnlocked(boolean unlocked) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); mDeviceManager.setUsbDataUnlocked(unlocked); } @Override public boolean isUsbDataUnlocked() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); return mDeviceManager.isUsbDataUnlocked(); } @Override public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); Loading Loading
core/java/android/hardware/usb/IUsbManager.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,16 @@ interface IUsbManager /* Sets the current USB function. */ void setCurrentFunction(String function); /* Sets whether USB data (for example, MTP exposed pictures) should be made * available on the USB connection. Unlocking data should only be done with * user involvement, since exposing pictures or other data could leak sensitive * user information. */ void setUsbDataUnlocked(boolean unlock); /* Returns true iff sensitive user data is exposed on the USB connection. */ boolean isUsbDataUnlocked(); /* Allow USB debugging from the attached host. If alwaysAllow is true, add the * the public key to list of host keys that the user has approved. */ Loading
core/java/android/hardware/usb/UsbManager.java +40 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,16 @@ public class UsbManager { */ public static final String USB_CONFIGURED = "configured"; /** * Boolean extra indicating whether confidential user data, such as photos, should be * made available on the USB connection. This variable will only be set when the user * has explicitly asked for this data to be unlocked. * Used in extras for the {@link #ACTION_USB_STATE} broadcast. * * {@hide} */ public static final String USB_DATA_UNLOCKED = "unlocked"; /** * Name of the USB mass storage USB function. * Used in extras for the {@link #ACTION_USB_STATE} broadcast Loading Loading @@ -464,4 +474,34 @@ public class UsbManager { Log.e(TAG, "RemoteException in setCurrentFunction", e); } } /** * Sets whether USB data (for example, MTP exposed pictures) should be made available * on the USB connection. Unlocking usb data should only be done with user involvement, * since exposing pictures or other data could leak sensitive user information. * * {@hide} */ public void setUsbDataUnlocked(boolean unlocked) { try { mService.setUsbDataUnlocked(unlocked); } catch (RemoteException e) { Log.e(TAG, "RemoteException in setUsbDataUnlocked", e); } } /** * Returns {@code true} iff access to sensitive USB data is currently allowed. * * {@hide} */ public boolean isUsbDataUnlocked() { try { return mService.isUsbDataUnlocked(); } catch (RemoteException e) { Log.e(TAG, "RemoteException in isUsbDataUnlocked", e); } return false; } }
services/usb/java/com/android/server/usb/UsbDeviceManager.java +37 −3 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ public class UsbDeviceManager { private static final int MSG_SYSTEM_READY = 3; private static final int MSG_BOOT_COMPLETED = 4; private static final int MSG_USER_SWITCHED = 5; private static final int MSG_SET_USB_DATA_UNLOCKED = 6; private static final int AUDIO_MODE_SOURCE = 1; Loading Loading @@ -314,6 +315,7 @@ public class UsbDeviceManager { // current USB state private boolean mConnected; private boolean mConfigured; private boolean mUsbDataUnlocked; private String mCurrentFunctions; private UsbAccessory mCurrentAccessory; private int mUsbNotificationId; Loading Loading @@ -350,7 +352,7 @@ public class UsbDeviceManager { SystemProperties.get(UsbManager.ADB_PERSISTENT_PROPERTY, "adb"), UsbManager.USB_FUNCTION_ADB); mCurrentFunctions = mAdbEnabled ? "adb" : "none"; mCurrentFunctions = mAdbEnabled ? "adb" : UsbManager.USB_FUNCTION_MTP; String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); updateState(state); Loading Loading @@ -459,6 +461,15 @@ public class UsbDeviceManager { } } /** * Stop and start the USB driver. This is needed to close all outstanding * USB connections. */ private void restartCurrentFunction() { setUsbConfig("none"); setUsbConfig(mCurrentFunctions); } private void setEnabledFunctions(String functions) { if (DEBUG) Slog.d(TAG, "setEnabledFunctions " + functions); Loading Loading @@ -531,6 +542,7 @@ public class UsbDeviceManager { intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra(UsbManager.USB_CONNECTED, mConnected); intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); intent.putExtra(UsbManager.USB_DATA_UNLOCKED, mUsbDataUnlocked); if (mCurrentFunctions != null) { String[] functions = mCurrentFunctions.split(","); Loading Loading @@ -599,6 +611,10 @@ public class UsbDeviceManager { case MSG_UPDATE_STATE: mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); if (!mConnected) { // When a disconnect occurs, relock access to sensitive user data mUsbDataUnlocked = false; } updateUsbNotification(); updateAdbNotification(); if (containsFunction(mCurrentFunctions, Loading @@ -621,6 +637,12 @@ public class UsbDeviceManager { String functions = (String)msg.obj; setEnabledFunctions(functions); break; case MSG_SET_USB_DATA_UNLOCKED: mUsbDataUnlocked = (msg.arg1 == 1); updateUsbNotification(); updateUsbState(); restartCurrentFunction(); break; case MSG_SYSTEM_READY: setUsbConfig(mCurrentFunctions); updatePersistentProperty(); Loading Loading @@ -676,7 +698,9 @@ public class UsbDeviceManager { int id = 0; Resources r = mContext.getResources(); if (mConnected) { if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) { if (!mUsbDataUnlocked) { id = com.android.internal.R.string.usb_charging_notification_title; } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) { id = com.android.internal.R.string.usb_mtp_notification_title; } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP)) { id = com.android.internal.R.string.usb_ptp_notification_title; Loading Loading @@ -771,7 +795,7 @@ public class UsbDeviceManager { } private String getDefaultFunctions() { return "none"; return UsbManager.USB_FUNCTION_MTP; } public void dump(FileDescriptor fd, PrintWriter pw) { Loading Loading @@ -817,6 +841,16 @@ public class UsbDeviceManager { mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions); } public void setUsbDataUnlocked(boolean unlocked) { if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked(" + unlocked + ")"); mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, unlocked); } public boolean isUsbDataUnlocked() { if (DEBUG) Slog.d(TAG, "isUsbDataUnlocked() -> " + mHandler.mUsbDataUnlocked); return mHandler.mUsbDataUnlocked; } private void readOemUsbOverrideConfig() { String[] configList = mContext.getResources().getStringArray( com.android.internal.R.array.config_oemUsbModeOverride); Loading
services/usb/java/com/android/server/usb/UsbService.java +12 −0 Original line number Diff line number Diff line Loading @@ -270,6 +270,18 @@ public class UsbService extends IUsbManager.Stub { } } @Override public void setUsbDataUnlocked(boolean unlocked) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); mDeviceManager.setUsbDataUnlocked(unlocked); } @Override public boolean isUsbDataUnlocked() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); return mDeviceManager.isUsbDataUnlocked(); } @Override public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); Loading