diff options
author | Joey Grover <joeygrover@gmail.com> | 2020-06-26 13:48:28 -0400 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2020-06-26 13:48:28 -0400 |
commit | 4234bcc14808e3e3dc143ea75afdcdedbfacec55 (patch) | |
tree | ef72a06b979797491f6c46e7eb1f139b4912d71e | |
parent | a5cc3d19814d1460299b9636bc645dd5d9a83b6b (diff) | |
download | sdl_android-bugfix/refactor_lcm_updates.tar.gz |
Refactor TransportBroker to fit with LCMbugfix/refactor_lcm_updates
With some of the removed queues out of the proxy base class, the tarnsport broker was experiencing some issues shutting down.
-rw-r--r-- | android/sdl_android/src/main/java/com/smartdevicelink/transport/TransportBroker.java | 102 |
1 files changed, 41 insertions, 61 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/TransportBroker.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/TransportBroker.java index 710e9d610..003556109 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/TransportBroker.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/TransportBroker.java @@ -86,8 +86,7 @@ public class TransportBroker { private Context currentContext = null; private final Object INIT_LOCK = new Object(); - - private TransportType queuedOnTransportConnect = null; + private final Object MESSAGE_SEND_LOCK = new Object(); Messenger routerServiceMessenger = null; final Messenger clientMessenger; @@ -126,59 +125,55 @@ public class TransportBroker { }; } - protected synchronized boolean sendMessageToRouterService(Message message) { + protected boolean sendMessageToRouterService(Message message) { return sendMessageToRouterService(message, 0); } - protected synchronized boolean sendMessageToRouterService(Message message, int retryCount) { - if (message == null) { - Log.w(TAG, "Attempted to send null message"); - return false; - } - //Log.i(TAG, "Attempting to send message type - " + message.what); - if (isBound && routerServiceMessenger != null) { - if (registeredWithRouterService - || message.what == TransportConstants.ROUTER_REGISTER_CLIENT) { //We can send a message if we are registered or are attempting to register - try { - routerServiceMessenger.send(message); - return true; - } catch (RemoteException e) { - e.printStackTrace(); - //Let's check to see if we should retry - if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && e instanceof TransactionTooLargeException ) - || (retryCount < 5 && routerServiceMessenger.getBinder().isBinderAlive() && routerServiceMessenger.getBinder().pingBinder())) { //We probably just failed on a small transaction =\ - try { - Thread.sleep(100); - } catch (InterruptedException e1) { - e1.printStackTrace(); + protected boolean sendMessageToRouterService(Message message, int retryCount) { + synchronized (MESSAGE_SEND_LOCK) { + if (message == null) { + Log.w(TAG, "Attempted to send null message"); + return false; + } + //Log.i(TAG, "Attempting to send message type - " + message.what); + if (isBound && routerServiceMessenger != null && routerServiceMessenger.getBinder() != null && routerServiceMessenger.getBinder().isBinderAlive()) { + if (registeredWithRouterService + || message.what == TransportConstants.ROUTER_REGISTER_CLIENT) { //We can send a message if we are registered or are attempting to register + try { + routerServiceMessenger.send(message); + return true; + } catch (RemoteException e) { + e.printStackTrace(); + //Let's check to see if we should retry + if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && e instanceof TransactionTooLargeException) + || (retryCount < 5 && routerServiceMessenger.getBinder().isBinderAlive() && routerServiceMessenger.getBinder().pingBinder())) { //We probably just failed on a small transaction =\ + try { + Thread.sleep(100); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + return sendMessageToRouterService(message, retryCount++); + } else { + //DeadObject, time to kill our connection + Log.d(TAG, "Dead object while attempting to send packet"); + stop(); + onHardwareDisconnected(null, null); + return false; } - return sendMessageToRouterService(message, retryCount++); - } else { - //DeadObject, time to kill our connection - Log.d(TAG, "Dead object while attempting to send packet"); - routerServiceMessenger = null; - registeredWithRouterService = false; - unBindFromRouterService(); - isBound = false; + } catch (NullPointerException e) { + Log.d(TAG, "Null messenger while attempting to send packet"); // NPE, routerServiceMessenger is null + stop(); onHardwareDisconnected(null, null); return false; } - } catch (NullPointerException e) { - Log.d(TAG, "Null messenger while attempting to send packet"); // NPE, routerServiceMessenger is null - routerServiceMessenger = null; - registeredWithRouterService = false; - unBindFromRouterService(); - isBound = false; - onHardwareDisconnected(null, null); + } else { + Log.e(TAG, "Unable to send message to router service. Not registered."); return false; } } else { - Log.e(TAG, "Unable to send message to router service. Not registered."); + Log.e(TAG, "Unable to send message to router service. Not bound."); return false; } - } else { - Log.e(TAG, "Unable to send message to router service. Not bound."); - return false; } } @@ -416,7 +411,6 @@ public class TransportBroker { } //this.appId = appId.concat(timeStamp); this.appId = appId; - queuedOnTransportConnect = null; currentContext = context; //Log.d(TAG, "Registering our reply receiver: " + whereToReply); this.routerService = service; @@ -448,7 +442,6 @@ public class TransportBroker { synchronized (INIT_LOCK) { unregisterWithRouterService(); routerServiceMessenger = null; - queuedOnTransportConnect = null; unBindFromRouterService(); isBound = false; } @@ -463,13 +456,12 @@ public class TransportBroker { unregisterWithRouterService(); unBindFromRouterService(); routerServiceMessenger = null; - queuedOnTransportConnect = null; currentContext = null; } } - private synchronized void unBindFromRouterService() { + private void unBindFromRouterService() { try { getContext().unbindService(routerConnection); @@ -487,27 +479,17 @@ public class TransportBroker { public void onServiceUnregsiteredFromRouterService(int unregisterCode) { - queuedOnTransportConnect = null; } @Deprecated public void onHardwareDisconnected(TransportType type) { - routerServiceDisconnect(); + stop(); } public void onHardwareDisconnected(TransportRecord record, List<TransportRecord> connectedTransports) { } - private void routerServiceDisconnect() { - synchronized (INIT_LOCK) { - unBindFromRouterService(); - routerServiceMessenger = null; - routerConnection = null; - queuedOnTransportConnect = null; - } - } - /** * WILL NO LONGER BE CALLED * @@ -518,7 +500,6 @@ public class TransportBroker { public boolean onHardwareConnected(TransportType type) { synchronized (INIT_LOCK) { if (routerServiceMessenger == null) { - queuedOnTransportConnect = type; return false; } return true; @@ -528,7 +509,6 @@ public class TransportBroker { public boolean onHardwareConnected(List<TransportRecord> transports) { synchronized (INIT_LOCK) { if (routerServiceMessenger == null && transports != null && transports.size() > 0) { - queuedOnTransportConnect = transports.get(transports.size() - 1).getType(); return false; } return true; @@ -616,7 +596,7 @@ public class TransportBroker { ByteArrayMessageSpliter splitter = new ByteArrayMessageSpliter(appId, TransportConstants.ROUTER_SEND_PACKET, bytes, packet.getPrioirtyCoefficient()); splitter.setRouterServiceVersion(routerServiceVersion); splitter.setTransportRecord(packet.getTransportRecord()); - while (splitter.isActive()) { + while (splitter.isActive() && routerServiceMessenger != null) { sendMessageToRouterService(splitter.nextMessage()); } return splitter.close(); |