From aacb89e929e4b36327df46c07a5afb6bd8e68479 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Sat, 5 Mar 2016 14:42:58 -0700 Subject: [PATCH] Kick Bluetooth stack after user is unlocked. If Bluetooth was enabled at boot time, but the actual Bluetooth package wasn't encryption aware, we need to kick off another enabled pass once the user is unlocked. Bug: 27326711 Change-Id: I511c4fd8567792e5bc4d49fa95929fd87edd0fbf --- .../server/BluetoothManagerService.java | 45 ++++++++++++++----- .../com/android/server/BluetoothService.java | 13 +++--- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index f65dbb67b228b..e241a4aa99263 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -89,14 +89,15 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int MESSAGE_BLUETOOTH_SERVICE_CONNECTED = 40; private static final int MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED = 41; private static final int MESSAGE_RESTART_BLUETOOTH_SERVICE = 42; - private static final int MESSAGE_BLUETOOTH_STATE_CHANGE=60; - private static final int MESSAGE_TIMEOUT_BIND =100; - private static final int MESSAGE_TIMEOUT_UNBIND =101; + private static final int MESSAGE_BLUETOOTH_STATE_CHANGE = 60; + private static final int MESSAGE_TIMEOUT_BIND = 100; + private static final int MESSAGE_TIMEOUT_UNBIND = 101; private static final int MESSAGE_USER_SWITCHED = 300; + private static final int MESSAGE_USER_UNLOCKED = 301; private static final int MESSAGE_ADD_PROXY_DELAYED = 400; private static final int MESSAGE_BIND_PROFILE_SERVICE = 401; - private static final int MAX_SAVE_RETRIES=3; - private static final int MAX_ERROR_RESTART_RETRIES=6; + private static final int MAX_SAVE_RETRIES = 3; + private static final int MAX_ERROR_RESTART_RETRIES = 6; // Bluetooth persisted setting is off private static final int BLUETOOTH_OFF=0; @@ -767,8 +768,16 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * Called when switching to a different foreground user. */ public void handleOnSwitchUser(int userHandle) { - if (DBG) Slog.d(TAG, "Bluetooth user switched"); - mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_USER_SWITCHED, userHandle, 0)); + if (DBG) Slog.d(TAG, "User " + userHandle + " switched"); + mHandler.obtainMessage(MESSAGE_USER_SWITCHED, userHandle, 0).sendToTarget(); + } + + /** + * Called when user is unlocked. + */ + public void handleOnUnlockUser(int userHandle) { + if (DBG) Slog.d(TAG, "User " + userHandle + " unlocked"); + mHandler.obtainMessage(MESSAGE_USER_UNLOCKED, userHandle, 0).sendToTarget(); } /** @@ -1308,12 +1317,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { break; } - case MESSAGE_USER_SWITCHED: - { - if (DBG) { - Slog.d(TAG, "MESSAGE_USER_SWITCHED"); - } + case MESSAGE_USER_SWITCHED: { + if (DBG) Slog.d(TAG, "MESSAGE_USER_SWITCHED"); mHandler.removeMessages(MESSAGE_USER_SWITCHED); + /* disable and enable BT when detect a user switch */ if (mEnable && mBluetooth != null) { synchronized (mConnection) { @@ -1381,6 +1388,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } break; } + case MESSAGE_USER_UNLOCKED: { + if (DBG) Slog.d(TAG, "MESSAGE_USER_UNLOCKED"); + mHandler.removeMessages(MESSAGE_USER_SWITCHED); + + synchronized (mConnection) { + if (mEnable && !mBinding && (mBluetooth == null)) { + // We should be connected, but we gave up for some + // reason; maybe the Bluetooth service wasn't encryption + // aware, so try binding again. + if (DBG) Slog.d(TAG, "Enabled but not bound; retrying after unlock"); + handleEnable(mQuietEnable); + } + } + } } } } diff --git a/services/core/java/com/android/server/BluetoothService.java b/services/core/java/com/android/server/BluetoothService.java index 019d03df19425..1bf4e3a563c96 100644 --- a/services/core/java/com/android/server/BluetoothService.java +++ b/services/core/java/com/android/server/BluetoothService.java @@ -18,10 +18,8 @@ package com.android.server; import android.bluetooth.BluetoothAdapter; import android.content.Context; -import android.util.Log; class BluetoothService extends SystemService { - private static final String TAG = "BluetoothService"; private BluetoothManagerService mBluetoothManagerService; public BluetoothService(Context context) { @@ -36,17 +34,20 @@ class BluetoothService extends SystemService { @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { - Log.d(TAG, "onBootPhase: PHASE_SYSTEM_SERVICES_READY"); - publishBinderService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, mBluetoothManagerService); + publishBinderService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, + mBluetoothManagerService); } else if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { - Log.d(TAG, "onBootPhase: PHASE_ACTIVITY_MANAGER_READY"); mBluetoothManagerService.handleOnBootPhase(); } } @Override public void onSwitchUser(int userHandle) { - Log.d(TAG, "onSwitchUser: switching to user " + userHandle); mBluetoothManagerService.handleOnSwitchUser(userHandle); } + + @Override + public void onUnlockUser(int userHandle) { + mBluetoothManagerService.handleOnUnlockUser(userHandle); + } }