diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 27b8cdf83b5b2..60cb08f00f891 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -153,6 +153,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private static final int MSG_SET_FUNCTIONS_TIMEOUT = 15; private static final int MSG_GET_CURRENT_USB_FUNCTIONS = 16; private static final int MSG_FUNCTION_SWITCH_TIMEOUT = 17; + private static final int MSG_GADGET_HAL_REGISTERED = 18; private static final int AUDIO_MODE_SOURCE = 1; @@ -1708,10 +1709,16 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser protected static final String CTL_STOP = "ctl.stop"; /** - * Adb natvie daemon + * Adb native daemon. */ protected static final String ADBD = "adbd"; + /** + * Gadget HAL fully qualified instance name for registering for ServiceNotification. + */ + protected static final String GADGET_HAL_FQ_NAME = + "android.hardware.usb.gadget@1.0::IUsbGadget"; + protected boolean mCurrentUsbFunctionsRequested; UsbHandlerHal(Looper looper, Context context, UsbDeviceManager deviceManager, @@ -1721,8 +1728,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser ServiceNotification serviceNotification = new ServiceNotification(); boolean ret = IServiceManager.getService() - .registerForNotifications("android.hardware.usb.gadget@1.0::IUsbGadget", - "", serviceNotification); + .registerForNotifications(GADGET_HAL_FQ_NAME, "", serviceNotification); if (!ret) { Slog.e(TAG, "Failed to register usb gadget service start notification"); return; @@ -1764,20 +1770,12 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser @Override public void onRegistration(String fqName, String name, boolean preexisting) { Slog.i(TAG, "Usb gadget hal service started " + fqName + " " + name); - synchronized (mGadgetProxyLock) { - try { - mGadgetProxy = IUsbGadget.getService(); - mGadgetProxy.linkToDeath(new UsbGadgetDeathRecipient(), - USB_GADGET_HAL_DEATH_COOKIE); - if (!mCurrentFunctionsApplied && !mCurrentUsbFunctionsRequested) { - setEnabledFunctions(mCurrentFunctions, false); - } - } catch (NoSuchElementException e) { - Slog.e(TAG, "Usb gadget hal not found", e); - } catch (RemoteException e) { - Slog.e(TAG, "Usb Gadget hal not responding", e); - } + if (!fqName.equals(GADGET_HAL_FQ_NAME)) { + Slog.e(TAG, "fqName does not match"); + return; } + + sendMessage(MSG_GADGET_HAL_REGISTERED, preexisting); } } @@ -1815,6 +1813,23 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser setEnabledFunctions(UsbManager.FUNCTION_NONE, !isAdbEnabled()); } break; + case MSG_GADGET_HAL_REGISTERED: + boolean preexisting = msg.arg1 == 1; + synchronized (mGadgetProxyLock) { + try { + mGadgetProxy = IUsbGadget.getService(); + mGadgetProxy.linkToDeath(new UsbGadgetDeathRecipient(), + USB_GADGET_HAL_DEATH_COOKIE); + if (!mCurrentFunctionsApplied && !preexisting) { + setEnabledFunctions(mCurrentFunctions, false); + } + } catch (NoSuchElementException e) { + Slog.e(TAG, "Usb gadget hal not found", e); + } catch (RemoteException e) { + Slog.e(TAG, "Usb Gadget hal not responding", e); + } + } + break; default: super.handleMessage(msg); }