Merge "Modify UsbDeviceManager stack to allow MtpServer to use FunctionFS drivers."
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user