From 09bc94ec979e1954dabaf0750aae838c75daaba5 Mon Sep 17 00:00:00 2001 From: Smriti Gupta Date: Wed, 10 Feb 2016 19:40:41 +0530 Subject: OPP: Initialize obex socket listeners while starting Listening - Initialize socket listener when socket listening is to be started and not during onCreate. Without this patch there were usecases when BT was not bein turned off completely like in BLE on state, in these states, onDestroy was not getting called for OppService, leading to issues during next BT on state and would lead to OPP transfer failure. - Add adapter check before calling SdpRemove Native API to prevent possible ANR. CRs-Fixed: 975531 Change-Id: I6f0b0101f310192c90050a76ac6374cf1359fd46 --- .../bluetooth/map/BluetoothMapMasInstance.java | 12 ++++++--- .../android/bluetooth/opp/BluetoothOppService.java | 31 ++++++++++++++++------ src/com/android/bluetooth/sap/SapService.java | 12 ++++++--- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/com/android/bluetooth/map/BluetoothMapMasInstance.java b/src/com/android/bluetooth/map/BluetoothMapMasInstance.java index b00cc2c93..4cc371883 100644 --- a/src/com/android/bluetooth/map/BluetoothMapMasInstance.java +++ b/src/com/android/bluetooth/map/BluetoothMapMasInstance.java @@ -277,10 +277,12 @@ public class BluetoothMapMasInstance implements IObexConnectionHandler { Log.e(TAG, "Failed to start the listeners"); return; } - if (mSdpHandle >= 0 && SdpManager.getDefaultManager() != null) { + if (mAdapter != null && mSdpHandle >= 0 && + SdpManager.getDefaultManager() != null) { if(V) Log.d(TAG, "Removing SDP record for MAS instance: " + mMasInstanceId + " Object reference: " + this + "SDP handle: " + mSdpHandle); - SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + boolean status = SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + Log.d(TAG, "RemoveSDPrecord returns " + status); mSdpHandle = -1; } mSdpHandle = createMasSdpRecord(mServerSockets.getRfcommChannel(), @@ -408,10 +410,12 @@ public class BluetoothMapMasInstance implements IObexConnectionHandler { mObserver.deinit(); mObserver = null; } - if (mSdpHandle >= 0 && SdpManager.getDefaultManager() != null) { + if (mAdapter != null && mSdpHandle >= 0 && + SdpManager.getDefaultManager() != null) { if(V) Log.d(TAG, "Removing SDP record for MAS instance: " + mMasInstanceId + " Object reference: " + this + "SDP handle: " + mSdpHandle); - SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + boolean status = SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + Log.d(TAG, "RemoveSDPrecord returns " + status); mSdpHandle = -1; } diff --git a/src/com/android/bluetooth/opp/BluetoothOppService.java b/src/com/android/bluetooth/opp/BluetoothOppService.java index cc9f6baec..ec39e6e32 100644 --- a/src/com/android/bluetooth/opp/BluetoothOppService.java +++ b/src/com/android/bluetooth/opp/BluetoothOppService.java @@ -160,8 +160,6 @@ public class BluetoothOppService extends Service { super.onCreate(); if (V) Log.v(TAG, "onCreate"); mAdapter = BluetoothAdapter.getDefaultAdapter(); - mSocketListener = new BluetoothOppRfcommListener(mAdapter); - mL2cSocketListener = new BluetoothOppL2capListener(mAdapter); mShares = Lists.newArrayList(); mBatchs = Lists.newArrayList(); mObserver = new BluetoothShareContentObserver(); @@ -235,17 +233,21 @@ public class BluetoothOppService extends Service { public void handleMessage(Message msg) { switch (msg.what) { case STOP_LISTENER: - if (mOppSdpHandle >= 0 && + if (mAdapter != null && mOppSdpHandle >= 0 && SdpManager.getDefaultManager() != null) { if (D) Log.d(TAG, "Removing SDP record"); - SdpManager.getDefaultManager().removeSdpRecord(mOppSdpHandle); + boolean status = SdpManager.getDefaultManager(). + removeSdpRecord(mOppSdpHandle); + Log.d(TAG, "RemoveSDPrecord returns " + status); mOppSdpHandle = -1; } if(mSocketListener != null){ mSocketListener.stop(); + mSocketListener = null; } if(mL2cSocketListener != null){ mL2cSocketListener.stop(); + mL2cSocketListener = null; } mListenStarted = false; //Stop Active INBOUND Transfer @@ -360,8 +362,20 @@ public class BluetoothOppService extends Service { private void startSocketListener() { - if (V) Log.v(TAG, "start Socket Listeners"); + Log.d(TAG, "start Socket Listeners"); + if(mSocketListener != null){ + Log.d(TAG, "rfcomm listener active, stopping it"); + mSocketListener.stop(); + mSocketListener = null; + } + if(mL2cSocketListener != null){ + Log.d(TAG, "l2cap listener active, stopping it"); + mL2cSocketListener.stop(); + mL2cSocketListener = null; + } + mSocketListener = new BluetoothOppRfcommListener(mAdapter); + mL2cSocketListener = new BluetoothOppL2capListener(mAdapter); if (mSocketListener != null && mL2cSocketListener != null) { if ( ( mSocketListener.openRfcommSocket() != null) && @@ -387,6 +401,8 @@ public class BluetoothOppService extends Service { unregisterReceiver(mBluetoothReceiver); mSocketListener.stop(); mL2cSocketListener.stop(); + mSocketListener = null; + mL2cSocketListener = null; if(mBatchs != null) { mBatchs.clear(); @@ -415,12 +431,11 @@ public class BluetoothOppService extends Service { if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) { case BluetoothAdapter.STATE_ON: - if (V) Log.v(TAG, - "Receiver BLUETOOTH_STATE_CHANGED_ACTION, BLUETOOTH_STATE_ON"); + Log.d(TAG, "Receiver BLUETOOTH_STATE_CHANGED_ACTION, STATE_ON"); startSocketListener(); break; case BluetoothAdapter.STATE_TURNING_OFF: - if (V) Log.v(TAG, "Receiver DISABLED_ACTION "); + Log.d(TAG, "Receiver BLUETOOTH_STATE_CHANGED_ACTION, STATE_TURNING_OFF"); //FIX: Don't block main thread /* mSocketListener.stop(); diff --git a/src/com/android/bluetooth/sap/SapService.java b/src/com/android/bluetooth/sap/SapService.java index 584d7ef00..79f561f93 100644 --- a/src/com/android/bluetooth/sap/SapService.java +++ b/src/com/android/bluetooth/sap/SapService.java @@ -152,9 +152,11 @@ public class SapService extends ProfileService { // for multiple connections. mServerSocket = mAdapter.listenUsingRfcommOn( BluetoothAdapter.SOCKET_CHANNEL_AUTO_STATIC_NO_SDP, true, true); - if (mSdpHandle >= 0 && SdpManager.getDefaultManager() != null) { + if (mAdapter != null && mSdpHandle >= 0 && + SdpManager.getDefaultManager() != null) { if (DEBUG) Log.d(TAG, "Removing SDP record"); - SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + boolean status = SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + Log.d(TAG, "RemoveSDPrecord returns " + status); mSdpHandle = -1; } mSdpHandle = SdpManager.getDefaultManager().createSapsRecord(SDP_SAP_SERVICE_NAME, @@ -730,9 +732,11 @@ public class SapService extends ProfileService { mIsWaitingAuthorization = false; cancelUserTimeoutAlarm(); } - if (mSdpHandle >= 0 && SdpManager.getDefaultManager() != null) { + if (mAdapter != null && mSdpHandle >= 0 && + SdpManager.getDefaultManager() != null) { if (DEBUG) Log.d(TAG, "Removing SDP record"); - SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + boolean status = SdpManager.getDefaultManager().removeSdpRecord(mSdpHandle); + Log.d(TAG, "RemoveSDPrecord returns " + status); mSdpHandle = -1; } if (mSessionStatusHandler != null) { -- cgit v1.2.3