OSDN Git Service

Fixing crash in BluetoothPbapService.
authorMathias Jeppsson <mathias.jeppsson@sonyericsson.com>
Tue, 26 Apr 2011 12:04:48 +0000 (14:04 +0200)
committerJohan Redestig <johan.redestig@sonyericsson.com>
Tue, 26 Apr 2011 12:05:01 +0000 (14:05 +0200)
If Bluetooth is turned off while there is an PBAP connect request
pending, the status bar notification or yes/no activity will not
disappear. If user selects yes, an intent will start PbapService
again. PbapService will try to make the device trusted. As this
instance of PbapService don't have any connected device, crash will
occur.

Make sure status bar notification or yes/no activity disappears, by
sending timeout intent when Bluetooth is turned off.
Also, PbapReceiver should not forward any intents except STATE_ON
if Bluetooth is off as this will start the PbapService.

Change-Id: Iee4f95ab2de34db6e00ff9b1fd7f8677947b8f4f

src/com/android/bluetooth/pbap/BluetoothPbapReceiver.java
src/com/android/bluetooth/pbap/BluetoothPbapService.java

index b450376..55cb66c 100644 (file)
@@ -61,6 +61,12 @@ public class BluetoothPbapReceiver extends BroadcastReceiver {
                     || (state == BluetoothAdapter.STATE_TURNING_OFF)) {
                 startService = false;
             }
+        } else {
+            // Don't forward intent unless device has bluetooth and bluetooth is enabled.
+            BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+            if (adapter == null || !adapter.isEnabled()) {
+                startService = false;
+            }
         }
         if (startService) {
             context.startService(in);
index 3b1216e..a7225b2 100644 (file)
@@ -245,10 +245,17 @@ public class BluetoothPbapService extends Service {
         int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
         boolean removeTimeoutMsg = true;
         if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
-            removeTimeoutMsg = false;
             if (state == BluetoothAdapter.STATE_OFF) {
+                // Send any pending timeout now, as this service will be destroyed.
+                if (mSessionStatusHandler.hasMessages(USER_TIMEOUT)) {
+                    Intent timeoutIntent = new Intent(USER_CONFIRM_TIMEOUT_ACTION);
+                    sendBroadcast(timeoutIntent);
+                    removePbapNotification(NOTIFICATION_ID_ACCESS);
+                }
                 // Release all resources
                 closeService();
+            } else {
+                removeTimeoutMsg = false;
             }
         } else if (action.equals(ACCESS_ALLOWED_ACTION)) {
             if (intent.getBooleanExtra(EXTRA_ALWAYS_ALLOWED, false)) {