diff options
author | Joey Grover <joeygrover@gmail.com> | 2018-11-30 15:29:31 -0500 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2018-11-30 15:29:31 -0500 |
commit | 220979aa3c35595bd556a109c960adc596e3ccf2 (patch) | |
tree | 69bb41d47909cf7f5f675ec7c066799fdcb2db77 | |
parent | 13e336dbd108f058b3c29b0274fcdc5b2b574fef (diff) | |
download | sdl_android-bugfix/usb_enhacements_wait.tar.gz |
Implement wait for AOAbugfix/usb_enhacements_wait
Providing in a single commit for easy revert
8 files changed, 133 insertions, 39 deletions
diff --git a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java index 4ca01ac5b..efa72a02f 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java @@ -1129,7 +1129,9 @@ public class SdlProtocol { public void onTransportDisconnected(String info, TransportRecord disconnectedTransport, List<TransportRecord> connectedTransports) { if (disconnectedTransport == null) { Log.d(TAG, "onTransportDisconnected"); - transportManager.close(iSdlProtocol.getSessionId()); + if(transportManager!=null){ + transportManager.close(iSdlProtocol.getSessionId()); + } iSdlProtocol.shutdown("No transports left connected"); return; } else { diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/MultiplexUsbTransport.java b/sdl_android/src/main/java/com/smartdevicelink/transport/MultiplexUsbTransport.java index 2c40bae40..2447d9e79 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/MultiplexUsbTransport.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/MultiplexUsbTransport.java @@ -119,11 +119,13 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ protected synchronized void stop(int stateToTransitionTo) { //Log.d(TAG, "Attempting to close the Usb transports"); if (writerThread != null) { + writerThread.interrupt(); writerThread.cancel(); writerThread = null; } if (readerThread != null) { + readerThread.interrupt(); readerThread.cancel(); readerThread = null; } @@ -192,7 +194,7 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ private class ReaderThread extends Thread{ SdlPsm psm; - final InputStream inputStream; + InputStream inputStream; public ReaderThread(final FileDescriptor fileDescriptor){ psm = new SdlPsm(); @@ -218,11 +220,11 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ Log.i(TAG,"EOF reached, disconnecting!"); connectionLost(); } - return; + break; } if (isInterrupted()) { Log.w(TAG,"Read some data, but thread is interrupted"); - return; + break; } byte input; for(int i=0;i<bytesRead; i++){ @@ -272,6 +274,7 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ // Log.trace(TAG, "Read Thread: " + e.getMessage()); // Socket or stream is already closed } + inputStream = null; } } @@ -282,7 +285,7 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ * It handles all incoming and outgoing transmissions. */ private class WriterThread extends Thread { - private final OutputStream mmOutStream; + private OutputStream mmOutStream; public WriterThread(FileDescriptor fileDescriptor) { //Log.d(TAG, "Creating a Connected - Write Thread"); @@ -324,6 +327,7 @@ public class MultiplexUsbTransport extends MultiplexBaseTransport{ // close() of connect socket failed Log.d(TAG, "Write Thread: " + e.getMessage()); } + mmOutStream = null; } } } diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java index 9a95964d1..786817a72 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java @@ -835,6 +835,9 @@ public class SdlRouterService extends Service{ service.usbTransport = new MultiplexUsbTransport(parcelFileDescriptor, service.usbHandler, msg.getData()); service.usbTransport.start(); } + if(service.altTransportTimerHandler != null && service.altTransportTimerRunnable != null){ + service.altTransportTimerHandler.removeCallbacks(service.altTransportTimerRunnable); + } if(msg.replyTo!=null){ Message message = Message.obtain(); diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java b/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java index 878715147..d93ffa39e 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java @@ -44,6 +44,7 @@ import android.os.Parcelable; import android.support.annotation.RequiresApi;
import android.util.Log;
+import com.smartdevicelink.R;
import com.smartdevicelink.util.AndroidTools;
import com.smartdevicelink.util.DebugTool;
import com.smartdevicelink.util.SdlAppInfo;
@@ -98,6 +99,9 @@ public class USBAccessoryAttachmentActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setTheme(R.style.usbDialogTheme);
+ setContentView(R.layout.activity_usb);
+
}
@Override
diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java b/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java index 193c8879c..72439404b 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java @@ -69,6 +69,7 @@ public class UsbTransferProvider { UsbTransferCallback callback; Messenger routerServiceMessenger = null; + UsbAccessory usbAccessory; ParcelFileDescriptor usbPfd; Bundle usbInfoBundle; @@ -78,9 +79,10 @@ public class UsbTransferProvider { Log.d(TAG, "Bound to service " + className.toString()); routerServiceMessenger = new Messenger(service); isBound = true; + attemptUsbOpen(); //So we just established our connection //Register with router service - Message msg = Message.obtain(); + /* Message msg = Message.obtain(); msg.what = TransportConstants.USB_CONNECTED_WITH_DEVICE; msg.arg1 = flags; msg.replyTo = clientMessenger; @@ -92,7 +94,7 @@ public class UsbTransferProvider { routerServiceMessenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); - } + }*/ } public void onServiceDisconnected(ComponentName className) { @@ -102,32 +104,63 @@ public class UsbTransferProvider { } }; - public UsbTransferProvider(Context context, ComponentName service, UsbAccessory usbAccessory, UsbTransferCallback callback){ + private void attemptUsbOpen(){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Log.i(TAG, "run: in the runner"); + usbPfd = getFileDescriptor(usbAccessory, UsbTransferProvider.this.context); + if(usbPfd != null){ + + usbInfoBundle = new Bundle(); + usbInfoBundle.putString(MultiplexUsbTransport.MANUFACTURER, usbAccessory.getManufacturer()); + usbInfoBundle.putString(MultiplexUsbTransport.MODEL, usbAccessory.getModel()); + usbInfoBundle.putString(MultiplexUsbTransport.VERSION, usbAccessory.getVersion()); + usbInfoBundle.putString(MultiplexUsbTransport.URI, usbAccessory.getUri()); + usbInfoBundle.putString(MultiplexUsbTransport.SERIAL, usbAccessory.getSerial()); + usbInfoBundle.putString(MultiplexUsbTransport.DESCRIPTION, usbAccessory.getDescription()); + + Message msg = Message.obtain(); + msg.what = TransportConstants.USB_CONNECTED_WITH_DEVICE; + msg.arg1 = flags; + msg.replyTo = clientMessenger; + msg.obj = usbPfd; + if(usbInfoBundle != null){ + msg.setData(usbInfoBundle); + } + try { + routerServiceMessenger.send(msg); + } catch (RemoteException e) { + e.printStackTrace(); + }catch (NullPointerException nullE){ + nullE.printStackTrace(); + finish(false); + } + + }else{ + Log.e(TAG, "Unable to open accessory"); + if(UsbTransferProvider.this.callback != null){ + finish(false); + } + } + } + }, 5000); + + } + + public UsbTransferProvider(Context context, ComponentName service, final UsbAccessory usbAccessory, UsbTransferCallback callback){ if(context == null || service == null || usbAccessory == null){ throw new IllegalStateException("Supplied params are not correct. Context == null? "+ (context==null) + " ComponentName == null? " + (service == null) + " Usb Accessory == null? " + usbAccessory); } - usbPfd = getFileDescriptor(usbAccessory, context); - if(usbPfd != null){ - this.context = context; - this.routerService = service; - this.callback = callback; - this.clientMessenger = new Messenger(new ClientHandler(this)); - - usbInfoBundle = new Bundle(); - usbInfoBundle.putString(MultiplexUsbTransport.MANUFACTURER, usbAccessory.getManufacturer()); - usbInfoBundle.putString(MultiplexUsbTransport.MODEL, usbAccessory.getModel()); - usbInfoBundle.putString(MultiplexUsbTransport.VERSION, usbAccessory.getVersion()); - usbInfoBundle.putString(MultiplexUsbTransport.URI, usbAccessory.getUri()); - usbInfoBundle.putString(MultiplexUsbTransport.SERIAL, usbAccessory.getSerial()); - usbInfoBundle.putString(MultiplexUsbTransport.DESCRIPTION, usbAccessory.getDescription()); - checkIsConnected(); - }else{ - Log.e(TAG, "Unable to open accessory"); - clientMessenger = null; - if(callback != null){ - callback.onUsbTransferUpdate(false); - } - } + + this.context = context; + this.routerService = service; + this.callback = callback; + this.clientMessenger = new Messenger(new ClientHandler(this)); + this.usbAccessory = usbAccessory; + + checkIsConnected(); + } @@ -139,7 +172,7 @@ public class UsbTransferProvider { if (manager != null) { return manager.openAccessory(accessory); } - }catch (Exception e){} + }catch (Exception e){e.printStackTrace();} return null; } @@ -190,19 +223,21 @@ public class UsbTransferProvider { } } - private void finish(){ - try { - usbPfd.close(); - } catch (IOException e) { - e.printStackTrace(); - } + private void finish(boolean success){ + if(usbPfd != null) { + try { + usbPfd.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } usbPfd = null; unBindFromService(); routerServiceMessenger =null; context = null; System.gc(); if(callback != null){ - callback.onUsbTransferUpdate(true); + callback.onUsbTransferUpdate(success); } } @@ -222,7 +257,7 @@ public class UsbTransferProvider { switch (msg.what) { case TransportConstants.ROUTER_USB_ACC_RECEIVED: Log.d(TAG, "Successful USB transfer"); - provider.get().finish(); + provider.get().finish(true); break; default: break; diff --git a/sdl_android/src/main/res/layout/activity_usb.xml b/sdl_android/src/main/res/layout/activity_usb.xml new file mode 100644 index 000000000..663351465 --- /dev/null +++ b/sdl_android/src/main/res/layout/activity_usb.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@android:color/background_dark"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="match_parent" + android:layout_height="120dp" + android:layout_above="@id/spacer" + android:layout_centerHorizontal="true" + android:src="@drawable/sdl_lockscreen_icon" /> + + <View + android:id="@+id/spacer" + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_centerInParent="true"/> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/spacer" + android:layout_centerHorizontal="true" + android:textSize="25sp" + android:gravity="center" + android:textColor="@android:color/white" + android:text="Attempting to open USB connection" /> +</RelativeLayout>
\ No newline at end of file diff --git a/sdl_android/src/main/res/values/strings.xml b/sdl_android/src/main/res/values/strings.xml index 1d55ec24d..035793e49 100644 --- a/sdl_android/src/main/res/values/strings.xml +++ b/sdl_android/src/main/res/values/strings.xml @@ -3,4 +3,5 @@ <string name="lockscreen_text">Locked for your safety</string> <string name="lockscreen_image_description">SDL Icon</string> <string name="lockscreen_device_image_description">Device Icon</string> + <string name="usb_title">SDL over USB</string> </resources>
\ No newline at end of file diff --git a/sdl_android/src/main/res/values/styles.xml b/sdl_android/src/main/res/values/styles.xml new file mode 100644 index 000000000..1c52c9f6a --- /dev/null +++ b/sdl_android/src/main/res/values/styles.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="usbDialogTheme" parent="@android:style/Theme.Dialog"> + <item name="android:windowNoTitle">true</item> + <item name="android:windowFrame">@null</item> + <item name="android:background">@android:color/transparent</item> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:windowIsFloating">true</item> + <item name="android:backgroundDimEnabled">false</item> + <item name="android:windowContentOverlay">@null</item> + </style> + +</resources>
\ No newline at end of file |