diff options
author | Bilal Alsharifi <bilal.alsharifi@gmail.com> | 2019-01-17 11:49:49 -0500 |
---|---|---|
committer | Bilal Alsharifi <bilal.alsharifi@gmail.com> | 2019-01-17 11:49:49 -0500 |
commit | ecb5475f94e6cc596464837c353c3ff9751e1942 (patch) | |
tree | 4d02bb31f931a960105bbb8592a1bba6f897d79e | |
parent | b4bdd215e56f9c3e5f6615ddd5d9f83f2eb09ff2 (diff) | |
download | sdl_android-ecb5475f94e6cc596464837c353c3ff9751e1942.tar.gz |
Add a receiver to monitor usb cable status updates
3 files changed, 52 insertions, 11 deletions
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..31ac32486 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) { + removeCallbacks(usbCableDisconnectRunnable); + if (provider.get().usbTransport != null) { + provider.get().usbTransport.stop(); + } + try { + provider.get().unregisterReceiver(usbCableDisconnectBroadcastReceiver); + } catch (Exception e){} + } + } + }; + 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; + } } |