diff options
author | 2016-12-13 01:02:55 +0000 | |
---|---|---|
committer | 2016-12-13 01:02:55 +0000 | |
commit | d9291d55f6aa39a63311d7b1b6585f7a73aafd68 (patch) | |
tree | ede609fa106c196993d056cdaf39541e8efe17df | |
parent | bf83fceb301a8624114a2530e7952b21d8b7e2d2 (diff) | |
parent | 11dc0eccfb82529cda788047539677e2a2dd4af9 (diff) |
Merge "Modify UsbDeviceManager stack to allow MtpServer to use FunctionFS drivers." am: 1975240f17 am: 830874dbe7 am: 88672d7d29
am: 11dc0eccfb
Change-Id: Ibafebe4877052595cb34626bde9ac6fba1983fb0
-rw-r--r-- | core/java/android/hardware/usb/UsbManager.java | 8 | ||||
-rw-r--r-- | media/java/android/mtp/MtpServer.java | 5 | ||||
-rw-r--r-- | media/jni/android_mtp_MtpServer.cpp | 16 | ||||
-rw-r--r-- | services/usb/java/com/android/server/usb/UsbDeviceManager.java | 26 |
4 files changed, 38 insertions, 17 deletions
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 3636e4edeb35..ae92457b6dd2 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -183,6 +183,14 @@ public class UsbManager { public static final String USB_DATA_UNLOCKED = "unlocked"; /** + * Boolean extra indicating whether the intent represents a change in the usb + * configuration (as opposed to a state update). + * + * {@hide} + */ + public static final String USB_CONFIG_CHANGED = "config_changed"; + + /** * A placeholder indicating that no USB function is being specified. * Used to distinguish between selecting no function vs. the default function in * {@link #setCurrentFunction(String)}. diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java index 99f93e412b11..9801949916bb 100644 --- a/media/java/android/mtp/MtpServer.java +++ b/media/java/android/mtp/MtpServer.java @@ -72,6 +72,11 @@ public class MtpServer implements Runnable { native_remove_storage(storage.getStorageId()); } + public static void configure(boolean usePtp) { + native_configure(usePtp); + } + + public static native final void native_configure(boolean usePtp); private native final void native_setup(MtpDatabase database, boolean usePtp); private native final void native_run(); private native final void native_cleanup(); diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp index d13187c39846..afd3082ec51b 100644 --- a/media/jni/android_mtp_MtpServer.cpp +++ b/media/jni/android_mtp_MtpServer.cpp @@ -56,17 +56,16 @@ static inline MtpServer* getMtpServer(JNIEnv *env, jobject thiz) { return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext); } +static void android_mtp_configure(JNIEnv *, jobject, jboolean usePtp) { + MtpServer::configure(usePtp); +} + static void android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp) { - int fd = open("/dev/mtp_usb", O_RDWR); - if (fd >= 0) { - MtpServer* server = new MtpServer(fd, getMtpDatabase(env, javaDatabase), - usePtp, AID_MEDIA_RW, 0664, 0775); - env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server); - } else { - ALOGE("could not open MTP driver, errno: %d", errno); - } + MtpServer* server = new MtpServer(getMtpDatabase(env, javaDatabase), + usePtp, AID_MEDIA_RW, 0664, 0775); + env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server); } static void @@ -180,6 +179,7 @@ android_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId) // ---------------------------------------------------------------------------- static const JNINativeMethod gMethods[] = { + {"native_configure", "(Z)V", (void *)android_mtp_configure}, {"native_setup", "(Landroid/mtp/MtpDatabase;Z)V", (void *)android_mtp_MtpServer_setup}, {"native_run", "()V", (void *)android_mtp_MtpServer_run}, diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index b86a85be9f33..581dbe3aae6e 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -361,8 +361,6 @@ public class UsbDeviceManager { UsbManager.removeFunction(persisted, UsbManager.USB_FUNCTION_MTP)); } - setEnabledFunctions(null, false, false); - String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); updateState(state); @@ -456,13 +454,12 @@ public class UsbDeviceManager { return false; } - private boolean setUsbConfig(String config) { + private void setUsbConfig(String config) { if (DEBUG) Slog.d(TAG, "setUsbConfig(" + config + ")"); // set the new configuration // we always set it due to b/23631400, where adbd was getting killed // and not restarted due to property timeouts on some devices SystemProperties.set(USB_CONFIG_PROPERTY, config); - return waitForState(config); } private void setAdbEnabled(boolean enable) { @@ -557,8 +554,18 @@ public class UsbDeviceManager { // Kick the USB stack to close existing connections. setUsbConfig(UsbManager.USB_FUNCTION_NONE); + if (!waitForState(UsbManager.USB_FUNCTION_NONE)) { + Slog.e(TAG, "Failed to kick USB config"); + return false; + } + // Set the new USB configuration. - if (!setUsbConfig(functions)) { + setUsbConfig(functions); + + // Start up dependent services. + updateUsbStateBroadcastIfNeeded(true); + + if (!waitForState(functions)) { Slog.e(TAG, "Failed to switch USB config to " + functions); return false; } @@ -641,7 +648,7 @@ public class UsbDeviceManager { return false; } - private void updateUsbStateBroadcastIfNeeded() { + private void updateUsbStateBroadcastIfNeeded(boolean configChanged) { // send a sticky broadcast containing current USB state Intent intent = new Intent(UsbManager.ACTION_USB_STATE); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING @@ -650,6 +657,7 @@ public class UsbDeviceManager { intent.putExtra(UsbManager.USB_HOST_CONNECTED, mHostConnected); intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); intent.putExtra(UsbManager.USB_DATA_UNLOCKED, isUsbTransferAllowed() && mUsbDataUnlocked); + intent.putExtra(UsbManager.USB_CONFIG_CHANGED, configChanged); if (mCurrentFunctions != null) { String[] functions = mCurrentFunctions.split(","); @@ -747,7 +755,7 @@ public class UsbDeviceManager { setEnabledFunctions(null, false, false); } if (mBootCompleted) { - updateUsbStateBroadcastIfNeeded(); + updateUsbStateBroadcastIfNeeded(false); updateUsbFunctions(); } break; @@ -759,7 +767,7 @@ public class UsbDeviceManager { args.recycle(); updateUsbNotification(); if (mBootCompleted) { - updateUsbStateBroadcastIfNeeded(); + updateUsbStateBroadcastIfNeeded(false); } break; case MSG_ENABLE_ADB: @@ -775,11 +783,11 @@ public class UsbDeviceManager { case MSG_SYSTEM_READY: updateUsbNotification(); updateAdbNotification(); - updateUsbStateBroadcastIfNeeded(); updateUsbFunctions(); break; case MSG_BOOT_COMPLETED: mBootCompleted = true; + setEnabledFunctions(null, false, false); if (mCurrentAccessory != null) { getCurrentSettings().accessoryAttached(mCurrentAccessory); } |