Merge commit '0443bc05b860f80925ebe6d46ba9a080313ec3ab' * commit '0443bc05b860f80925ebe6d46ba9a080313ec3ab': b/2314560 Prevent PIN dialog from showing up on undocked docks
This commit is contained in:
@@ -75,10 +75,23 @@ public class BluetoothEventRedirector {
|
|||||||
} else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
|
} else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
|
||||||
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
|
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
|
||||||
BluetoothDevice.ERROR);
|
BluetoothDevice.ERROR);
|
||||||
mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState);
|
CachedBluetoothDeviceManager cachedDeviceMgr = mManager.getCachedDeviceManager();
|
||||||
|
cachedDeviceMgr.onBondingStateChanged(device, bondState);
|
||||||
if (bondState == BluetoothDevice.BOND_NONE) {
|
if (bondState == BluetoothDevice.BOND_NONE) {
|
||||||
int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR);
|
if (device.isBluetoothDock()) {
|
||||||
mManager.getCachedDeviceManager().showUnbondMessage(device, reason);
|
// 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)) {
|
} else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
|
||||||
@@ -112,6 +125,16 @@ public class BluetoothEventRedirector {
|
|||||||
} else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
|
} else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
|
||||||
int errorMsg = R.string.bluetooth_pairing_error_message;
|
int errorMsg = R.string.bluetooth_pairing_error_message;
|
||||||
mManager.showError(device, R.string.bluetooth_error_title, errorMsg);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -143,10 +166,29 @@ public class BluetoothEventRedirector {
|
|||||||
filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED);
|
filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED);
|
||||||
filter.addAction(BluetoothDevice.ACTION_UUID);
|
filter.addAction(BluetoothDevice.ACTION_UUID);
|
||||||
|
|
||||||
|
// Dock event broadcasts
|
||||||
|
filter.addAction(Intent.ACTION_DOCK_EVENT);
|
||||||
|
|
||||||
mManager.getContext().registerReceiver(mBroadcastReceiver, filter);
|
mManager.getContext().registerReceiver(mBroadcastReceiver, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
mManager.getContext().unregisterReceiver(mBroadcastReceiver);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,7 +30,6 @@ import android.content.Context;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -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
|
// TODO clean up logs. Disable DEBUG flag for this file and receiver's too
|
||||||
private static final boolean DEBUG = true;
|
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
|
// Time allowed for the device to be undocked and redocked without severing
|
||||||
// the bluetooth connection
|
// the bluetooth connection
|
||||||
private static final long UNDOCKED_GRACE_PERIOD = 1000;
|
private static final long UNDOCKED_GRACE_PERIOD = 1000;
|
||||||
@@ -214,7 +211,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
}
|
}
|
||||||
|
|
||||||
mDevice = device;
|
mDevice = device;
|
||||||
if (getAutoConnectSetting(mBtManager, device.getAddress())) {
|
if (mBtManager.getDockAutoConnectSetting(device.getAddress())) {
|
||||||
// Setting == auto connect
|
// Setting == auto connect
|
||||||
initBtSettings(mContext, device, state, false);
|
initBtSettings(mContext, device, state, false);
|
||||||
applyBtSettings(mDevice, startId);
|
applyBtSettings(mDevice, startId);
|
||||||
@@ -291,7 +288,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
startForeground(0, new Notification());
|
startForeground(0, new Notification());
|
||||||
|
|
||||||
// Device in a new dock.
|
// Device in a new dock.
|
||||||
boolean firstTime = !hasAutoConnectSetting(mBtManager, device.getAddress());
|
boolean firstTime = !mBtManager.hasDockAutoConnectSetting(device.getAddress());
|
||||||
|
|
||||||
CharSequence[] items = initBtSettings(service, device, state, firstTime);
|
CharSequence[] items = initBtSettings(service, device, state, firstTime);
|
||||||
|
|
||||||
@@ -309,14 +306,15 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
CheckBox rememberCheckbox = (CheckBox) view.findViewById(R.id.remember);
|
CheckBox rememberCheckbox = (CheckBox) view.findViewById(R.id.remember);
|
||||||
|
|
||||||
// check "Remember setting" by default if no value was saved
|
// 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.setChecked(checked);
|
||||||
rememberCheckbox.setOnCheckedChangeListener(this);
|
rememberCheckbox.setOnCheckedChangeListener(this);
|
||||||
int viewSpacingLeft = (int) (14 * pixelScaleFactor);
|
int viewSpacingLeft = (int) (14 * pixelScaleFactor);
|
||||||
int viewSpacingRight = (int) (14 * pixelScaleFactor);
|
int viewSpacingRight = (int) (14 * pixelScaleFactor);
|
||||||
ab.setView(view, viewSpacingLeft, 0 /* top */, viewSpacingRight, 0 /* bottom */);
|
ab.setView(view, viewSpacingLeft, 0 /* top */, viewSpacingRight, 0 /* bottom */);
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "Auto connect = " + getAutoConnectSetting(mBtManager, device.getAddress()));
|
Log.d(TAG, "Auto connect = "
|
||||||
|
+ mBtManager.getDockAutoConnectSetting(device.getAddress()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ok Button
|
// Ok Button
|
||||||
@@ -339,7 +337,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
// Called when the "Remember" Checkbox is clicked
|
// Called when the "Remember" Checkbox is clicked
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
if (DEBUG) Log.d(TAG, "onCheckedChanged: Remember Settings = " + 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
|
// Called when the dialog is dismissed
|
||||||
@@ -355,8 +353,8 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
// Called when clicked on the OK button
|
// Called when clicked on the OK button
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||||
if (!hasAutoConnectSetting(mBtManager, mDevice.getAddress())) {
|
if (!mBtManager.hasDockAutoConnectSetting(mDevice.getAddress())) {
|
||||||
saveAutoConnectSetting(mBtManager, mDevice.getAddress(), true);
|
mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyBtSettings(mDevice, mStartIdAssociatedWithDialog);
|
applyBtSettings(mDevice, mStartIdAssociatedWithDialog);
|
||||||
@@ -514,23 +512,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
return cachedBluetoothDevice;
|
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.
|
// TODO Delete this method if not needed.
|
||||||
private Notification getNotification(Service service) {
|
private Notification getNotification(Service service) {
|
||||||
CharSequence title = service.getString(R.string.dock_settings_title);
|
CharSequence title = service.getString(R.string.dock_settings_title);
|
||||||
|
@@ -78,6 +78,8 @@ public class LocalBluetoothManager {
|
|||||||
private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME =
|
private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME =
|
||||||
"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;
|
private long mLastScan;
|
||||||
|
|
||||||
public static LocalBluetoothManager getInstance(Context context) {
|
public static LocalBluetoothManager getInstance(Context context) {
|
||||||
@@ -345,4 +347,25 @@ public class LocalBluetoothManager {
|
|||||||
System.currentTimeMillis());
|
System.currentTimeMillis());
|
||||||
editor.commit();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user