Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 830874db authored by Jerry Zhang's avatar Jerry Zhang Committed by android-build-merger
Browse files

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

am: 1975240f

Change-Id: I4b6532719b848ba4b595c8069ecbbd42e855382b
parents 9f0030a9 1975240f
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -180,6 +180,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
+5 −0
Original line number Diff line number Diff line
@@ -67,6 +67,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();
+8 −8
Original line number Diff line number Diff line
@@ -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),
    MtpServer* server = new MtpServer(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);
    }
}

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},
+17 −9
Original line number Diff line number Diff line
@@ -351,8 +351,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);

@@ -446,13 +444,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) {
@@ -547,8 +544,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;
                }
@@ -631,7 +638,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
@@ -640,6 +647,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(",");
@@ -737,7 +745,7 @@ public class UsbDeviceManager {
                        setEnabledFunctions(null, false, false);
                    }
                    if (mBootCompleted) {
                        updateUsbStateBroadcastIfNeeded();
                        updateUsbStateBroadcastIfNeeded(false);
                        updateUsbFunctions();
                    }
                    break;
@@ -749,7 +757,7 @@ public class UsbDeviceManager {
                    args.recycle();
                    updateUsbNotification();
                    if (mBootCompleted) {
                        updateUsbStateBroadcastIfNeeded();
                        updateUsbStateBroadcastIfNeeded(false);
                    }
                    break;
                case MSG_ENABLE_ADB:
@@ -765,11 +773,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);
                    }