@@ -87,10 +87,13 @@ public class UsbDeviceManager {
8787
8888 private static final int MSG_UPDATE_STATE = 0 ;
8989 private static final int MSG_ENABLE_ADB = 1 ;
90- private static final int MSG_SET_CURRENT_FUNCTION = 2 ;
90+ private static final int MSG_SET_CURRENT_FUNCTIONS = 2 ;
9191 private static final int MSG_SYSTEM_READY = 3 ;
9292 private static final int MSG_BOOT_COMPLETED = 4 ;
9393
94+ private static final int AUDIO_MODE_NONE = 0 ;
95+ private static final int AUDIO_MODE_SOURCE = 1 ;
96+
9497 // Delay for debouncing USB disconnects.
9598 // We often get rapid connect/disconnect events when enabling USB functions,
9699 // which need debouncing.
@@ -110,6 +113,7 @@ public class UsbDeviceManager {
110113 private boolean mAdbEnabled ;
111114 private boolean mAudioSourceEnabled ;
112115 private Map <String , List <Pair <String , String >>> mOemModeMap ;
116+ private String [] mAccessoryStrings ;
113117
114118 private class AdbSettingsObserver extends ContentObserver {
115119 public AdbSettingsObserver () {
@@ -137,7 +141,7 @@ public void onUEvent(UEventObserver.UEvent event) {
137141 mHandler .updateState (state );
138142 } else if ("START" .equals (accessory )) {
139143 if (DEBUG ) Slog .d (TAG , "got accessory start" );
140- setCurrentFunction ( UsbManager . USB_FUNCTION_ACCESSORY , false );
144+ startAccessoryMode ( );
141145 }
142146 }
143147 };
@@ -160,7 +164,7 @@ public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) {
160164
161165 if (nativeIsStartRequested ()) {
162166 if (DEBUG ) Slog .d (TAG , "accessory attached at boot" );
163- setCurrentFunction ( UsbManager . USB_FUNCTION_ACCESSORY , false );
167+ startAccessoryMode ( );
164168 }
165169 }
166170
@@ -187,6 +191,29 @@ public void systemReady() {
187191 mHandler .sendEmptyMessage (MSG_SYSTEM_READY );
188192 }
189193
194+ private void startAccessoryMode () {
195+ mAccessoryStrings = nativeGetAccessoryStrings ();
196+ boolean enableAudio = (nativeGetAudioMode () == AUDIO_MODE_SOURCE );
197+ // don't start accessory mode if our mandatory strings have not been set
198+ boolean enableAccessory = (mAccessoryStrings != null &&
199+ mAccessoryStrings [UsbAccessory .MANUFACTURER_STRING ] != null &&
200+ mAccessoryStrings [UsbAccessory .MODEL_STRING ] != null );
201+ String functions = null ;
202+
203+ if (enableAccessory && enableAudio ) {
204+ functions = UsbManager .USB_FUNCTION_ACCESSORY + ","
205+ + UsbManager .USB_FUNCTION_AUDIO_SOURCE ;
206+ } else if (enableAccessory ) {
207+ functions = UsbManager .USB_FUNCTION_ACCESSORY ;
208+ } else if (enableAudio ) {
209+ functions = UsbManager .USB_FUNCTION_AUDIO_SOURCE ;
210+ }
211+
212+ if (functions != null ) {
213+ setCurrentFunctions (functions , false );
214+ }
215+ }
216+
190217 private static void initRndisAddress () {
191218 // configure RNDIS ethernet address based on our serial number using the same algorithm
192219 // we had been previously using in kernel board files
@@ -467,9 +494,8 @@ private void updateCurrentAccessory() {
467494 if (!mHasUsbAccessory ) return ;
468495
469496 if (mConfigured ) {
470- String [] strings = nativeGetAccessoryStrings ();
471- if (strings != null ) {
472- mCurrentAccessory = new UsbAccessory (strings );
497+ if (mAccessoryStrings != null ) {
498+ mCurrentAccessory = new UsbAccessory (mAccessoryStrings );
473499 Slog .d (TAG , "entering USB accessory mode: " + mCurrentAccessory );
474500 // defer accessoryAttached if system is not ready
475501 if (mBootCompleted ) {
@@ -489,6 +515,7 @@ private void updateCurrentAccessory() {
489515 mSettingsManager .accessoryDetached (mCurrentAccessory );
490516 }
491517 mCurrentAccessory = null ;
518+ mAccessoryStrings = null ;
492519 }
493520 }
494521 }
@@ -561,10 +588,10 @@ public void handleMessage(Message msg) {
561588 case MSG_ENABLE_ADB :
562589 setAdbEnabled (msg .arg1 == 1 );
563590 break ;
564- case MSG_SET_CURRENT_FUNCTION :
565- String function = (String )msg .obj ;
591+ case MSG_SET_CURRENT_FUNCTIONS :
592+ String functions = (String )msg .obj ;
566593 boolean makeDefault = (msg .arg1 == 1 );
567- setEnabledFunctions (function , makeDefault );
594+ setEnabledFunctions (functions , makeDefault );
568595 break ;
569596 case MSG_SYSTEM_READY :
570597 updateUsbNotification ();
@@ -717,9 +744,9 @@ public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
717744 return nativeOpenAccessory ();
718745 }
719746
720- public void setCurrentFunction (String function , boolean makeDefault ) {
721- if (DEBUG ) Slog .d (TAG , "setCurrentFunction (" + function + ") default: " + makeDefault );
722- mHandler .sendMessage (MSG_SET_CURRENT_FUNCTION , function , makeDefault );
747+ public void setCurrentFunctions (String functions , boolean makeDefault ) {
748+ if (DEBUG ) Slog .d (TAG , "setCurrentFunctions (" + functions + ") default: " + makeDefault );
749+ mHandler .sendMessage (MSG_SET_CURRENT_FUNCTIONS , functions , makeDefault );
723750 }
724751
725752 public void setMassStorageBackingFile (String path ) {
@@ -787,4 +814,5 @@ public void dump(FileDescriptor fd, PrintWriter pw) {
787814 private native String [] nativeGetAccessoryStrings ();
788815 private native ParcelFileDescriptor nativeOpenAccessory ();
789816 private native boolean nativeIsStartRequested ();
817+ private native int nativeGetAudioMode ();
790818}
0 commit comments