summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Alsharifi <bilal.alsharifi@gmail.com>2019-01-17 11:49:49 -0500
committerBilal Alsharifi <bilal.alsharifi@gmail.com>2019-01-17 11:49:49 -0500
commitecb5475f94e6cc596464837c353c3ff9751e1942 (patch)
tree4d02bb31f931a960105bbb8592a1bba6f897d79e
parentb4bdd215e56f9c3e5f6615ddd5d9f83f2eb09ff2 (diff)
downloadsdl_android-ecb5475f94e6cc596464837c353c3ff9751e1942.tar.gz
Add a receiver to monitor usb cable status updates
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java36
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java14
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java13
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;
+ }
}