Merge "Modify UsbDeviceManager stack to allow MtpServer to use FunctionFS drivers."

This commit is contained in:
Jerry Zhang
2016-12-13 00:12:04 +00:00
committed by Gerrit Code Review
4 changed files with 38 additions and 17 deletions

View File

@@ -180,6 +180,14 @@ public class UsbManager {
*/ */
public static final String USB_DATA_UNLOCKED = "unlocked"; 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. * A placeholder indicating that no USB function is being specified.
* Used to distinguish between selecting no function vs. the default function in * Used to distinguish between selecting no function vs. the default function in

View File

@@ -67,6 +67,11 @@ public class MtpServer implements Runnable {
native_remove_storage(storage.getStorageId()); 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_setup(MtpDatabase database, boolean usePtp);
private native final void native_run(); private native final void native_run();
private native final void native_cleanup(); private native final void native_cleanup();

View File

@@ -56,17 +56,16 @@ static inline MtpServer* getMtpServer(JNIEnv *env, jobject thiz) {
return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext); return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext);
} }
static void android_mtp_configure(JNIEnv *, jobject, jboolean usePtp) {
MtpServer::configure(usePtp);
}
static void static void
android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp) android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp)
{ {
int fd = open("/dev/mtp_usb", O_RDWR); MtpServer* server = new MtpServer(getMtpDatabase(env, javaDatabase),
if (fd >= 0) { usePtp, AID_MEDIA_RW, 0664, 0775);
MtpServer* server = new MtpServer(fd, getMtpDatabase(env, javaDatabase), env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server);
usePtp, AID_MEDIA_RW, 0664, 0775);
env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server);
} else {
ALOGE("could not open MTP driver, errno: %d", errno);
}
} }
static void static void
@@ -180,6 +179,7 @@ android_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] = { static const JNINativeMethod gMethods[] = {
{"native_configure", "(Z)V", (void *)android_mtp_configure},
{"native_setup", "(Landroid/mtp/MtpDatabase;Z)V", {"native_setup", "(Landroid/mtp/MtpDatabase;Z)V",
(void *)android_mtp_MtpServer_setup}, (void *)android_mtp_MtpServer_setup},
{"native_run", "()V", (void *)android_mtp_MtpServer_run}, {"native_run", "()V", (void *)android_mtp_MtpServer_run},

View File

@@ -351,8 +351,6 @@ public class UsbDeviceManager {
UsbManager.removeFunction(persisted, UsbManager.USB_FUNCTION_MTP)); UsbManager.removeFunction(persisted, UsbManager.USB_FUNCTION_MTP));
} }
setEnabledFunctions(null, false, false);
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
updateState(state); updateState(state);
@@ -446,13 +444,12 @@ public class UsbDeviceManager {
return false; return false;
} }
private boolean setUsbConfig(String config) { private void setUsbConfig(String config) {
if (DEBUG) Slog.d(TAG, "setUsbConfig(" + config + ")"); if (DEBUG) Slog.d(TAG, "setUsbConfig(" + config + ")");
// set the new configuration // set the new configuration
// we always set it due to b/23631400, where adbd was getting killed // we always set it due to b/23631400, where adbd was getting killed
// and not restarted due to property timeouts on some devices // and not restarted due to property timeouts on some devices
SystemProperties.set(USB_CONFIG_PROPERTY, config); SystemProperties.set(USB_CONFIG_PROPERTY, config);
return waitForState(config);
} }
private void setAdbEnabled(boolean enable) { private void setAdbEnabled(boolean enable) {
@@ -547,8 +544,18 @@ public class UsbDeviceManager {
// Kick the USB stack to close existing connections. // Kick the USB stack to close existing connections.
setUsbConfig(UsbManager.USB_FUNCTION_NONE); 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. // 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); Slog.e(TAG, "Failed to switch USB config to " + functions);
return false; return false;
} }
@@ -631,7 +638,7 @@ public class UsbDeviceManager {
return false; return false;
} }
private void updateUsbStateBroadcastIfNeeded() { private void updateUsbStateBroadcastIfNeeded(boolean configChanged) {
// send a sticky broadcast containing current USB state // send a sticky broadcast containing current USB state
Intent intent = new Intent(UsbManager.ACTION_USB_STATE); Intent intent = new Intent(UsbManager.ACTION_USB_STATE);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
@@ -640,6 +647,7 @@ public class UsbDeviceManager {
intent.putExtra(UsbManager.USB_HOST_CONNECTED, mHostConnected); intent.putExtra(UsbManager.USB_HOST_CONNECTED, mHostConnected);
intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured);
intent.putExtra(UsbManager.USB_DATA_UNLOCKED, isUsbTransferAllowed() && mUsbDataUnlocked); intent.putExtra(UsbManager.USB_DATA_UNLOCKED, isUsbTransferAllowed() && mUsbDataUnlocked);
intent.putExtra(UsbManager.USB_CONFIG_CHANGED, configChanged);
if (mCurrentFunctions != null) { if (mCurrentFunctions != null) {
String[] functions = mCurrentFunctions.split(","); String[] functions = mCurrentFunctions.split(",");
@@ -737,7 +745,7 @@ public class UsbDeviceManager {
setEnabledFunctions(null, false, false); setEnabledFunctions(null, false, false);
} }
if (mBootCompleted) { if (mBootCompleted) {
updateUsbStateBroadcastIfNeeded(); updateUsbStateBroadcastIfNeeded(false);
updateUsbFunctions(); updateUsbFunctions();
} }
break; break;
@@ -749,7 +757,7 @@ public class UsbDeviceManager {
args.recycle(); args.recycle();
updateUsbNotification(); updateUsbNotification();
if (mBootCompleted) { if (mBootCompleted) {
updateUsbStateBroadcastIfNeeded(); updateUsbStateBroadcastIfNeeded(false);
} }
break; break;
case MSG_ENABLE_ADB: case MSG_ENABLE_ADB:
@@ -765,11 +773,11 @@ public class UsbDeviceManager {
case MSG_SYSTEM_READY: case MSG_SYSTEM_READY:
updateUsbNotification(); updateUsbNotification();
updateAdbNotification(); updateAdbNotification();
updateUsbStateBroadcastIfNeeded();
updateUsbFunctions(); updateUsbFunctions();
break; break;
case MSG_BOOT_COMPLETED: case MSG_BOOT_COMPLETED:
mBootCompleted = true; mBootCompleted = true;
setEnabledFunctions(null, false, false);
if (mCurrentAccessory != null) { if (mCurrentAccessory != null) {
getCurrentSettings().accessoryAttached(mCurrentAccessory); getCurrentSettings().accessoryAttached(mCurrentAccessory);
} }