diff options
Diffstat (limited to 'src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java')
-rw-r--r-- | src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java | 147 |
1 files changed, 101 insertions, 46 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java index 40bf5bc..0ad8948 100644 --- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java @@ -21,11 +21,11 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.os.Handler; import android.os.SystemProperties; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; import android.preference.Preference; +import android.text.format.DateUtils; import com.android.settings.R; @@ -34,7 +34,7 @@ import com.android.settings.R; * checkbox. It sets/unsets discoverability and keeps track of how much time * until the the discoverability is automatically turned off. */ -final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChangeListener { +final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceClickListener { private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT = "debug.bt.discoverable_time"; @@ -44,6 +44,10 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang private static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600; static final int DISCOVERABLE_TIMEOUT_NEVER = 0; + // Bluetooth advanced settings screen was replaced with action bar items. + // Use the same preference key for discoverable timeout as the old ListPreference. + private static final String KEY_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout"; + private static final String VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES = "twomin"; private static final String VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES = "fivemin"; private static final String VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR = "onehour"; @@ -53,11 +57,17 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang private final Context mContext; private final Handler mUiHandler; - private final CheckBoxPreference mCheckBoxPreference; - private final ListPreference mTimeoutListPreference; + private final Preference mDiscoveryPreference; private final LocalBluetoothAdapter mLocalAdapter; + private final SharedPreferences mSharedPreferences; + + private boolean mDiscoverable; + private int mNumberOfPairedDevices; + + private int mTimeoutSecs = -1; + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -78,21 +88,13 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang }; BluetoothDiscoverableEnabler(Context context, LocalBluetoothAdapter adapter, - CheckBoxPreference checkBoxPreference, ListPreference timeoutListPreference) { + Preference discoveryPreference) { mContext = context; mUiHandler = new Handler(); - mCheckBoxPreference = checkBoxPreference; - mTimeoutListPreference = timeoutListPreference; - - checkBoxPreference.setPersistent(false); - // we actually want to persist this since can't infer from BT device state - mTimeoutListPreference.setPersistent(true); - mLocalAdapter = adapter; - if (adapter == null) { - // Bluetooth not supported - checkBoxPreference.setEnabled(false); - } + mDiscoveryPreference = discoveryPreference; + mSharedPreferences = discoveryPreference.getSharedPreferences(); + discoveryPreference.setPersistent(false); } public void resume() { @@ -102,8 +104,7 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); mContext.registerReceiver(mReceiver, filter); - mCheckBoxPreference.setOnPreferenceChangeListener(this); - mTimeoutListPreference.setOnPreferenceChangeListener(this); + mDiscoveryPreference.setOnPreferenceClickListener(this); handleModeChanged(mLocalAdapter.getScanMode()); } @@ -113,20 +114,14 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang } mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable); - mCheckBoxPreference.setOnPreferenceChangeListener(null); - mTimeoutListPreference.setOnPreferenceChangeListener(null); mContext.unregisterReceiver(mReceiver); + mDiscoveryPreference.setOnPreferenceClickListener(null); } - public boolean onPreferenceChange(Preference preference, Object value) { - if (preference == mCheckBoxPreference) { - // Turn on/off BT discoverability - setEnabled((Boolean) value); - } else if (preference == mTimeoutListPreference) { - mTimeoutListPreference.setValue((String) value); - setEnabled(true); - } - + public boolean onPreferenceClick(Preference preference) { + // toggle discoverability + mDiscoverable = !mDiscoverable; + setEnabled(mDiscoverable); return true; } @@ -138,9 +133,8 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang long endTimestamp = System.currentTimeMillis() + timeout * 1000L; LocalBluetoothPreferences.persistDiscoverableEndTimestamp(mContext, endTimestamp); - updateCountdownSummary(); - mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout); + updateCountdownSummary(); } else { mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE); } @@ -148,22 +142,51 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang private void updateTimerDisplay(int timeout) { if (getDiscoverableTimeout() == DISCOVERABLE_TIMEOUT_NEVER) { - mCheckBoxPreference.setSummaryOn( - mContext.getString(R.string.bluetooth_is_discoverable_always)); + mDiscoveryPreference.setSummary(R.string.bluetooth_is_discoverable_always); } else { - mCheckBoxPreference.setSummaryOn( - mContext.getString(R.string.bluetooth_is_discoverable, timeout)); + String textTimeout = DateUtils.formatElapsedTime(timeout); + mDiscoveryPreference.setSummary(mContext.getString(R.string.bluetooth_is_discoverable, + textTimeout)); } } + void setDiscoverableTimeout(int index) { + String timeoutValue; + switch (index) { + case 0: + default: + mTimeoutSecs = DISCOVERABLE_TIMEOUT_TWO_MINUTES; + timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES; + break; + + case 1: + mTimeoutSecs = DISCOVERABLE_TIMEOUT_FIVE_MINUTES; + timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES; + break; + + case 2: + mTimeoutSecs = DISCOVERABLE_TIMEOUT_ONE_HOUR; + timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR; + break; + + case 3: + mTimeoutSecs = DISCOVERABLE_TIMEOUT_NEVER; + timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_NEVER; + break; + } + mSharedPreferences.edit().putString(KEY_DISCOVERABLE_TIMEOUT, timeoutValue).apply(); + setEnabled(true); // enable discovery and reset timer + } + private int getDiscoverableTimeout() { + if (mTimeoutSecs != -1) { + return mTimeoutSecs; + } + int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1); if (timeout < 0) { - String timeoutValue = mTimeoutListPreference.getValue(); - if (timeoutValue == null) { - mTimeoutListPreference.setValue(VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES); - return DISCOVERABLE_TIMEOUT_TWO_MINUTES; - } + String timeoutValue = mSharedPreferences.getString(KEY_DISCOVERABLE_TIMEOUT, + VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES); if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_NEVER)) { timeout = DISCOVERABLE_TIMEOUT_NEVER; @@ -175,16 +198,48 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang timeout = DISCOVERABLE_TIMEOUT_TWO_MINUTES; } } - + mTimeoutSecs = timeout; return timeout; } - private void handleModeChanged(int mode) { + int getDiscoverableTimeoutIndex() { + int timeout = getDiscoverableTimeout(); + switch (timeout) { + case DISCOVERABLE_TIMEOUT_TWO_MINUTES: + default: + return 0; + + case DISCOVERABLE_TIMEOUT_FIVE_MINUTES: + return 1; + + case DISCOVERABLE_TIMEOUT_ONE_HOUR: + return 2; + + case DISCOVERABLE_TIMEOUT_NEVER: + return 3; + } + } + + void setNumberOfPairedDevices(int pairedDevices) { + mNumberOfPairedDevices = pairedDevices; + setSummaryNotDiscoverable(); + } + + void handleModeChanged(int mode) { if (mode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { - mCheckBoxPreference.setChecked(true); + mDiscoverable = true; updateCountdownSummary(); } else { - mCheckBoxPreference.setChecked(false); + mDiscoverable = false; + setSummaryNotDiscoverable(); + } + } + + private void setSummaryNotDiscoverable() { + if (mNumberOfPairedDevices != 0) { + mDiscoveryPreference.setSummary(R.string.bluetooth_only_visible_to_paired_devices); + } else { + mDiscoveryPreference.setSummary(R.string.bluetooth_not_visible_to_other_devices); } } @@ -199,7 +254,7 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang if (currentTimestamp > endTimestamp) { // We're still in discoverable mode, but maybe there isn't a timeout. - mCheckBoxPreference.setSummaryOn(null); + updateTimerDisplay(0); return; } |