Loading android/app/src/com/android/bluetooth/map/BluetoothMapObexServer.java +9 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,8 @@ public class BluetoothMapObexServer extends ServerRequestHandler { private BluetoothMapFolderElement mCurrentFolder; private BluetoothMnsObexClient mMnsClient; private Handler mCallback = null; private Context mContext; Loading @@ -68,12 +70,13 @@ public class BluetoothMapObexServer extends ServerRequestHandler { BluetoothMapContent mOutContent; public BluetoothMapObexServer(Handler callback, Context context) { public BluetoothMapObexServer(Handler callback, Context context, BluetoothMnsObexClient mns) { super(); mCallback = callback; mContext = context; mOutContent = new BluetoothMapContent(mContext); mMnsClient = mns; buildFolderStructure(); /* Build the default folder structure, and set mCurrentFolder to root folder */ } Loading Loading @@ -213,13 +216,14 @@ public class BluetoothMapObexServer extends ServerRequestHandler { private int setNotificationRegistration(BluetoothMapAppParams appParams) { // Forward the request to the MNS thread as a message - including the MAS instance ID. Handler mns = BluetoothMnsObexClient.getMessageHandler(); Handler mns = mMnsClient.getMessageHandler(); if(mns != null) { Message msg = Message.obtain(mns); msg.what = BluetoothMnsObexClient.MSG_MNS_NOTIFICATION_REGISTRATION; msg.arg1 = 0; // TODO: Add correct MAS ID, as specified in the SDP record. msg.arg2 = appParams.getNotificationStatus(); msg.sendToTarget(); if(D) Log.d(TAG,"MSG_MNS_NOTIFICATION_REGISTRATION"); return ResponseCodes.OBEX_HTTP_OK; } else { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // This should not happen. Loading Loading @@ -248,7 +252,7 @@ public class BluetoothMapObexServer extends ServerRequestHandler { bMsgStream = op.openInputStream(); message = BluetoothMapbMessage.parse(bMsgStream, appParams.getCharset()); // Decode the messageBody // Send message BluetoothMapContentObserver observer = BluetoothMnsObexClient.getContentObserver(); BluetoothMapContentObserver observer = mMnsClient.getContentObserver(); if (observer == null) { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // Should not happen. } Loading Loading @@ -287,7 +291,7 @@ public class BluetoothMapObexServer extends ServerRequestHandler { msgHandle == null) { return ResponseCodes.OBEX_HTTP_PRECON_FAILED; } BluetoothMapContentObserver observer = BluetoothMnsObexClient.getContentObserver(); BluetoothMapContentObserver observer = mMnsClient.getContentObserver(); if (observer == null) { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // Should not happen. } Loading android/app/src/com/android/bluetooth/map/BluetoothMapService.java +40 −44 Original line number Diff line number Diff line Loading @@ -268,6 +268,12 @@ public class BluetoothMapService extends ProfileService { } closeConnectionSocket(); if (mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; if (VERBOSE) Log.v(TAG, "MAP Service closeService out"); } Loading @@ -283,8 +289,9 @@ public class BluetoothMapService extends ProfileService { mWakeLock.acquire(); } mMapServer = new BluetoothMapObexServer(mSessionStatusHandler, this); mBluetoothMnsObexClient = new BluetoothMnsObexClient(this, mRemoteDevice); mMapServer = new BluetoothMapObexServer(mSessionStatusHandler, this, mBluetoothMnsObexClient); synchronized (this) { // We need to get authentication now that obex server is up mAuth = new BluetoothMapAuthenticator(mSessionStatusHandler); Loading @@ -294,8 +301,6 @@ public class BluetoothMapService extends ProfileService { // setup RFCOMM transport BluetoothMapRfcommTransport transport = new BluetoothMapRfcommTransport(mConnSocket); mServerSession = new ServerSession(transport, mMapServer, mAuth); mBluetoothMnsObexClient = new BluetoothMnsObexClient(this, mRemoteDevice); mBluetoothMnsObexClient.start(); // Initiate the MNS message loop. setState(BluetoothMap.STATE_CONNECTED); if (VERBOSE) { Log.v(TAG, "startObexServerSession() success!"); Loading Loading @@ -615,10 +620,6 @@ public class BluetoothMapService extends ProfileService { setState(BluetoothMap.STATE_DISCONNECTED, BluetoothMap.RESULT_CANCELED); closeService(); if(mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; return true; } Loading @@ -626,10 +627,6 @@ public class BluetoothMapService extends ProfileService { if (DEBUG) Log.d(TAG, "cleanup()"); setState(BluetoothMap.STATE_DISCONNECTED, BluetoothMap.RESULT_CANCELED); closeService(); if(mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; return true; } Loading @@ -647,7 +644,6 @@ public class BluetoothMapService extends ProfileService { if (DEBUG) Log.d(TAG, "STATE_TURNING_OFF"); // Release all resources closeService(); isWaitingAuthorization = false; } else if (state == BluetoothAdapter.STATE_ON) { if (DEBUG) Log.d(TAG, "STATE_ON"); mInterrupted = false; Loading android/app/src/com/android/bluetooth/map/BluetoothMnsObexClient.java +39 −44 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.ParcelUuid; Loading @@ -43,27 +44,23 @@ import javax.obex.ResponseCodes; * hence all call-backs (and thereby transmission of data) is executed * from this thread. */ public class BluetoothMnsObexClient extends Thread{ public class BluetoothMnsObexClient { private static final String TAG = "BluetoothMnsObexClient"; private static final boolean D = false; private static final boolean V = false; public final static int MSG_SESSION_ERROR = 1; public final static int MSG_CONNECT_TIMEOUT = 2; private ObexTransport mTransport; private Context mContext; public static Handler mHandler = null; public Handler mHandler = null; private volatile boolean mWaitingForRemote; private static final String TYPE_EVENT = "x-bt/MAP-event-report"; private ClientSession mClientSession; private boolean mConnected = false; BluetoothDevice mRemoteDevice; private static BluetoothMapContentObserver mObserver; private BluetoothMapContentObserver mObserver; private boolean mObserverRegistered = false; private Looper mLooper = null; // Used by the MAS to forward notification registrations public static final int MSG_MNS_NOTIFICATION_REGISTRATION = 1; Loading @@ -76,31 +73,30 @@ public class BluetoothMnsObexClient extends Thread{ if (remoteDevice == null) { throw new NullPointerException("Obex transport is null"); } HandlerThread thread = new HandlerThread("BluetoothMnsObexClient"); thread.start(); Looper looper = thread.getLooper(); mHandler = new MnsObexClientHandler(looper); mContext = context; mRemoteDevice = remoteDevice; mObserver = new BluetoothMapContentObserver(mContext); mObserver.init(); } public static Handler getMessageHandler() { // TODO: if mHandle is null, we should wait for it to be created. public Handler getMessageHandler() { return mHandler; } public static BluetoothMapContentObserver getContentObserver() { public BluetoothMapContentObserver getContentObserver() { return mObserver; } @Override public void run() { Looper.prepare(); mLooper = Looper.myLooper(); /* Create the context observer from within the thread to ensure the "content changed" * events are handled in this thread. */ mObserver = new BluetoothMapContentObserver(mContext); mObserver.init(); private final class MnsObexClientHandler extends Handler { private MnsObexClientHandler(Looper looper) { super(looper); } mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_MNS_NOTIFICATION_REGISTRATION: Loading @@ -110,8 +106,6 @@ public class BluetoothMnsObexClient extends Thread{ break; } } }; Looper.loop(); } public boolean isConnected() { Loading Loading @@ -152,19 +146,19 @@ public class BluetoothMnsObexClient extends Thread{ mObserver.unregisterObserver(); mObserverRegistered = false; } if (mObserver != null) { mObserver.deinit(); mObserver = null; } if (mHandler != null) { // Shut down the thread if(mLooper != null) mLooper.quit(); interrupt(); try { join(); } catch (InterruptedException e) { if(V) Log.w(TAG, "got interrupted. Probably a connection shutdown"); mHandler.removeCallbacksAndMessages(null); Looper looper = mHandler.getLooper(); if (looper != null) { looper.quit(); } mHandler = null; mObserver = null; } } private HeaderSet hsConnect = null; Loading @@ -172,7 +166,8 @@ public class BluetoothMnsObexClient extends Thread{ public void handleRegistration(int masId, int notificationStatus){ Log.d(TAG, "handleRegistration( " + masId + ", " + notificationStatus + ")"); if(isConnected() == false) { if((isConnected() == false) && (notificationStatus == BluetoothMapAppParams.NOTIFICATION_STATUS_YES)) { Log.d(TAG, "handleRegistration: connect"); connect(); } Loading Loading
android/app/src/com/android/bluetooth/map/BluetoothMapObexServer.java +9 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,8 @@ public class BluetoothMapObexServer extends ServerRequestHandler { private BluetoothMapFolderElement mCurrentFolder; private BluetoothMnsObexClient mMnsClient; private Handler mCallback = null; private Context mContext; Loading @@ -68,12 +70,13 @@ public class BluetoothMapObexServer extends ServerRequestHandler { BluetoothMapContent mOutContent; public BluetoothMapObexServer(Handler callback, Context context) { public BluetoothMapObexServer(Handler callback, Context context, BluetoothMnsObexClient mns) { super(); mCallback = callback; mContext = context; mOutContent = new BluetoothMapContent(mContext); mMnsClient = mns; buildFolderStructure(); /* Build the default folder structure, and set mCurrentFolder to root folder */ } Loading Loading @@ -213,13 +216,14 @@ public class BluetoothMapObexServer extends ServerRequestHandler { private int setNotificationRegistration(BluetoothMapAppParams appParams) { // Forward the request to the MNS thread as a message - including the MAS instance ID. Handler mns = BluetoothMnsObexClient.getMessageHandler(); Handler mns = mMnsClient.getMessageHandler(); if(mns != null) { Message msg = Message.obtain(mns); msg.what = BluetoothMnsObexClient.MSG_MNS_NOTIFICATION_REGISTRATION; msg.arg1 = 0; // TODO: Add correct MAS ID, as specified in the SDP record. msg.arg2 = appParams.getNotificationStatus(); msg.sendToTarget(); if(D) Log.d(TAG,"MSG_MNS_NOTIFICATION_REGISTRATION"); return ResponseCodes.OBEX_HTTP_OK; } else { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // This should not happen. Loading Loading @@ -248,7 +252,7 @@ public class BluetoothMapObexServer extends ServerRequestHandler { bMsgStream = op.openInputStream(); message = BluetoothMapbMessage.parse(bMsgStream, appParams.getCharset()); // Decode the messageBody // Send message BluetoothMapContentObserver observer = BluetoothMnsObexClient.getContentObserver(); BluetoothMapContentObserver observer = mMnsClient.getContentObserver(); if (observer == null) { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // Should not happen. } Loading Loading @@ -287,7 +291,7 @@ public class BluetoothMapObexServer extends ServerRequestHandler { msgHandle == null) { return ResponseCodes.OBEX_HTTP_PRECON_FAILED; } BluetoothMapContentObserver observer = BluetoothMnsObexClient.getContentObserver(); BluetoothMapContentObserver observer = mMnsClient.getContentObserver(); if (observer == null) { return ResponseCodes.OBEX_HTTP_UNAVAILABLE; // Should not happen. } Loading
android/app/src/com/android/bluetooth/map/BluetoothMapService.java +40 −44 Original line number Diff line number Diff line Loading @@ -268,6 +268,12 @@ public class BluetoothMapService extends ProfileService { } closeConnectionSocket(); if (mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; if (VERBOSE) Log.v(TAG, "MAP Service closeService out"); } Loading @@ -283,8 +289,9 @@ public class BluetoothMapService extends ProfileService { mWakeLock.acquire(); } mMapServer = new BluetoothMapObexServer(mSessionStatusHandler, this); mBluetoothMnsObexClient = new BluetoothMnsObexClient(this, mRemoteDevice); mMapServer = new BluetoothMapObexServer(mSessionStatusHandler, this, mBluetoothMnsObexClient); synchronized (this) { // We need to get authentication now that obex server is up mAuth = new BluetoothMapAuthenticator(mSessionStatusHandler); Loading @@ -294,8 +301,6 @@ public class BluetoothMapService extends ProfileService { // setup RFCOMM transport BluetoothMapRfcommTransport transport = new BluetoothMapRfcommTransport(mConnSocket); mServerSession = new ServerSession(transport, mMapServer, mAuth); mBluetoothMnsObexClient = new BluetoothMnsObexClient(this, mRemoteDevice); mBluetoothMnsObexClient.start(); // Initiate the MNS message loop. setState(BluetoothMap.STATE_CONNECTED); if (VERBOSE) { Log.v(TAG, "startObexServerSession() success!"); Loading Loading @@ -615,10 +620,6 @@ public class BluetoothMapService extends ProfileService { setState(BluetoothMap.STATE_DISCONNECTED, BluetoothMap.RESULT_CANCELED); closeService(); if(mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; return true; } Loading @@ -626,10 +627,6 @@ public class BluetoothMapService extends ProfileService { if (DEBUG) Log.d(TAG, "cleanup()"); setState(BluetoothMap.STATE_DISCONNECTED, BluetoothMap.RESULT_CANCELED); closeService(); if(mSessionStatusHandler != null) { mSessionStatusHandler.removeCallbacksAndMessages(null); } isWaitingAuthorization = false; return true; } Loading @@ -647,7 +644,6 @@ public class BluetoothMapService extends ProfileService { if (DEBUG) Log.d(TAG, "STATE_TURNING_OFF"); // Release all resources closeService(); isWaitingAuthorization = false; } else if (state == BluetoothAdapter.STATE_ON) { if (DEBUG) Log.d(TAG, "STATE_ON"); mInterrupted = false; Loading
android/app/src/com/android/bluetooth/map/BluetoothMnsObexClient.java +39 −44 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.ParcelUuid; Loading @@ -43,27 +44,23 @@ import javax.obex.ResponseCodes; * hence all call-backs (and thereby transmission of data) is executed * from this thread. */ public class BluetoothMnsObexClient extends Thread{ public class BluetoothMnsObexClient { private static final String TAG = "BluetoothMnsObexClient"; private static final boolean D = false; private static final boolean V = false; public final static int MSG_SESSION_ERROR = 1; public final static int MSG_CONNECT_TIMEOUT = 2; private ObexTransport mTransport; private Context mContext; public static Handler mHandler = null; public Handler mHandler = null; private volatile boolean mWaitingForRemote; private static final String TYPE_EVENT = "x-bt/MAP-event-report"; private ClientSession mClientSession; private boolean mConnected = false; BluetoothDevice mRemoteDevice; private static BluetoothMapContentObserver mObserver; private BluetoothMapContentObserver mObserver; private boolean mObserverRegistered = false; private Looper mLooper = null; // Used by the MAS to forward notification registrations public static final int MSG_MNS_NOTIFICATION_REGISTRATION = 1; Loading @@ -76,31 +73,30 @@ public class BluetoothMnsObexClient extends Thread{ if (remoteDevice == null) { throw new NullPointerException("Obex transport is null"); } HandlerThread thread = new HandlerThread("BluetoothMnsObexClient"); thread.start(); Looper looper = thread.getLooper(); mHandler = new MnsObexClientHandler(looper); mContext = context; mRemoteDevice = remoteDevice; mObserver = new BluetoothMapContentObserver(mContext); mObserver.init(); } public static Handler getMessageHandler() { // TODO: if mHandle is null, we should wait for it to be created. public Handler getMessageHandler() { return mHandler; } public static BluetoothMapContentObserver getContentObserver() { public BluetoothMapContentObserver getContentObserver() { return mObserver; } @Override public void run() { Looper.prepare(); mLooper = Looper.myLooper(); /* Create the context observer from within the thread to ensure the "content changed" * events are handled in this thread. */ mObserver = new BluetoothMapContentObserver(mContext); mObserver.init(); private final class MnsObexClientHandler extends Handler { private MnsObexClientHandler(Looper looper) { super(looper); } mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_MNS_NOTIFICATION_REGISTRATION: Loading @@ -110,8 +106,6 @@ public class BluetoothMnsObexClient extends Thread{ break; } } }; Looper.loop(); } public boolean isConnected() { Loading Loading @@ -152,19 +146,19 @@ public class BluetoothMnsObexClient extends Thread{ mObserver.unregisterObserver(); mObserverRegistered = false; } if (mObserver != null) { mObserver.deinit(); mObserver = null; } if (mHandler != null) { // Shut down the thread if(mLooper != null) mLooper.quit(); interrupt(); try { join(); } catch (InterruptedException e) { if(V) Log.w(TAG, "got interrupted. Probably a connection shutdown"); mHandler.removeCallbacksAndMessages(null); Looper looper = mHandler.getLooper(); if (looper != null) { looper.quit(); } mHandler = null; mObserver = null; } } private HeaderSet hsConnect = null; Loading @@ -172,7 +166,8 @@ public class BluetoothMnsObexClient extends Thread{ public void handleRegistration(int masId, int notificationStatus){ Log.d(TAG, "handleRegistration( " + masId + ", " + notificationStatus + ")"); if(isConnected() == false) { if((isConnected() == false) && (notificationStatus == BluetoothMapAppParams.NOTIFICATION_STATUS_YES)) { Log.d(TAG, "handleRegistration: connect"); connect(); } Loading