diff options
author | Zhihai Xu <zhihaixu@google.com> | 2012-10-17 12:35:14 -0700 |
---|---|---|
committer | Zhihai Xu <zhihaixu@google.com> | 2012-10-17 13:57:43 -0700 |
commit | 0b21b3d725935c03a4ca4ab8476da2b0675a53cd (patch) | |
tree | 4183afbc01a839d1b39c8a5c89411622253f3978 | |
parent | 891185a4fa836c1d386eda0667cf34e293380b48 (diff) | |
download | packages_apps_settings-0b21b3d725935c03a4ca4ab8476da2b0675a53cd.zip packages_apps_settings-0b21b3d725935c03a4ca4ab8476da2b0675a53cd.tar.gz packages_apps_settings-0b21b3d725935c03a4ca4ab8476da2b0675a53cd.tar.bz2 |
bluetooth won't turn on after turn Airplane mode off on setting screen on manta(tablet)
The root cause is normally when change the airplane mode, the bluetooth setting UI
will not be foreground. No listener is setup for bluetooth setting UI when it is
in background. So the onCheckedChanged won't be called and mLocalAdapter.setBluetoothEnabled
won't be called. But for manta, airplane mode setting and bluetooth setting UI both
will show on the foreground due to bigger screen size. When we turn ariplane mode on,
bluetooth manager service will disable bluetooth without changing the persist bluetooth setting.
But bluetooth setting UI will listen to the bluetooth state change intent, it will receive
bluetooth state turn-off intent then it will call mSwitch.setChecked(false) in handleStateChanged,
which cause checked status changed from true to false to trigger the listener (onCheckedChanged)
being called. The listener will call mAdapter.disable() which will call mManagerService.disable(true)
to change bluetooth persist state to OFF. So when we turn back airplane more to OFF,
due to the bluetooth persist state is OFF, we won't turn back bluetooth to ON.
bug 7366814
Change-Id: I07d4a2dfe03fc6775cfeabb28cd3a0cc1fded44e
-rw-r--r-- | src/com/android/settings/bluetooth/BluetoothEnabler.java | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index f08e083..87cf4ee 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -37,7 +37,7 @@ import com.android.settings.WirelessSettings; public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeListener { private final Context mContext; private Switch mSwitch; - + private boolean mValidListener; private final LocalBluetoothAdapter mLocalAdapter; private final IntentFilter mIntentFilter; @@ -52,6 +52,7 @@ public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeLis public BluetoothEnabler(Context context, Switch switch_) { mContext = context; mSwitch = switch_; + mValidListener = false; LocalBluetoothManager manager = LocalBluetoothManager.getInstance(context); if (manager == null) { @@ -74,7 +75,10 @@ public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeLis handleStateChanged(mLocalAdapter.getBluetoothState()); mContext.registerReceiver(mReceiver, mIntentFilter); - mSwitch.setOnCheckedChangeListener(this); + synchronized(this) { + mSwitch.setOnCheckedChangeListener(this); + mValidListener = true; + } } public void pause() { @@ -83,20 +87,26 @@ public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeLis } mContext.unregisterReceiver(mReceiver); - mSwitch.setOnCheckedChangeListener(null); + synchronized(this) { + mSwitch.setOnCheckedChangeListener(null); + mValidListener = false; + } } public void setSwitch(Switch switch_) { if (mSwitch == switch_) return; - mSwitch.setOnCheckedChangeListener(null); - mSwitch = switch_; - mSwitch.setOnCheckedChangeListener(this); int bluetoothState = BluetoothAdapter.STATE_OFF; if (mLocalAdapter != null) bluetoothState = mLocalAdapter.getBluetoothState(); boolean isOn = bluetoothState == BluetoothAdapter.STATE_ON; boolean isOff = bluetoothState == BluetoothAdapter.STATE_OFF; - mSwitch.setChecked(isOn); + + synchronized(this) { + mSwitch.setOnCheckedChangeListener(null); + mSwitch = switch_; + mSwitch.setOnCheckedChangeListener(null); + } + setChecked(isOn); mSwitch.setEnabled(isOn || isOff); } @@ -121,19 +131,31 @@ public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeLis mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_ON: - mSwitch.setChecked(true); + setChecked(true); mSwitch.setEnabled(true); break; case BluetoothAdapter.STATE_TURNING_OFF: mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_OFF: - mSwitch.setChecked(false); + setChecked(false); mSwitch.setEnabled(true); break; default: - mSwitch.setChecked(false); + setChecked(false); mSwitch.setEnabled(true); } } + + private synchronized void setChecked(boolean isChecked) { + // set listener to null, so onCheckedChanged won't be called + // if the checked status on Switch isn't changed by user click + if (mValidListener) { + mSwitch.setOnCheckedChangeListener(null); + } + mSwitch.setChecked(isChecked); + if (mValidListener) { + mSwitch.setOnCheckedChangeListener(this); + } + } } |