summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2018-11-30 15:29:31 -0500
committerJoey Grover <joeygrover@gmail.com>2018-11-30 15:29:31 -0500
commit220979aa3c35595bd556a109c960adc596e3ccf2 (patch)
tree69bb41d47909cf7f5f675ec7c066799fdcb2db77
parent13e336dbd108f058b3c29b0274fcdc5b2b574fef (diff)
downloadsdl_android-bugfix/usb_enhacements_wait.tar.gz
Implement wait for AOAbugfix/usb_enhacements_wait
Providing in a single commit for easy revert
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java4
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/MultiplexUsbTransport.java12
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java3
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java4
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java103
-rw-r--r--sdl_android/src/main/res/layout/activity_usb.xml31
-rw-r--r--sdl_android/src/main/res/values/strings.xml1
-rw-r--r--sdl_android/src/main/res/values/styles.xml14
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