From 873b5708d14460360d32cfc98ee48cf62f1ebfa6 Mon Sep 17 00:00:00 2001 From: Stanley Tng Date: Mon, 1 May 2017 21:27:31 -0700 Subject: [PATCH] Add Save and Restore of BluetoothOn setting This change will automatically save the Bluetooth On setting when the user chooses to backup the phone settings into the cloud. This setting is restored by the Setup Wizard (SUW) when configuring the phone and this change will enable or disable the Bluetooth based on this restored setting. Bug: 35657817 Test: Manual test with Sailfish Change-Id: Ie4518593af63f96f8c363f98941ca5260a3ec4bb (cherry picked from commit 767f05feea67e642a76bd3e2e7633a8f5273f077) --- core/java/android/provider/Settings.java | 3 +- .../providers/settings/SettingsHelper.java | 3 +- .../server/BluetoothManagerService.java | 49 +++++++++++++++++-- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ba419337f0444..3cd54b8af39e8 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9955,7 +9955,8 @@ public final class Settings { CALL_AUTO_RETRY, DOCK_AUDIO_MEDIA_ENABLED, ENCODED_SURROUND_OUTPUT, - LOW_POWER_MODE_TRIGGER_LEVEL + LOW_POWER_MODE_TRIGGER_LEVEL, + BLUETOOTH_ON }; private static final ContentProviderHolder sProviderHolder = diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index d1d59b2fb24fe..1e171d3f8210b 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -62,11 +62,12 @@ public class SettingsHelper { */ private static final ArraySet sBroadcastOnRestore; static { - sBroadcastOnRestore = new ArraySet(4); + sBroadcastOnRestore = new ArraySet(5); sBroadcastOnRestore.add(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); sBroadcastOnRestore.add(Settings.Secure.ENABLED_VR_LISTENERS); sBroadcastOnRestore.add(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); sBroadcastOnRestore.add(Settings.Secure.ENABLED_INPUT_METHODS); + sBroadcastOnRestore.add(Settings.Global.BLUETOOTH_ON); } private interface SettingsLookup { diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index c785fb91e8ffd..b65f54ecbda7f 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -91,6 +91,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final String REASON_SYSTEM_BOOT = "system boot"; private static final String REASON_UNEXPECTED = "unexpected crash"; private static final String REASON_USER_SWITCH = "user switch"; + private static final String REASON_RESTORE_USER_SETTING = "restore user setting"; private static final int TIMEOUT_BIND_MS = 3000; //Maximum msec to wait for a bind //Maximum msec to wait for service restart @@ -119,6 +120,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 MESSAGE_RESTORE_USER_SETTING = 500; + + private static final int RESTORE_SETTING_TO_ON = 1; + private static final int RESTORE_SETTING_TO_OFF = 0; private static final int MAX_ERROR_RESTART_RETRIES = 6; @@ -318,6 +323,26 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } else { if (DBG) Slog.e(TAG, "No Bluetooth Adapter address parameter found"); } + } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) { + final String name = intent.getStringExtra(Intent.EXTRA_SETTING_NAME); + if (Settings.Global.BLUETOOTH_ON.equals(name)) { + // The Bluetooth On state may be changed during system restore. + final String prevValue = intent.getStringExtra( + Intent.EXTRA_SETTING_PREVIOUS_VALUE); + final String newValue = intent.getStringExtra( + Intent.EXTRA_SETTING_NEW_VALUE); + + if (DBG) Slog.d(TAG, "ACTION_SETTING_RESTORED with BLUETOOTH_ON, prevValue=" + + prevValue + ", newValue=" + newValue); + + if ((newValue != null) && (prevValue != null) && !prevValue.equals(newValue)) { + Message msg = mHandler.obtainMessage(MESSAGE_RESTORE_USER_SETTING, + newValue.equals("0") ? + RESTORE_SETTING_TO_OFF : + RESTORE_SETTING_TO_ON, 0); + mHandler.sendMessage(msg); + } + } } } }; @@ -350,12 +375,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub { registerForBleScanModeChange(); mCallbacks = new RemoteCallbackList(); mStateChangeCallbacks = new RemoteCallbackList(); - IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - mContext.registerReceiver(mReceiver, filter); - filter = new IntentFilter(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED); + + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED); + filter.addAction(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED); + filter.addAction(Intent.ACTION_SETTING_RESTORED); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(mReceiver, filter); + loadStoredNameAndAddress(); if (isBluetoothPersistedStateOn()) { if (DBG) Slog.d(TAG, "Startup: Bluetooth persisted state is ON."); @@ -1421,6 +1448,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } break; + case MESSAGE_RESTORE_USER_SETTING: + try { + if ((msg.arg1 == RESTORE_SETTING_TO_OFF) && mEnable) { + if (DBG) Slog.d(TAG, "Restore Bluetooth state to disabled"); + disable(REASON_RESTORE_USER_SETTING, true); + } else if ((msg.arg1 == RESTORE_SETTING_TO_ON) && !mEnable) { + if (DBG) Slog.d(TAG, "Restore Bluetooth state to enabled"); + enable(REASON_RESTORE_USER_SETTING); + } + } catch (RemoteException e) { + Slog.e(TAG,"Unable to change Bluetooth On setting", e); + } + break; + case MESSAGE_REGISTER_ADAPTER: { IBluetoothManagerCallback callback = (IBluetoothManagerCallback) msg.obj;