diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-04-13 23:00:52 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-04-13 23:00:52 +0000 |
commit | ce53cbeef7c3eb3219c081abfad013c21d49184d (patch) | |
tree | 2e430351124ed67e28b66f3b2eea8616ef03b3a7 /src/com/android | |
parent | 6229c0f4eb47c1173a0e1032ba31fb0e3cc6ad71 (diff) | |
parent | 9eac18280579b654557fdf9c5377e0455fb8f62a (diff) | |
download | packages_apps_Settings-ce53cbeef7c3eb3219c081abfad013c21d49184d.tar.gz packages_apps_Settings-ce53cbeef7c3eb3219c081abfad013c21d49184d.tar.bz2 packages_apps_Settings-ce53cbeef7c3eb3219c081abfad013c21d49184d.zip |
Merge "Update bluetooth preference to take user to new screen" into pi-dev
Diffstat (limited to 'src/com/android')
7 files changed, 226 insertions, 99 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index 0f294bd574..c1bcf5076f 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -47,6 +47,7 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh private final LocalBluetoothAdapter mLocalAdapter; private final IntentFilter mIntentFilter; private final RestrictionUtils mRestrictionUtils; + private SwitchWidgetController.OnSwitchChangeListener mCallback; private static final String EVENT_DATA_IS_BT_ON = "is_bluetooth_on"; private static final int EVENT_UPDATE_INDEX = 0; @@ -170,6 +171,7 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh @Override public boolean onSwitchToggled(boolean isChecked) { if (maybeEnforceRestrictions()) { + triggerParentPreferenceCallback(isChecked); return true; } @@ -179,6 +181,7 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); // Reset switch to off mSwitchController.setChecked(false); + triggerParentPreferenceCallback(false); return false; } @@ -193,14 +196,25 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh mSwitchController.setChecked(false); mSwitchController.setEnabled(true); mSwitchController.updateTitle(false); + triggerParentPreferenceCallback(false); return false; } } mSwitchController.setEnabled(false); + triggerParentPreferenceCallback(isChecked); return true; } /** + * Sets a callback back that this enabler will trigger in case the preference using the enabler + * still needed the callback on the SwitchController (which we now use). + * @param listener The listener with a callback to trigger. + */ + public void setToggleCallback(SwitchWidgetController.OnSwitchChangeListener listener) { + mCallback = listener; + } + + /** * Enforces user restrictions disallowing Bluetooth (or its configuration) if there are any. * * @return if there was any user restriction to enforce. @@ -227,4 +241,11 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh return admin; } + // This triggers the callback which was manually set for this enabler since the enabler will + // take over the switch controller callback + private void triggerParentPreferenceCallback(boolean isChecked) { + if (mCallback != null) { + mCallback.onSwitchToggled(isChecked); + } + } } diff --git a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java index c0fa88421f..bbc90c4539 100644 --- a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java +++ b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java @@ -16,75 +16,79 @@ package com.android.settings.bluetooth; import android.content.Context; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; +import android.view.View; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.TogglePreferenceController; +import com.android.settings.R; +import com.android.settings.core.SubSettingLauncher; +import com.android.settings.location.ScanningSettings; import com.android.settings.overlay.FeatureFactory; +import com.android.settings.utils.AnnotationSpan; import com.android.settings.widget.SwitchWidgetController; -import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.bluetooth.LocalBluetoothAdapter; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; +import com.android.settingslib.widget.FooterPreference; /** - * PreferenceController to update of bluetooth {@link SwitchPreference}. It will - * - * 1. Invoke the user toggle - * 2. Listen to the update from {@link LocalBluetoothManager} + * PreferenceController to update of bluetooth state. All behavior except managing the footer text + * is delegated to the SwitchWidgetController it uses. */ -public class BluetoothSwitchPreferenceController extends TogglePreferenceController - implements LifecycleObserver, OnStart, OnStop { +public class BluetoothSwitchPreferenceController + implements LifecycleObserver, OnStart, OnStop, + SwitchWidgetController.OnSwitchChangeListener, View.OnClickListener { - public static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth_switch"; + @VisibleForTesting + LocalBluetoothAdapter mBluetoothAdapter; private LocalBluetoothManager mBluetoothManager; - private SwitchPreference mBtPreference; private BluetoothEnabler mBluetoothEnabler; private RestrictionUtils mRestrictionUtils; - @VisibleForTesting - LocalBluetoothAdapter mBluetoothAdapter; + private SwitchWidgetController mSwitch; + private Context mContext; + private FooterPreference mFooterPreference; - public BluetoothSwitchPreferenceController(Context context) { - this(context, Utils.getLocalBtManager(context), new RestrictionUtils()); + public BluetoothSwitchPreferenceController(Context context, + SwitchWidgetController switchController, + FooterPreference footerPreference) { + this(context, Utils.getLocalBtManager(context), new RestrictionUtils(), switchController, + footerPreference); } @VisibleForTesting public BluetoothSwitchPreferenceController(Context context, - LocalBluetoothManager bluetoothManager, RestrictionUtils restrictionUtils) { - super(context, KEY_TOGGLE_BLUETOOTH); + LocalBluetoothManager bluetoothManager, RestrictionUtils restrictionUtils, + SwitchWidgetController switchController, FooterPreference footerPreference) { mBluetoothManager = bluetoothManager; mRestrictionUtils = restrictionUtils; + mSwitch = switchController; + mContext = context; + mFooterPreference = footerPreference; + + mSwitch.setupView(); + updateText(mSwitch.isChecked()); if (mBluetoothManager != null) { mBluetoothAdapter = mBluetoothManager.getBluetoothAdapter(); } - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - mBtPreference = (SwitchPreference) screen.findPreference(KEY_TOGGLE_BLUETOOTH); - mBluetoothEnabler = new BluetoothEnabler(mContext, - new SwitchController(mBtPreference), - FeatureFactory.getFactory(mContext).getMetricsFeatureProvider(), mBluetoothManager, + mBluetoothEnabler = new BluetoothEnabler(context, + switchController, + FeatureFactory.getFactory(context).getMetricsFeatureProvider(), mBluetoothManager, MetricsEvent.ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE, mRestrictionUtils); - } - - @Override - public int getAvailabilityStatus() { - return mBluetoothAdapter != null ? AVAILABLE : DISABLED_UNSUPPORTED; + mBluetoothEnabler.setToggleCallback(this); } @Override public void onStart() { mBluetoothEnabler.resume(mContext); + if (mSwitch != null) { + updateText(mSwitch.isChecked()); + } } @Override @@ -93,70 +97,30 @@ public class BluetoothSwitchPreferenceController extends TogglePreferenceControl } @Override - public boolean isChecked() { - return mBluetoothAdapter != null ? mBluetoothAdapter.isEnabled() : false; + public boolean onSwitchToggled(boolean isChecked) { + updateText(isChecked); + return true; } @Override - public boolean setChecked(boolean isChecked) { - if (mBluetoothAdapter != null) { - mBluetoothAdapter.setBluetoothEnabled(isChecked); - } - return true; + public void onClick(View v) { + // send users to scanning settings if they click on the link in the summary text + new SubSettingLauncher(mContext) + .setDestination(ScanningSettings.class.getName()) + .setSourceMetricsCategory(MetricsProto.MetricsEvent.BLUETOOTH_FRAGMENT) + .launch(); } - /** - * Control the switch inside {@link SwitchPreference} - */ - @VisibleForTesting - static class SwitchController extends SwitchWidgetController implements - Preference.OnPreferenceChangeListener { - private SwitchPreference mSwitchPreference; - - public SwitchController(SwitchPreference switchPreference) { - mSwitchPreference = switchPreference; - } - - @Override - public void updateTitle(boolean isChecked) { - } - - @Override - public void startListening() { - mSwitchPreference.setOnPreferenceChangeListener(this); - } - - @Override - public void stopListening() { - mSwitchPreference.setOnPreferenceChangeListener(null); - } - - @Override - public void setChecked(boolean checked) { - mSwitchPreference.setChecked(checked); - } - - @Override - public boolean isChecked() { - return mSwitchPreference.isChecked(); - } - - @Override - public void setEnabled(boolean enabled) { - mSwitchPreference.setEnabled(enabled); - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (mListener != null) { - return mListener.onSwitchToggled((Boolean) newValue); - } - return false; - } - - @Override - public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { - mSwitchPreference.setEnabled(admin == null); + @VisibleForTesting void updateText(boolean isChecked) { + if (!isChecked + && Utils.isBluetoothScanningEnabled(mContext)) { + AnnotationSpan.LinkInfo info = new AnnotationSpan.LinkInfo( + AnnotationSpan.LinkInfo.DEFAULT_ANNOTATION, this); + CharSequence text = AnnotationSpan.linkify( + mContext.getText(R.string.bluetooth_scanning_on_info_message), info); + mFooterPreference.setTitle(text); + } else { + mFooterPreference.setTitle(R.string.bluetooth_empty_list_bluetooth_off); } } -} +}
\ No newline at end of file diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java index d5d4e5081e..f5377f551a 100755 --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.DialogInterface; +import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.widget.Toast; @@ -142,4 +143,8 @@ public final class Utils { } }; + public static boolean isBluetoothScanningEnabled(Context context) { + return Settings.Global.getInt(context.getContentResolver(), + Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1; + } } diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java new file mode 100644 index 0000000000..ec616c8682 --- /dev/null +++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.connecteddevice; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.VisibleForTesting; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.SettingsActivity; +import com.android.settings.bluetooth.BluetoothSwitchPreferenceController; +import com.android.settings.core.SubSettingLauncher; +import com.android.settings.core.TogglePreferenceController; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.location.ScanningSettings; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.SearchIndexableRaw; +import com.android.settings.widget.SwitchBar; +import com.android.settings.widget.SwitchBarController; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.widget.FooterPreference; + +import java.util.ArrayList; +import java.util.List; + +/** + * Dedicated screen for allowing the user to toggle bluetooth which displays relevant information to + * the user based on related settings such as bluetooth scanning. + */ +public class BluetoothDashboardFragment extends DashboardFragment { + + private static final String TAG = "BluetoothDashboardFrag"; + public static final String KEY_BLUETOOTH_SCREEN = "bluetooth_switchbar_screen"; + + private FooterPreference mFooterPreference; + private SwitchBar mSwitchBar; + private BluetoothSwitchPreferenceController mController; + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.BLUETOOTH_FRAGMENT; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + public int getHelpResource() { + return R.string.help_uri_bluetooth_screen; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.bluetooth_screen; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + mFooterPreference = mFooterPreferenceMixin.createFooterPreference(); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + SettingsActivity activity = (SettingsActivity) getActivity(); + mSwitchBar = activity.getSwitchBar(); + mController = new BluetoothSwitchPreferenceController(activity, + new SwitchBarController(mSwitchBar), mFooterPreference); + Lifecycle lifecycle = getLifecycle(); + if (lifecycle != null) { + lifecycle.addObserver(mController); + } + } + /** + * For Search. + */ + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List<SearchIndexableRaw> getRawDataToIndex(Context context, + boolean enabled) { + final List<SearchIndexableRaw> result = new ArrayList<>(); + + // Add the activity title + SearchIndexableRaw data = new SearchIndexableRaw(context); + data.title = context.getString(R.string.bluetooth_settings_title); + data.screenTitle = context.getString(R.string.settings_label); + data.keywords = context.getString(R.string.keywords_bluetooth_settings); + data.intentTargetPackage = context.getPackageName(); + data.intentTargetClass = BluetoothDashboardFragment.class.getName(); + data.intentAction = new SubSettingLauncher(context) + .setDestination(ScanningSettings.class.getName()) + .setSourceMetricsCategory(MetricsProto.MetricsEvent.BLUETOOTH_FRAGMENT) + .toIntent() + .getAction(); + data.key = KEY_BLUETOOTH_SCREEN; + result.add(data); + + return result; + } + + @Override + public List<String> getNonIndexableKeys(Context context) { + final List<String> keys = super.getNonIndexableKeys(context); + BluetoothManager manager = + (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); + if (manager != null) { + BluetoothAdapter adapter = manager.getAdapter(); + final int status = adapter != null + ? TogglePreferenceController.AVAILABLE + : TogglePreferenceController.DISABLED_UNSUPPORTED; + if (status != TogglePreferenceController.AVAILABLE) { + keys.add(KEY_BLUETOOTH_SCREEN); + } + } + + return keys; + } + }; +} diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java index 942fd7bd0b..2b55ab12f1 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java @@ -22,7 +22,6 @@ import android.support.annotation.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.bluetooth.BluetoothSwitchPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.nfc.NfcPreferenceController; @@ -77,13 +76,8 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { new NfcPreferenceController(context); controllers.add(nfcPreferenceController); - final BluetoothSwitchPreferenceController bluetoothPreferenceController = - new BluetoothSwitchPreferenceController(context); - controllers.add(bluetoothPreferenceController); - if (lifecycle != null) { lifecycle.addObserver(nfcPreferenceController); - lifecycle.addObserver(bluetoothPreferenceController); } return controllers; diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java index 33bc2e0eee..3b58c64ed3 100644 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java @@ -23,6 +23,7 @@ import com.android.settings.DisplaySettings; import com.android.settings.LegalSettings; import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment; import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment; +import com.android.settings.connecteddevice.BluetoothDashboardFragment; import com.android.settings.datausage.DataUsageSummaryLegacy; import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; import com.android.settings.accessibility.AccessibilitySettings; @@ -185,6 +186,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources { addIndex(VibrationSettings.class); addIndex(RecentLocationRequestSeeAllFragment.class); addIndex(PreviouslyConnectedDeviceDashboardFragment.class); + addIndex(BluetoothDashboardFragment.class); } @Override diff --git a/src/com/android/settings/utils/AnnotationSpan.java b/src/com/android/settings/utils/AnnotationSpan.java index c70cba53be..e6457dac79 100644 --- a/src/com/android/settings/utils/AnnotationSpan.java +++ b/src/com/android/settings/utils/AnnotationSpan.java @@ -80,6 +80,7 @@ public class AnnotationSpan extends URLSpan { */ public static class LinkInfo { private static final String TAG = "AnnotationSpan.LinkInfo"; + public static final String DEFAULT_ANNOTATION = "link"; private final String mAnnotation; private final Boolean mActionable; private final View.OnClickListener mListener; |