Loading android/app/src/com/android/bluetooth/sap/SapRilReceiver.java +20 −15 Original line number Diff line number Diff line Loading @@ -29,12 +29,14 @@ public class SapRilReceiver implements Runnable { CodedOutputStreamMicro mRilBtOutStream = null; InputStream mRilBtInStream = null; private Handler mSapServerMsgHandler = null; private Handler mSapServiceHandler = null; public static final int RIL_MAX_COMMAND_BYTES = (8 * 1024); byte[] buffer = new byte[RIL_MAX_COMMAND_BYTES]; public SapRilReceiver(Handler SapServerMsgHandler) { public SapRilReceiver(Handler SapServerMsgHandler, Handler sapServiceHandler) { mSapServerMsgHandler = SapServerMsgHandler; mSapServiceHandler = sapServiceHandler; } /** Loading Loading @@ -188,7 +190,6 @@ public class SapRilReceiver implements Runnable { public void run() { try { int length = 0; if (VERBOSE) Log.i(TAG, "Starting RilBtReceiverThread..."); mSocket = openRilBtSocket(); Loading @@ -203,10 +204,14 @@ public class SapRilReceiver implements Runnable { SapMessage sapMsg = null; MsgHeader rilMsg; if (VERBOSE) Log.i(TAG, "Waiting for incoming message..."); length = readMessage(mRilBtInStream, buffer); CodedInputStreamMicro msgStream = CodedInputStreamMicro.newInstance(buffer, 0, length); int length = readMessage(mRilBtInStream, buffer); SapService.notifyUpdateWakeLock(mSapServiceHandler); CodedInputStreamMicro msgStream = CodedInputStreamMicro.newInstance(buffer, 0, length); rilMsg = MsgHeader.parseFrom(msgStream); if (VERBOSE) Log.i(TAG, "Message received."); Loading android/app/src/com/android/bluetooth/sap/SapServer.java +3 −1 Original line number Diff line number Diff line Loading @@ -279,7 +279,7 @@ public class SapServer extends Thread implements Callback { Looper sapLooper = mHandlerThread.getLooper(); /* This will return when the looper is ready */ mSapHandler = new Handler(sapLooper, this); mRilBtReceiver = new SapRilReceiver(mSapHandler); mRilBtReceiver = new SapRilReceiver(mSapHandler, mSapServiceHandler); mRilBtReceiverThread = new Thread(mRilBtReceiver, "RilBtReceiver"); setNotification(SapMessage.DISC_GRACEFULL,0); boolean done = false; Loading @@ -290,6 +290,8 @@ public class SapServer extends Thread implements Callback { done = true; // EOF reached } else { SapMessage msg = SapMessage.readMessage(requestType, mRfcommIn); /* notify about an incoming message from the BT Client */ SapService.notifyUpdateWakeLock(mSapServiceHandler); if(msg != null && mState != SAP_STATE.DISCONNECTING) { switch (requestType) { Loading android/app/src/com/android/bluetooth/sap/SapService.java +65 −9 Original line number Diff line number Diff line Loading @@ -58,6 +58,19 @@ public class SapService extends ProfileService { public static final int MSG_SESSION_ESTABLISHED = 5001; public static final int MSG_SESSION_DISCONNECTED = 5002; public static final int MSG_ACQUIRE_WAKE_LOCK = 5005; public static final int MSG_RELEASE_WAKE_LOCK = 5006; /* Each time a transaction between the SIM and the BT Client is detected a wakelock is taken. * After an idle period of RELEASE_WAKE_LOCK_DELAY ms the wakelock is released. * * NOTE: While connected the the Nokia 616 car-kit it was noticed that the carkit do * TRANSFER_APDU_REQ with 20-30 seconds interval, and it sends no requests less than 1 sec * apart. Additionally the responses from the RIL comes within a few ms, hence a one * second timeout should be enough. */ private static final int RELEASE_WAKE_LOCK_DELAY = 1000; /* Intent indicating timeout for user confirmation. */ public static final String USER_CONFIRM_TIMEOUT_ACTION = "com.android.bluetooth.sap.USER_CONFIRM_TIMEOUT"; Loading Loading @@ -93,6 +106,22 @@ public class SapService extends ProfileService { mState = BluetoothSap.STATE_DISCONNECTED; } /*** * Call this when ever an activity is detected to renew the wakelock * * @param messageHandler reference to the handler to notify * - typically mSessionStatusHandler, but it cannot be accessed in a static manner. */ public static void notifyUpdateWakeLock(Handler messageHandler) { if (messageHandler != null) { Message msg = Message.obtain(messageHandler); msg.what = MSG_ACQUIRE_WAKE_LOCK; msg.sendToTarget(); } } private void startRfcommSocketListener() { if (VERBOSE) Log.v(TAG, "Sap Service startRfcommSocketListener"); Loading Loading @@ -204,6 +233,8 @@ public class SapService extends ProfileService { } if (mWakeLock != null) { mSessionStatusHandler.removeMessages(MSG_ACQUIRE_WAKE_LOCK); mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mWakeLock.release(); mWakeLock = null; } Loading @@ -217,9 +248,6 @@ public class SapService extends ProfileService { if (VERBOSE) Log.v(TAG, "Sap Service startSapServerSession"); // acquire the wakeLock before start SAP transaction thread // TODO: Do we need this? I guess we will wake when ever incoming data is available? // And/or when a SIM event occurs - same for MAP. // UPDATE: Change to use same approach as for MAP with a timer based wake-lock if (mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Loading @@ -237,6 +265,10 @@ public class SapService extends ProfileService { * request from the SAP client, hence we need to be prepared to handle the * response. (the SapHandler should have been started before this point)*/ mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mSessionStatusHandler.sendMessageDelayed(mSessionStatusHandler .obtainMessage(MSG_RELEASE_WAKE_LOCK), RELEASE_WAKE_LOCK_DELAY); if (VERBOSE) { Log.v(TAG, "startSapServerSession() success!"); } Loading Loading @@ -392,6 +424,30 @@ public class SapService extends ProfileService { case MSG_SESSION_DISCONNECTED: // handled elsewhere break; case MSG_ACQUIRE_WAKE_LOCK: if (VERBOSE)Log.i(TAG, "Acquire Wake Lock request message"); if (mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService( Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "StartingObexMapTransaction"); mWakeLock.setReferenceCounted(false); } if (!mWakeLock.isHeld()) { mWakeLock.acquire(); if (DEBUG)Log.i(TAG, " Acquired Wake Lock by message"); } mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mSessionStatusHandler.sendMessageDelayed(mSessionStatusHandler .obtainMessage(MSG_RELEASE_WAKE_LOCK), RELEASE_WAKE_LOCK_DELAY); break; case MSG_RELEASE_WAKE_LOCK: if (VERBOSE)Log.i(TAG, "Release Wake Lock request message"); if (mWakeLock != null) { mWakeLock.release(); if (DEBUG) Log.i(TAG, " Released Wake Lock by message"); } break; case SHUTDOWN: /* Ensure to call close from this handler to avoid starting new stuff because of pending messages */ Loading Loading
android/app/src/com/android/bluetooth/sap/SapRilReceiver.java +20 −15 Original line number Diff line number Diff line Loading @@ -29,12 +29,14 @@ public class SapRilReceiver implements Runnable { CodedOutputStreamMicro mRilBtOutStream = null; InputStream mRilBtInStream = null; private Handler mSapServerMsgHandler = null; private Handler mSapServiceHandler = null; public static final int RIL_MAX_COMMAND_BYTES = (8 * 1024); byte[] buffer = new byte[RIL_MAX_COMMAND_BYTES]; public SapRilReceiver(Handler SapServerMsgHandler) { public SapRilReceiver(Handler SapServerMsgHandler, Handler sapServiceHandler) { mSapServerMsgHandler = SapServerMsgHandler; mSapServiceHandler = sapServiceHandler; } /** Loading Loading @@ -188,7 +190,6 @@ public class SapRilReceiver implements Runnable { public void run() { try { int length = 0; if (VERBOSE) Log.i(TAG, "Starting RilBtReceiverThread..."); mSocket = openRilBtSocket(); Loading @@ -203,10 +204,14 @@ public class SapRilReceiver implements Runnable { SapMessage sapMsg = null; MsgHeader rilMsg; if (VERBOSE) Log.i(TAG, "Waiting for incoming message..."); length = readMessage(mRilBtInStream, buffer); CodedInputStreamMicro msgStream = CodedInputStreamMicro.newInstance(buffer, 0, length); int length = readMessage(mRilBtInStream, buffer); SapService.notifyUpdateWakeLock(mSapServiceHandler); CodedInputStreamMicro msgStream = CodedInputStreamMicro.newInstance(buffer, 0, length); rilMsg = MsgHeader.parseFrom(msgStream); if (VERBOSE) Log.i(TAG, "Message received."); Loading
android/app/src/com/android/bluetooth/sap/SapServer.java +3 −1 Original line number Diff line number Diff line Loading @@ -279,7 +279,7 @@ public class SapServer extends Thread implements Callback { Looper sapLooper = mHandlerThread.getLooper(); /* This will return when the looper is ready */ mSapHandler = new Handler(sapLooper, this); mRilBtReceiver = new SapRilReceiver(mSapHandler); mRilBtReceiver = new SapRilReceiver(mSapHandler, mSapServiceHandler); mRilBtReceiverThread = new Thread(mRilBtReceiver, "RilBtReceiver"); setNotification(SapMessage.DISC_GRACEFULL,0); boolean done = false; Loading @@ -290,6 +290,8 @@ public class SapServer extends Thread implements Callback { done = true; // EOF reached } else { SapMessage msg = SapMessage.readMessage(requestType, mRfcommIn); /* notify about an incoming message from the BT Client */ SapService.notifyUpdateWakeLock(mSapServiceHandler); if(msg != null && mState != SAP_STATE.DISCONNECTING) { switch (requestType) { Loading
android/app/src/com/android/bluetooth/sap/SapService.java +65 −9 Original line number Diff line number Diff line Loading @@ -58,6 +58,19 @@ public class SapService extends ProfileService { public static final int MSG_SESSION_ESTABLISHED = 5001; public static final int MSG_SESSION_DISCONNECTED = 5002; public static final int MSG_ACQUIRE_WAKE_LOCK = 5005; public static final int MSG_RELEASE_WAKE_LOCK = 5006; /* Each time a transaction between the SIM and the BT Client is detected a wakelock is taken. * After an idle period of RELEASE_WAKE_LOCK_DELAY ms the wakelock is released. * * NOTE: While connected the the Nokia 616 car-kit it was noticed that the carkit do * TRANSFER_APDU_REQ with 20-30 seconds interval, and it sends no requests less than 1 sec * apart. Additionally the responses from the RIL comes within a few ms, hence a one * second timeout should be enough. */ private static final int RELEASE_WAKE_LOCK_DELAY = 1000; /* Intent indicating timeout for user confirmation. */ public static final String USER_CONFIRM_TIMEOUT_ACTION = "com.android.bluetooth.sap.USER_CONFIRM_TIMEOUT"; Loading Loading @@ -93,6 +106,22 @@ public class SapService extends ProfileService { mState = BluetoothSap.STATE_DISCONNECTED; } /*** * Call this when ever an activity is detected to renew the wakelock * * @param messageHandler reference to the handler to notify * - typically mSessionStatusHandler, but it cannot be accessed in a static manner. */ public static void notifyUpdateWakeLock(Handler messageHandler) { if (messageHandler != null) { Message msg = Message.obtain(messageHandler); msg.what = MSG_ACQUIRE_WAKE_LOCK; msg.sendToTarget(); } } private void startRfcommSocketListener() { if (VERBOSE) Log.v(TAG, "Sap Service startRfcommSocketListener"); Loading Loading @@ -204,6 +233,8 @@ public class SapService extends ProfileService { } if (mWakeLock != null) { mSessionStatusHandler.removeMessages(MSG_ACQUIRE_WAKE_LOCK); mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mWakeLock.release(); mWakeLock = null; } Loading @@ -217,9 +248,6 @@ public class SapService extends ProfileService { if (VERBOSE) Log.v(TAG, "Sap Service startSapServerSession"); // acquire the wakeLock before start SAP transaction thread // TODO: Do we need this? I guess we will wake when ever incoming data is available? // And/or when a SIM event occurs - same for MAP. // UPDATE: Change to use same approach as for MAP with a timer based wake-lock if (mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Loading @@ -237,6 +265,10 @@ public class SapService extends ProfileService { * request from the SAP client, hence we need to be prepared to handle the * response. (the SapHandler should have been started before this point)*/ mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mSessionStatusHandler.sendMessageDelayed(mSessionStatusHandler .obtainMessage(MSG_RELEASE_WAKE_LOCK), RELEASE_WAKE_LOCK_DELAY); if (VERBOSE) { Log.v(TAG, "startSapServerSession() success!"); } Loading Loading @@ -392,6 +424,30 @@ public class SapService extends ProfileService { case MSG_SESSION_DISCONNECTED: // handled elsewhere break; case MSG_ACQUIRE_WAKE_LOCK: if (VERBOSE)Log.i(TAG, "Acquire Wake Lock request message"); if (mWakeLock == null) { PowerManager pm = (PowerManager)getSystemService( Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "StartingObexMapTransaction"); mWakeLock.setReferenceCounted(false); } if (!mWakeLock.isHeld()) { mWakeLock.acquire(); if (DEBUG)Log.i(TAG, " Acquired Wake Lock by message"); } mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK); mSessionStatusHandler.sendMessageDelayed(mSessionStatusHandler .obtainMessage(MSG_RELEASE_WAKE_LOCK), RELEASE_WAKE_LOCK_DELAY); break; case MSG_RELEASE_WAKE_LOCK: if (VERBOSE)Log.i(TAG, "Release Wake Lock request message"); if (mWakeLock != null) { mWakeLock.release(); if (DEBUG) Log.i(TAG, " Released Wake Lock by message"); } break; case SHUTDOWN: /* Ensure to call close from this handler to avoid starting new stuff because of pending messages */ Loading