diff --git a/res/values/strings.xml b/res/values/strings.xml index 9fe106b149a..a2f1aa879d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3186,6 +3186,10 @@ PRL version MEID (sim slot %1$d) + + On + + Off Both Wi\u2011Fi and Bluetooth scanning are on diff --git a/res/xml/location_services.xml b/res/xml/location_services.xml index ef94886f748..516491c5f1e 100644 --- a/res/xml/location_services.xml +++ b/res/xml/location_services.xml @@ -18,21 +18,21 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/location_services_screen_title"> - - - - + + + + diff --git a/res/xml/location_services_bluetooth_scanning.xml b/res/xml/location_services_bluetooth_scanning.xml new file mode 100644 index 00000000000..fb522f0d5dc --- /dev/null +++ b/res/xml/location_services_bluetooth_scanning.xml @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/res/xml/location_services_wifi_scanning.xml b/res/xml/location_services_wifi_scanning.xml new file mode 100644 index 00000000000..a436fac7666 --- /dev/null +++ b/res/xml/location_services_wifi_scanning.xml @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/src/com/android/settings/location/BluetoothScanningFragment.java b/src/com/android/settings/location/BluetoothScanningFragment.java new file mode 100644 index 00000000000..553f975e2b8 --- /dev/null +++ b/src/com/android/settings/location/BluetoothScanningFragment.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2021 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.location; + +import android.app.settings.SettingsEnums; +import android.content.Context; + +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; + +import java.util.ArrayList; +import java.util.List; + +/** + * A page that configures the Bluetooth scanning setting. + */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) +public class BluetoothScanningFragment extends DashboardFragment { + private static final String TAG = "BluetoothScanningFragment"; + + @Override + public int getMetricsCategory() { + return SettingsEnums.LOCATION_SERVICES; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.location_services_bluetooth_scanning; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + private static List buildPreferenceControllers(Context context) { + final List controllers = new ArrayList<>(); + controllers.add(new BluetoothScanningPreferenceController(context)); + return controllers; + } + + /** + * For Search. + */ + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.location_services_bluetooth_scanning) { + + @Override + public List createPreferenceControllers(Context + context) { + return buildPreferenceControllers(context); + } + }; +} diff --git a/src/com/android/settings/location/BluetoothScanningMainSwitchPreferenceController.java b/src/com/android/settings/location/BluetoothScanningMainSwitchPreferenceController.java new file mode 100644 index 00000000000..051fd8d8f1f --- /dev/null +++ b/src/com/android/settings/location/BluetoothScanningMainSwitchPreferenceController.java @@ -0,0 +1,76 @@ +/* + * Copyright 2021 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.location; + +import android.content.Context; +import android.provider.Settings; +import android.widget.Switch; + +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; +import com.android.settingslib.widget.MainSwitchPreference; +import com.android.settingslib.widget.OnMainSwitchChangeListener; + +/** + * Preference controller for Bluetooth scanning main switch. + */ +public class BluetoothScanningMainSwitchPreferenceController extends TogglePreferenceController + implements OnMainSwitchChangeListener { + + private static final String KEY_BLUETOOTH_SCANNING_SWITCH = "bluetooth_always_scanning_switch"; + + public BluetoothScanningMainSwitchPreferenceController(Context context) { + super(context, KEY_BLUETOOTH_SCANNING_SWITCH); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + MainSwitchPreference pref = screen.findPreference(getPreferenceKey()); + pref.addOnSwitchChangeListener(this); + pref.updateStatus(isChecked()); + } + + @Override + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_location_scanning) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1; + } + + @Override + public boolean setChecked(boolean isChecked) { + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, isChecked ? 1 : 0); + // Returning true means the underlying setting is updated. + return true; + } + + @Override + public void onSwitchChanged(Switch switchView, boolean isChecked) { + if (isChecked != isChecked()) { + setChecked(isChecked); + } + } +} diff --git a/src/com/android/settings/location/LocationServicesBluetoothScanningPreferenceController.java b/src/com/android/settings/location/LocationServicesBluetoothScanningPreferenceController.java new file mode 100644 index 00000000000..9913848eb23 --- /dev/null +++ b/src/com/android/settings/location/LocationServicesBluetoothScanningPreferenceController.java @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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.location; + +import android.content.Context; +import android.provider.Settings; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; + +/** + * Preference controller for Bluetooth scanning in Location Services. + */ +public class LocationServicesBluetoothScanningPreferenceController extends + BasePreferenceController { + + public LocationServicesBluetoothScanningPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public CharSequence getSummary() { + final boolean bleScanOn = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1; + int resId = + bleScanOn ? R.string.scanning_status_text_on : R.string.scanning_status_text_off; + return mContext.getString(resId); + } + + @AvailabilityStatus + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_location_scanning) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } +} diff --git a/src/com/android/settings/location/LocationServicesWifiScanningPreferenceController.java b/src/com/android/settings/location/LocationServicesWifiScanningPreferenceController.java new file mode 100644 index 00000000000..080a023268c --- /dev/null +++ b/src/com/android/settings/location/LocationServicesWifiScanningPreferenceController.java @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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.location; + +import android.content.Context; +import android.net.wifi.WifiManager; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; + +/** + * Preference controller for Wi-Fi scanning in Location Services. + */ +public class LocationServicesWifiScanningPreferenceController extends BasePreferenceController { + + private final WifiManager mWifiManager; + + public LocationServicesWifiScanningPreferenceController(Context context, String key) { + super(context, key); + mWifiManager = context.getSystemService(WifiManager.class); + } + + @Override + public CharSequence getSummary() { + final boolean wifiScanOn = mWifiManager.isScanAlwaysAvailable(); + int resId = + wifiScanOn ? R.string.scanning_status_text_on : R.string.scanning_status_text_off; + return mContext.getString(resId); + } + + @AvailabilityStatus + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_location_scanning) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } +} diff --git a/src/com/android/settings/location/WifiScanningFragment.java b/src/com/android/settings/location/WifiScanningFragment.java new file mode 100644 index 00000000000..f5cb0ae2255 --- /dev/null +++ b/src/com/android/settings/location/WifiScanningFragment.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2021 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.location; + +import android.app.settings.SettingsEnums; +import android.content.Context; + +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; + +import java.util.ArrayList; +import java.util.List; + +/** + * A page that configures the Wi-Fi scanning setting. + */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) +public class WifiScanningFragment extends DashboardFragment { + private static final String TAG = "WifiScanningFragment"; + + @Override + public int getMetricsCategory() { + return SettingsEnums.LOCATION_SERVICES; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.location_services_wifi_scanning; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + private static List buildPreferenceControllers(Context context) { + final List controllers = new ArrayList<>(); + controllers.add(new WifiScanningPreferenceController(context)); + return controllers; + } + + /** + * For Search. + */ + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.location_services_wifi_scanning) { + + @Override + public List createPreferenceControllers(Context + context) { + return buildPreferenceControllers(context); + } + }; +} diff --git a/src/com/android/settings/location/WifiScanningMainSwitchPreferenceController.java b/src/com/android/settings/location/WifiScanningMainSwitchPreferenceController.java new file mode 100644 index 00000000000..a69fdb8890f --- /dev/null +++ b/src/com/android/settings/location/WifiScanningMainSwitchPreferenceController.java @@ -0,0 +1,77 @@ +/* + * Copyright 2021 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.location; + +import android.content.Context; +import android.net.wifi.WifiManager; +import android.widget.Switch; + +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; +import com.android.settingslib.widget.MainSwitchPreference; +import com.android.settingslib.widget.OnMainSwitchChangeListener; + +/** + * Preference controller for Wi-Fi scanning main switch. + */ +public class WifiScanningMainSwitchPreferenceController extends TogglePreferenceController + implements OnMainSwitchChangeListener { + + private static final String KEY_WIFI_SCANNING_SWITCH = "wifi_always_scanning_switch"; + private final WifiManager mWifiManager; + + public WifiScanningMainSwitchPreferenceController(Context context) { + super(context, KEY_WIFI_SCANNING_SWITCH); + mWifiManager = context.getSystemService(WifiManager.class); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + + MainSwitchPreference pref = screen.findPreference(getPreferenceKey()); + pref.addOnSwitchChangeListener(this); + pref.updateStatus(isChecked()); + } + + @Override + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_location_scanning) + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + return mWifiManager.isScanAlwaysAvailable(); + } + + @Override + public boolean setChecked(boolean isChecked) { + mWifiManager.setScanAlwaysAvailable(isChecked); + // Returning true means the underlying setting is updated. + return true; + } + + @Override + public void onSwitchChanged(Switch switchView, boolean isChecked) { + if (isChecked != isChecked()) { + setChecked(isChecked); + } + } +}