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

Commit e6d74db1 authored by Febin Thattil's avatar Febin Thattil
Browse files

[AOA FFS Implementation] Fetch accessory strings from FFS

Accessory mode needs to fetch the accessory strings associated with
connected accessory. The kernel driver used to provide these strings to
UsbDeviceManager. The same behaviour needs to be replicated by getting
the accessory strings from the newly created vendor control request
monitor. UsbDeviceManager fetches from /dev/usb_accessory or from vendor
control request monitor based on the flag.

Bug: 407985367
Bug: 422137361
Flag: android.hardware.usb.flags.enable_aoa_userspace_implementation
Test: Checked that accessory strings are fetched from userspace
Change-Id: I55fdbac0d0b2e4067050d3c85d2f7c6729586b6b
parent 994c5a7c
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -691,6 +691,19 @@ static void set_accessory_string(JNIEnv *env, int fd, int cmd, jobjectArray strA
    }
}

static void set_accessory_string_from_ffs(JNIEnv *env, jobjectArray strArray, int index) {
    if (!sVendorControlRequestMonitorThread) {
        ALOGE("Vendor control request monitor thread is not running");
        return;
    }

    std::string str = sVendorControlRequestMonitorThread->getAccessoryString(index);
    if (!str.empty()) {
        jstring obj = env->NewStringUTF(str.data());
        env->SetObjectArrayElement(strArray, index, obj);
        env->DeleteLocalRef(obj);
    }
}

static jobjectArray android_server_UsbDeviceManager_getAccessoryStrings(JNIEnv *env,
                                                                        jobject /* thiz */)
@@ -715,6 +728,21 @@ out:
    return strArray;
}

static jobjectArray android_server_UsbDeviceManager_getAccessoryStringsFromFfs(JNIEnv *env,
                                                                        jobject /* thiz */)
{
    jclass stringClass = env->FindClass("java/lang/String");
    jobjectArray strArray = env->NewObjectArray(6, stringClass, NULL);
    if (!strArray) return nullptr;
    set_accessory_string_from_ffs(env, strArray, 0);
    set_accessory_string_from_ffs(env, strArray, 1);
    set_accessory_string_from_ffs(env, strArray, 2);
    set_accessory_string_from_ffs(env, strArray, 3);
    set_accessory_string_from_ffs(env, strArray, 4);
    set_accessory_string_from_ffs(env, strArray, 5);
    return strArray;
}

static jobject android_server_UsbDeviceManager_openAccessory(JNIEnv *env, jobject /* thiz */)
{
    int fd = open(DRIVER_NAME, O_RDWR);
@@ -866,6 +894,8 @@ static jstring android_server_UsbDeviceManager_waitAndGetProperty(JNIEnv *env, j
static const JNINativeMethod method_table[] = {
        {"nativeGetAccessoryStrings", "()[Ljava/lang/String;",
         (void *)android_server_UsbDeviceManager_getAccessoryStrings},
        {"nativeGetAccessoryStringsFromFfs", "()[Ljava/lang/String;",
         (void *)android_server_UsbDeviceManager_getAccessoryStringsFromFfs},
        {"nativeOpenAccessory", "()Landroid/os/ParcelFileDescriptor;",
         (void *)android_server_UsbDeviceManager_openAccessory},
        {"nativeIsStartRequested", "()Z", (void *)android_server_UsbDeviceManager_isStartRequested},
+8 −1
Original line number Diff line number Diff line
@@ -541,7 +541,12 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser

        int operationId = sUsbOperationCount.incrementAndGet();

        if (android.hardware.usb.flags.Flags.enableAoaUserspaceImplementation()) {
            mAccessoryStrings = nativeGetAccessoryStringsFromFfs();
        } else {
            mAccessoryStrings = nativeGetAccessoryStrings();
        }

        // don't start accessory mode if our mandatory strings have not been set
        boolean enableAccessory = (mAccessoryStrings != null &&
                mAccessoryStrings[UsbAccessory.MANUFACTURER_STRING] != null &&
@@ -2762,6 +2767,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser

    private native String[] nativeGetAccessoryStrings();

    private native String[] nativeGetAccessoryStringsFromFfs();

    private native ParcelFileDescriptor nativeOpenAccessory();

    private native String nativeWaitAndGetProperty(String propName);