Loading src/com/android/settings/bluetooth/BluetoothEventRedirector.java +45 −3 Original line number Diff line number Diff line Loading @@ -75,10 +75,23 @@ public class BluetoothEventRedirector { } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) { int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState); CachedBluetoothDeviceManager cachedDeviceMgr = mManager.getCachedDeviceManager(); cachedDeviceMgr.onBondingStateChanged(device, bondState); if (bondState == BluetoothDevice.BOND_NONE) { int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR); mManager.getCachedDeviceManager().showUnbondMessage(device, reason); if (device.isBluetoothDock()) { // After a dock is unpaired, we will forget the // setttings mManager.removeDockAutoConnectSetting(device.getAddress()); // if the device is undocked, remove it from the list as // well if (!device.getAddress().equals(getDockedDeviceAddress(context))) { cachedDeviceMgr.onDeviceDisappeared(device); } } int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR); cachedDeviceMgr.showUnbondMessage(device, reason); } } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) { Loading Loading @@ -112,6 +125,16 @@ public class BluetoothEventRedirector { } else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) { int errorMsg = R.string.bluetooth_pairing_error_message; mManager.showError(device, R.string.bluetooth_error_title, errorMsg); } else if (action.equals(Intent.ACTION_DOCK_EVENT)) { // Remove if unpair device upon undocking int anythingButUnDocked = Intent.EXTRA_DOCK_STATE_UNDOCKED + 1; int state = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, anythingButUnDocked); if (state == Intent.EXTRA_DOCK_STATE_UNDOCKED) { if (device.getBondState() == BluetoothDevice.BOND_NONE) { mManager.getCachedDeviceManager().onDeviceDisappeared(device); } } } } }; Loading Loading @@ -143,10 +166,29 @@ public class BluetoothEventRedirector { filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED); filter.addAction(BluetoothDevice.ACTION_UUID); // Dock event broadcasts filter.addAction(Intent.ACTION_DOCK_EVENT); mManager.getContext().registerReceiver(mBroadcastReceiver, filter); } public void stop() { mManager.getContext().unregisterReceiver(mBroadcastReceiver); } // This can't be called from a broadcast receiver where the filter is set in the Manifest. private String getDockedDeviceAddress(Context context) { // This works only because these broadcast intents are "sticky" Intent i = context.registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT)); if (i != null) { int state = i.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED); if (state != Intent.EXTRA_DOCK_STATE_UNDOCKED) { BluetoothDevice device = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null) { return device.getAddress(); } } } return null; } } src/com/android/settings/bluetooth/DockService.java +8 −27 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; Loading Loading @@ -58,8 +57,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // TODO clean up logs. Disable DEBUG flag for this file and receiver's too private static final boolean DEBUG = true; private static final String SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK = "auto_connect_to_dock"; // Time allowed for the device to be undocked and redocked without severing // the bluetooth connection private static final long UNDOCKED_GRACE_PERIOD = 1000; Loading Loading @@ -214,7 +211,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli } mDevice = device; if (getAutoConnectSetting(mBtManager, device.getAddress())) { if (mBtManager.getDockAutoConnectSetting(device.getAddress())) { // Setting == auto connect initBtSettings(mContext, device, state, false); applyBtSettings(mDevice, startId); Loading Loading @@ -291,7 +288,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli startForeground(0, new Notification()); // Device in a new dock. boolean firstTime = !hasAutoConnectSetting(mBtManager, device.getAddress()); boolean firstTime = !mBtManager.hasDockAutoConnectSetting(device.getAddress()); CharSequence[] items = initBtSettings(service, device, state, firstTime); Loading @@ -309,14 +306,15 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli CheckBox rememberCheckbox = (CheckBox) view.findViewById(R.id.remember); // check "Remember setting" by default if no value was saved boolean checked = firstTime || getAutoConnectSetting(mBtManager, device.getAddress()); boolean checked = firstTime || mBtManager.getDockAutoConnectSetting(device.getAddress()); rememberCheckbox.setChecked(checked); rememberCheckbox.setOnCheckedChangeListener(this); int viewSpacingLeft = (int) (14 * pixelScaleFactor); int viewSpacingRight = (int) (14 * pixelScaleFactor); ab.setView(view, viewSpacingLeft, 0 /* top */, viewSpacingRight, 0 /* bottom */); if (DEBUG) { Log.d(TAG, "Auto connect = " + getAutoConnectSetting(mBtManager, device.getAddress())); Log.d(TAG, "Auto connect = " + mBtManager.getDockAutoConnectSetting(device.getAddress())); } // Ok Button Loading @@ -339,7 +337,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // Called when the "Remember" Checkbox is clicked public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (DEBUG) Log.d(TAG, "onCheckedChanged: Remember Settings = " + isChecked); saveAutoConnectSetting(mBtManager, mDevice.getAddress(), isChecked); mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), isChecked); } // Called when the dialog is dismissed Loading @@ -355,8 +353,8 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // Called when clicked on the OK button public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { if (!hasAutoConnectSetting(mBtManager, mDevice.getAddress())) { saveAutoConnectSetting(mBtManager, mDevice.getAddress(), true); if (!mBtManager.hasDockAutoConnectSetting(mDevice.getAddress())) { mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), true); } applyBtSettings(mDevice, mStartIdAssociatedWithDialog); Loading Loading @@ -514,23 +512,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli return cachedBluetoothDevice; } public static boolean hasAutoConnectSetting(LocalBluetoothManager localManager, String addr) { return localManager.getSharedPreferences().contains( SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr); } public static boolean getAutoConnectSetting(LocalBluetoothManager localManager, String addr) { return localManager.getSharedPreferences().getBoolean( SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, false); } public static void saveAutoConnectSetting(LocalBluetoothManager localManager, String addr, boolean autoConnect) { SharedPreferences.Editor editor = localManager.getSharedPreferences().edit(); editor.putBoolean(SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, autoConnect); editor.commit(); } // TODO Delete this method if not needed. private Notification getNotification(Service service) { CharSequence title = service.getString(R.string.dock_settings_title); Loading src/com/android/settings/bluetooth/LocalBluetoothManager.java +23 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ public class LocalBluetoothManager { private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME = "last_selected_device_time"; private static final String SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT = "auto_connect_to_dock"; private long mLastScan; public static LocalBluetoothManager getInstance(Context context) { Loading Loading @@ -339,4 +341,25 @@ public class LocalBluetoothManager { System.currentTimeMillis()); editor.commit(); } public boolean hasDockAutoConnectSetting(String addr) { return getSharedPreferences().contains(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr); } public boolean getDockAutoConnectSetting(String addr) { return getSharedPreferences().getBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, false); } public void saveDockAutoConnectSetting(String addr, boolean autoConnect) { SharedPreferences.Editor editor = getSharedPreferences().edit(); editor.putBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, autoConnect); editor.commit(); } public void removeDockAutoConnectSetting(String addr) { SharedPreferences.Editor editor = getSharedPreferences().edit(); editor.remove(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr); editor.commit(); } } Loading
src/com/android/settings/bluetooth/BluetoothEventRedirector.java +45 −3 Original line number Diff line number Diff line Loading @@ -75,10 +75,23 @@ public class BluetoothEventRedirector { } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) { int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState); CachedBluetoothDeviceManager cachedDeviceMgr = mManager.getCachedDeviceManager(); cachedDeviceMgr.onBondingStateChanged(device, bondState); if (bondState == BluetoothDevice.BOND_NONE) { int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR); mManager.getCachedDeviceManager().showUnbondMessage(device, reason); if (device.isBluetoothDock()) { // After a dock is unpaired, we will forget the // setttings mManager.removeDockAutoConnectSetting(device.getAddress()); // if the device is undocked, remove it from the list as // well if (!device.getAddress().equals(getDockedDeviceAddress(context))) { cachedDeviceMgr.onDeviceDisappeared(device); } } int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR); cachedDeviceMgr.showUnbondMessage(device, reason); } } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) { Loading Loading @@ -112,6 +125,16 @@ public class BluetoothEventRedirector { } else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) { int errorMsg = R.string.bluetooth_pairing_error_message; mManager.showError(device, R.string.bluetooth_error_title, errorMsg); } else if (action.equals(Intent.ACTION_DOCK_EVENT)) { // Remove if unpair device upon undocking int anythingButUnDocked = Intent.EXTRA_DOCK_STATE_UNDOCKED + 1; int state = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, anythingButUnDocked); if (state == Intent.EXTRA_DOCK_STATE_UNDOCKED) { if (device.getBondState() == BluetoothDevice.BOND_NONE) { mManager.getCachedDeviceManager().onDeviceDisappeared(device); } } } } }; Loading Loading @@ -143,10 +166,29 @@ public class BluetoothEventRedirector { filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED); filter.addAction(BluetoothDevice.ACTION_UUID); // Dock event broadcasts filter.addAction(Intent.ACTION_DOCK_EVENT); mManager.getContext().registerReceiver(mBroadcastReceiver, filter); } public void stop() { mManager.getContext().unregisterReceiver(mBroadcastReceiver); } // This can't be called from a broadcast receiver where the filter is set in the Manifest. private String getDockedDeviceAddress(Context context) { // This works only because these broadcast intents are "sticky" Intent i = context.registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT)); if (i != null) { int state = i.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED); if (state != Intent.EXTRA_DOCK_STATE_UNDOCKED) { BluetoothDevice device = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null) { return device.getAddress(); } } } return null; } }
src/com/android/settings/bluetooth/DockService.java +8 −27 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; Loading Loading @@ -58,8 +57,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // TODO clean up logs. Disable DEBUG flag for this file and receiver's too private static final boolean DEBUG = true; private static final String SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK = "auto_connect_to_dock"; // Time allowed for the device to be undocked and redocked without severing // the bluetooth connection private static final long UNDOCKED_GRACE_PERIOD = 1000; Loading Loading @@ -214,7 +211,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli } mDevice = device; if (getAutoConnectSetting(mBtManager, device.getAddress())) { if (mBtManager.getDockAutoConnectSetting(device.getAddress())) { // Setting == auto connect initBtSettings(mContext, device, state, false); applyBtSettings(mDevice, startId); Loading Loading @@ -291,7 +288,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli startForeground(0, new Notification()); // Device in a new dock. boolean firstTime = !hasAutoConnectSetting(mBtManager, device.getAddress()); boolean firstTime = !mBtManager.hasDockAutoConnectSetting(device.getAddress()); CharSequence[] items = initBtSettings(service, device, state, firstTime); Loading @@ -309,14 +306,15 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli CheckBox rememberCheckbox = (CheckBox) view.findViewById(R.id.remember); // check "Remember setting" by default if no value was saved boolean checked = firstTime || getAutoConnectSetting(mBtManager, device.getAddress()); boolean checked = firstTime || mBtManager.getDockAutoConnectSetting(device.getAddress()); rememberCheckbox.setChecked(checked); rememberCheckbox.setOnCheckedChangeListener(this); int viewSpacingLeft = (int) (14 * pixelScaleFactor); int viewSpacingRight = (int) (14 * pixelScaleFactor); ab.setView(view, viewSpacingLeft, 0 /* top */, viewSpacingRight, 0 /* bottom */); if (DEBUG) { Log.d(TAG, "Auto connect = " + getAutoConnectSetting(mBtManager, device.getAddress())); Log.d(TAG, "Auto connect = " + mBtManager.getDockAutoConnectSetting(device.getAddress())); } // Ok Button Loading @@ -339,7 +337,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // Called when the "Remember" Checkbox is clicked public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (DEBUG) Log.d(TAG, "onCheckedChanged: Remember Settings = " + isChecked); saveAutoConnectSetting(mBtManager, mDevice.getAddress(), isChecked); mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), isChecked); } // Called when the dialog is dismissed Loading @@ -355,8 +353,8 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli // Called when clicked on the OK button public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { if (!hasAutoConnectSetting(mBtManager, mDevice.getAddress())) { saveAutoConnectSetting(mBtManager, mDevice.getAddress(), true); if (!mBtManager.hasDockAutoConnectSetting(mDevice.getAddress())) { mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), true); } applyBtSettings(mDevice, mStartIdAssociatedWithDialog); Loading Loading @@ -514,23 +512,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli return cachedBluetoothDevice; } public static boolean hasAutoConnectSetting(LocalBluetoothManager localManager, String addr) { return localManager.getSharedPreferences().contains( SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr); } public static boolean getAutoConnectSetting(LocalBluetoothManager localManager, String addr) { return localManager.getSharedPreferences().getBoolean( SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, false); } public static void saveAutoConnectSetting(LocalBluetoothManager localManager, String addr, boolean autoConnect) { SharedPreferences.Editor editor = localManager.getSharedPreferences().edit(); editor.putBoolean(SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, autoConnect); editor.commit(); } // TODO Delete this method if not needed. private Notification getNotification(Service service) { CharSequence title = service.getString(R.string.dock_settings_title); Loading
src/com/android/settings/bluetooth/LocalBluetoothManager.java +23 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ public class LocalBluetoothManager { private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME = "last_selected_device_time"; private static final String SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT = "auto_connect_to_dock"; private long mLastScan; public static LocalBluetoothManager getInstance(Context context) { Loading Loading @@ -339,4 +341,25 @@ public class LocalBluetoothManager { System.currentTimeMillis()); editor.commit(); } public boolean hasDockAutoConnectSetting(String addr) { return getSharedPreferences().contains(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr); } public boolean getDockAutoConnectSetting(String addr) { return getSharedPreferences().getBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, false); } public void saveDockAutoConnectSetting(String addr, boolean autoConnect) { SharedPreferences.Editor editor = getSharedPreferences().edit(); editor.putBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, autoConnect); editor.commit(); } public void removeDockAutoConnectSetting(String addr) { SharedPreferences.Editor editor = getSharedPreferences().edit(); editor.remove(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr); editor.commit(); } }