diff options
author | Joey Grover <joeygrover@gmail.com> | 2019-01-22 16:48:00 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-22 16:48:00 -0500 |
commit | f2647ec517fcaa33eb3e12757fd310d7315309ce (patch) | |
tree | c7a1f16d9559b8063f1a39de8beb533db9d2e215 | |
parent | b4bdd215e56f9c3e5f6615ddd5d9f83f2eb09ff2 (diff) | |
parent | c3f2ef46390e09d8db5c742e3d48b7fb2764dafb (diff) | |
download | sdl_android-f2647ec517fcaa33eb3e12757fd310d7315309ce.tar.gz |
Merge pull request #968 from smartdevicelink/bugfix/usb_enhacements_batterybugfix/usb_enhacements
More usb enhancements
4 files changed, 54 insertions, 12 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..4f15fda6f 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlProtocol.java @@ -1150,7 +1150,7 @@ public class SdlProtocol { activeTransports.remove(SessionType.PCM); } - if(disconnectedTransport.equals(getTransportForSession(SessionType.RPC))){ + if(disconnectedTransport.equals(getTransportForSession(SessionType.RPC)) || disconnectedTransport.equals(connectedPrimaryTransport)){ //transportTypes.remove(type); boolean primaryTransportAvailable = false; if(requestedPrimaryTransports != null && requestedPrimaryTransports.size() > 1){ @@ -1164,6 +1164,7 @@ public class SdlProtocol { } } } + connectedPrimaryTransport = null; transportManager.close(iSdlProtocol.getSessionId()); transportManager = null; requestedSession = false; 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 c23eaf8b7..500db60de 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java @@ -37,7 +37,6 @@ import static com.smartdevicelink.transport.TransportConstants.FORMED_PACKET_EXT import static com.smartdevicelink.transport.TransportConstants.HARDWARE_DISCONNECTED; import static com.smartdevicelink.transport.TransportConstants.SEND_PACKET_TO_APP_LOCATION_EXTRA_NAME; -import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; @@ -46,7 +45,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Set; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; @@ -83,6 +81,7 @@ import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.BatteryManager; import android.os.Build; import android.os.Bundle; import android.os.DeadObjectException; @@ -816,6 +815,8 @@ public class SdlRouterService extends Service{ @SuppressWarnings("Convert2Diamond") static class UsbTransferHandler extends Handler { final WeakReference<SdlRouterService> provider; + Runnable usbCableDisconnectRunnable; + BroadcastReceiver usbCableDisconnectBroadcastReceiver; public UsbTransferHandler(SdlRouterService provider){ this.provider = new WeakReference<SdlRouterService>(provider); @@ -839,14 +840,39 @@ public class SdlRouterService extends Service{ //New USB constructor with PFD service.usbTransport = new MultiplexUsbTransport(parcelFileDescriptor, service.usbHandler, msg.getData()); - postDelayed(new Runnable() { + + usbCableDisconnectRunnable = new Runnable() { @Override public void run() { - if(provider.get() != null){ + if(provider.get() != null && AndroidTools.isUSBCableConnected(provider.get().getApplicationContext())) { provider.get().usbTransport.start(); } } - }, 4000); + }; + postDelayed(usbCableDisconnectRunnable, 4000); + + + // Register a BroadcastReceiver to stop USB transport if USB cable got disconnected + if (provider.get() != null) { + usbCableDisconnectBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + if (provider.get()!= null && plugged != BatteryManager.BATTERY_PLUGGED_AC && plugged != BatteryManager.BATTERY_PLUGGED_USB) { + try { + provider.get().getApplicationContext().unregisterReceiver(usbCableDisconnectBroadcastReceiver); + } catch (Exception e){ } + removeCallbacks(usbCableDisconnectRunnable); + if (provider.get().usbTransport != null) { + provider.get().usbTransport.stop(); + } + } + } + }; + provider.get().getApplicationContext().registerReceiver(usbCableDisconnectBroadcastReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + } + + } if(msg.replyTo!=null){ 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 92429571f..1479fa9e1 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java +++ b/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java @@ -133,14 +133,16 @@ public class UsbTransferProvider { @SuppressLint("NewApi") private ParcelFileDescriptor getFileDescriptor(UsbAccessory accessory, Context context) { - try { - UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + if (AndroidTools.isUSBCableConnected(context)) { + try { + UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE); - if (manager != null) { - return manager.openAccessory(accessory); + if (manager != null) { + return manager.openAccessory(accessory); + } + } catch (Exception e) { } - }catch (Exception e){} - + } return null; } diff --git a/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java b/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java index 62f379031..4237845b7 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java +++ b/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java @@ -35,11 +35,13 @@ package com.smartdevicelink.util; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.os.BatteryManager; import com.smartdevicelink.transport.TransportConstants; @@ -160,4 +162,15 @@ public class AndroidTools { } } + /** + * Checks if the usb cable is physically connected or not + * Note: the intent here is a sticky intent so registerReceiver is actually a synchronous call and doesn't register a receiver on each call + * @param context a context instance + * @return boolean value that represents whether the usb cable is physically connected or not + */ + public static boolean isUSBCableConnected(Context context) { + Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB; + } } |