Merge "Adds 'more details' hyper link." into sc-dev
diff --git a/res/layout/preference_labeled_continuous_slider.xml b/res/layout/preference_labeled_continuous_slider.xml
new file mode 100644
index 0000000..00e8796
--- /dev/null
+++ b/res/layout/preference_labeled_continuous_slider.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingStart="56dp"
+ android:paddingEnd="8dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="16dp"
+ android:layout_marginStart="16dp"
+ android:maxLines="1"
+ android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+ android:textColor="?android:attr/textColorPrimary" />
+
+ <SeekBar
+ android:id="@*android:id/seekbar"
+ android:layout_gravity="center_vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_weight="1"
+ android:maxLines="1"
+ android:textAlignment="viewStart"/>
+
+ <TextView
+ android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="16dp"
+ android:layout_weight="1"
+ android:maxLines="1"
+ android:textAlignment="viewEnd"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/res/values/config.xml b/res/values/config.xml
index e923fbd..984906f 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -506,4 +506,7 @@
<!-- whether use partner overlay theme for outside setupwizard flow -->
<bool name="config_suc_use_partner_resource">false</bool>
+
+ <!-- Cell broacast receiver package name -->
+ <string name="config_cell_broadcast_receiver_package" translatable="false">com.android.cellbroadcastreceiver.module</string>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5abba1f..75884fa 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2985,7 +2985,7 @@
<!-- [CHAR LIMIT=NONE] Display settings screen, setting description for the always-on ambient display feature. -->
<string name="doze_always_on_summary">Increased battery usage</string>
<!-- [CHAR LIMIT=30] Display and accessibility settings screens, setting option name to force bold text. -->
- <string name="force_bold_text">Bold Text</string>
+ <string name="force_bold_text">Bold text</string>
<!-- [CHAR LIMIT=30] Sound & display settings screen, setting option name to change font size -->
<string name="title_font_size">Font size</string>
<!-- Summary for Font size. Lets the user know that this will make text larger or smaller. Appears in the accessibility portion of setup wizard. [CHAR LIMIT=NONE] -->
@@ -4037,7 +4037,7 @@
<string name="managed_profile_location_services">Location services for work</string>
<!-- [CHAR LIMIT=60] Location settings screen, screen title -->
- <string name="location_time_zone_detection_screen_title">Location time zone detection</string>
+ <string name="location_time_zone_detection_screen_title">Use location to set time zone</string>
<!-- [CHAR LIMIT=50] Location settings screen, title for the setting that control whether the
device can use its location for time zone detection. -->
<string name="location_time_zone_detection_enabled_title">Location time zone detection</string>
@@ -4051,7 +4051,7 @@
<!-- [CHAR LIMIT=NONE] Location settings screen, summary when location time zone detection is not
applicable due to other settings like the "automatic time zone detection enabled" setting
being set to "off". -->
- <string name="location_time_zone_detection_auto_is_off">Automatic time zone detection is disabled</string>
+ <string name="location_time_zone_detection_auto_is_off">Automatic time zone is off</string>
<!-- [CHAR LIMIT=NONE] Location settings screen, summary when location time zone detection is not
applicable for the user for unspecified reasons. More specific messages are used when there
is a clear reason. -->
@@ -7519,9 +7519,6 @@
<!-- Summary of multimedia messaging service settings. [CHAR LIMIT=100] -->
<string name="mms_message_summary">Send & receive when mobile data is off</string>
- <!-- Cell broacast receiver package name [DO NOT TRANSLATE] -->
- <string name="cell_broadcast_receiver_package">com.android.cellbroadcastreceiver.module</string>
-
<!-- Title of a preference for whether to allow data during calls that is shown when mobile
data is turned off. This is needed for some multi-SIM scenarios, because the SIM that is
default for data might not be available during a phone call. [CHAR LIMIT=60] -->
@@ -12804,6 +12801,8 @@
<!-- Alert Dialog text when user didn't input the phone number [CHAR LIMIT=50]-->
<string name="smart_forwarding_missing_alert_dialog_text">OK</string>
- <!-- Enable 2G: Title for if user wants to enable 2G [CHAR LIMIT=40] -->
+ <!-- Title for toggle if user wants to enable 2G [CHAR LIMIT=40] -->
<string name="enable_2g_title">Allow 2G</string>
+ <!-- Title for toggle if user wants to enable 2G [CHAR LIMIT=NONE] -->
+ <string name="enable_2g_summary">Use 2G cellular connections. For emergency calls, 2G is always turned on.</string>
</resources>
diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml
index bd2e85c..49d8e9b 100644
--- a/res/xml/app_and_notification.xml
+++ b/res/xml/app_and_notification.xml
@@ -90,7 +90,7 @@
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
- android:targetPackage="@string/cell_broadcast_receiver_package"
+ android:targetPackage="@string/config_cell_broadcast_receiver_package"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings"/>
</com.android.settingslib.RestrictedPreference>
diff --git a/res/xml/configure_notification_settings_v2.xml b/res/xml/configure_notification_settings_v2.xml
index 6c3ec52..9029220 100644
--- a/res/xml/configure_notification_settings_v2.xml
+++ b/res/xml/configure_notification_settings_v2.xml
@@ -109,7 +109,7 @@
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
- android:targetPackage="@string/cell_broadcast_receiver_package"
+ android:targetPackage="@string/config_cell_broadcast_receiver_package"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings"/>
</com.android.settingslib.RestrictedPreference>
diff --git a/res/xml/emergency_settings.xml b/res/xml/emergency_settings.xml
index 774e328..28ae8b1 100644
--- a/res/xml/emergency_settings.xml
+++ b/res/xml/emergency_settings.xml
@@ -39,7 +39,7 @@
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
- android:targetPackage="@string/cell_broadcast_receiver_package"
+ android:targetPackage="@string/config_cell_broadcast_receiver_package"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings"/>
</com.android.settingslib.RestrictedPreference>
</PreferenceScreen>
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index 86f5a83..7ab9893 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -258,5 +258,6 @@
<SwitchPreference
android:key="enable_2g"
android:title="@string/enable_2g_title"
+ android:summary="@string/enable_2g_summary"
settings:controller="com.android.settings.network.telephony.Enable2gPreferenceController" />
</PreferenceScreen>
diff --git a/res/xml/reduce_bright_colors_settings.xml b/res/xml/reduce_bright_colors_settings.xml
index b9ca854..17e8b02 100644
--- a/res/xml/reduce_bright_colors_settings.xml
+++ b/res/xml/reduce_bright_colors_settings.xml
@@ -17,13 +17,16 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
android:persistent="false"
android:title="@string/reduce_bright_colors_preference_title">
- <com.android.settings.widget.SeekBarPreference
+ <com.android.settings.widget.LabeledContinuousSeekBarPreference
android:key="rbc_intensity"
android:persistent="false"
- android:title="@string/reduce_bright_colors_intensity_preference_title"/>
+ android:title="@string/reduce_bright_colors_intensity_preference_title"
+ settings:textStart="@string/reduce_bright_colors_intensity_preference_start_label"
+ settings:textEnd="@string/reduce_bright_colors_intensity_preference_end_label"/>
<SwitchPreference
android:key="rbc_persist"
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index d22a381..b672917 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -309,6 +309,7 @@
mMainSwitch = findViewById(R.id.switch_bar);
if (mMainSwitch != null) {
mMainSwitch.setMetricsTag(getMetricsTag());
+ mMainSwitch.setTranslationZ(findViewById(R.id.main_content).getTranslationZ() + 1);
}
// see if we should show Back/Next buttons
diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
index ea7fb7c..3b220e4 100644
--- a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
@@ -29,8 +29,11 @@
/** PreferenceController for feature intensity. */
public class ReduceBrightColorsIntensityPreferenceController extends SliderPreferenceController {
+ private final ColorDisplayManager mColorDisplayManager;
+
public ReduceBrightColorsIntensityPreferenceController(Context context, String key) {
super(context, key);
+ mColorDisplayManager = context.getSystemService(ColorDisplayManager.class);
}
@Override
@@ -59,31 +62,26 @@
@Override
public final void updateState(Preference preference) {
super.updateState(preference);
- preference.setEnabled(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0) == 1);
+ preference.setEnabled(mColorDisplayManager.isReduceBrightColorsActivated());
}
@Override
public int getSliderPosition() {
- return Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0);
+ return mColorDisplayManager.getReduceBrightColorsStrength();
}
@Override
public boolean setSliderPosition(int position) {
- return Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, position);
+ return mColorDisplayManager.setReduceBrightColorsStrength(position);
}
@Override
public int getMax() {
- // TODO(b/170970675): Call into CDS to get config max intensity
- return 100;
+ return ColorDisplayManager.getMaximumReduceBrightColorsStrength(mContext);
}
@Override
public int getMin() {
- // TODO(b/170970675): Call into CDS to get config min intensity
- return 0;
+ return ColorDisplayManager.getMinimumReduceBrightColorsStrength(mContext);
}
}
diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
index 09690d9..f65bd62 100644
--- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
@@ -29,9 +29,13 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.SwitchPreference;
+
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.widget.SeekBarPreference;
import com.android.settings.widget.SettingsMainSwitchPreference;
import com.android.settingslib.search.SearchIndexable;
@@ -75,7 +79,21 @@
}
};
- return super.onCreateView(inflater, container, savedInstanceState);
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ updateGeneralCategoryOrder();
+ return view;
+ }
+
+ private void updateGeneralCategoryOrder() {
+ final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
+ final SeekBarPreference intensity = findPreference(KEY_INTENSITY);
+ getPreferenceScreen().removePreference(intensity);
+ intensity.setOrder(mShortcutPreference.getOrder() - 2);
+ generalCategory.addPreference(intensity);
+ final SwitchPreference persist = findPreference(KEY_PERSIST);
+ getPreferenceScreen().removePreference(persist);
+ persist.setOrder(mShortcutPreference.getOrder() - 1);
+ generalCategory.addPreference(persist);
}
@Override
@@ -83,17 +101,6 @@
super.onViewCreated(view, savedInstanceState);
}
- /** Customizes the order by preference key. */
- protected List<String> getPreferenceOrderList() {
- final List<String> lists = new ArrayList<>();
- lists.add(KEY_USE_SERVICE_PREFERENCE);
- lists.add(KEY_INTENSITY);
- lists.add(KEY_GENERAL_CATEGORY);
- lists.add(KEY_PERSIST);
- lists.add(KEY_INTRODUCTION_CATEGORY);
- return lists;
- }
-
@Override
public void onResume() {
super.onResume();
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index ff46722..dde5be1 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -128,8 +128,15 @@
@Override
protected void initSettingsPreference() {
+ // If the device doesn't support magnification area, it should hide the settings preference.
+ if (!getContext().getResources().getBoolean(
+ com.android.internal.R.bool.config_magnification_area)) {
+ return;
+ }
mSettingsPreference = new Preference(getPrefContext());
mSettingsPreference.setTitle(R.string.accessibility_menu_item_settings);
+ // TODO(b/177371954): "magnification area" should be brought up to the highest level of the
+ // settings UI so that it appears below "shortcut" to replace "settings.
mSettingsPreference.setFragment(MagnificationSettingsFragment.class.getName());
mSettingsPreference.setPersistent(false);
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 52b1a8d..5b74a88 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -180,6 +180,9 @@
// Keep Package Installer enabled.
keepEnabledPackages.add(mContext.getString(R.string.config_package_installer_package_name));
+ if (mPm.getWellbeingPackageName() != null) {
+ keepEnabledPackages.add(mPm.getWellbeingPackageName());
+ }
return keepEnabledPackages;
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbBackend.java b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
index 4773aca..244818f 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbBackend.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
@@ -28,7 +28,7 @@
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
import android.os.UserHandle;
import android.os.UserManager;
@@ -74,9 +74,8 @@
mIsAdminUser = userManager.isAdminUser();
mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI);
- ConnectivityManager cm =
- (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- mTetheringSupported = cm.isTetheringSupported();
+ final TetheringManager tm = context.getSystemService(TetheringManager.class);
+ mTetheringSupported = tm.isTetheringSupported();
updatePorts();
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
index 12e978f..668ec3f 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
@@ -16,14 +16,17 @@
package com.android.settings.connecteddevice.usb;
-import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_USB;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
@@ -43,10 +46,13 @@
* Provides options for selecting the default USB mode.
*/
public class UsbDefaultFragment extends RadioButtonPickerFragment {
+
+ private static final String TAG = "UsbDefaultFragment";
+
@VisibleForTesting
UsbBackend mUsbBackend;
@VisibleForTesting
- ConnectivityManager mConnectivityManager;
+ TetheringManager mTetheringManager;
@VisibleForTesting
OnStartTetheringCallback mOnStartTetheringCallback = new OnStartTetheringCallback();
@VisibleForTesting
@@ -57,6 +63,7 @@
boolean mIsStartTethering = false;
private UsbConnectionBroadcastReceiver mUsbReceiver;
+ private Handler mHandler = new Handler();
@VisibleForTesting
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
@@ -71,7 +78,7 @@
public void onAttach(Context context) {
super.onAttach(context);
mUsbBackend = new UsbBackend(context);
- mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener,
mUsbBackend);
getSettingsLifecycle().addObserver(mUsbReceiver);
@@ -138,9 +145,9 @@
if (!Utils.isMonkeyRunning()) {
if (functions == UsbManager.FUNCTION_RNDIS) {
// We need to have entitlement check for usb tethering, so use API in
- // ConnectivityManager.
+ // TetheringManager.
mIsStartTethering = true;
- mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */,
+ mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback);
} else {
mIsStartTethering = false;
@@ -159,20 +166,19 @@
}
@VisibleForTesting
- final class OnStartTetheringCallback extends
- ConnectivityManager.OnStartTetheringCallback {
+ final class OnStartTetheringCallback implements
+ TetheringManager.StartTetheringCallback {
@Override
public void onTetheringStarted() {
- super.onTetheringStarted();
// Set default usb functions again to make internal data persistent
mCurrentFunctions = UsbManager.FUNCTION_RNDIS;
mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
}
@Override
- public void onTetheringFailed() {
- super.onTetheringFailed();
+ public void onTetheringFailed(int error) {
+ Log.w(TAG, "onTetheringFailed() error : " + error);
mUsbBackend.setDefaultUsbFunctions(mPreviousFunctions);
updateCandidates();
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java
index 99e9d50..40626fb 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java
@@ -17,11 +17,12 @@
package com.android.settings.connecteddevice.usb;
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
-import static android.net.ConnectivityManager.TETHERING_USB;
import android.content.Context;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
+import android.os.Handler;
+import android.os.HandlerExecutor;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -55,7 +56,8 @@
}
private PreferenceCategory mProfilesContainer;
- private ConnectivityManager mConnectivityManager;
+ private TetheringManager mTetheringManager;
+ private Handler mHandler = new Handler();
@VisibleForTesting
OnStartTetheringCallback mOnStartTetheringCallback;
@VisibleForTesting
@@ -64,7 +66,7 @@
public UsbDetailsFunctionsController(Context context, UsbDetailsFragment fragment,
UsbBackend backend) {
super(context, fragment, backend);
- mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+ mTetheringManager = context.getSystemService(TetheringManager.class);
mOnStartTetheringCallback = new OnStartTetheringCallback();
mPreviousFunction = mUsbBackend.getCurrentFunctions();
}
@@ -130,7 +132,7 @@
+ UsbManager.usbFunctionsToString(previousFunction));
}
if (function != previousFunction && !Utils.isMonkeyRunning()
- && !shouldIgnoreClickEvent(function, previousFunction)) {
+ && !isClickEventIgnored(function, previousFunction)) {
mPreviousFunction = previousFunction;
//Update the UI in advance to make it looks smooth
@@ -144,8 +146,9 @@
if (function == UsbManager.FUNCTION_RNDIS) {
// We need to have entitlement check for usb tethering, so use API in
- // ConnectivityManager.
- mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */,
+ // TetheringManager.
+ mTetheringManager.startTethering(
+ TetheringManager.TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback);
} else {
mUsbBackend.setCurrentFunctions(function);
@@ -153,7 +156,7 @@
}
}
- private boolean shouldIgnoreClickEvent(long function, long previousFunction) {
+ private boolean isClickEventIgnored(long function, long previousFunction) {
return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP;
}
@@ -172,12 +175,11 @@
}
@VisibleForTesting
- final class OnStartTetheringCallback extends
- ConnectivityManager.OnStartTetheringCallback {
+ final class OnStartTetheringCallback implements TetheringManager.StartTetheringCallback {
@Override
- public void onTetheringFailed() {
- super.onTetheringFailed();
+ public void onTetheringFailed(int error) {
+ Log.w(TAG, "onTetheringFailed() error : " + error);
mUsbBackend.setCurrentFunctions(mPreviousFunction);
}
}
diff --git a/src/com/android/settings/datausage/DataSaverBackend.java b/src/com/android/settings/datausage/DataSaverBackend.java
index f13e88e..e39e41a 100644
--- a/src/com/android/settings/datausage/DataSaverBackend.java
+++ b/src/com/android/settings/datausage/DataSaverBackend.java
@@ -20,10 +20,7 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.net.INetworkPolicyListener;
import android.net.NetworkPolicyManager;
-import android.os.RemoteException;
-import android.telephony.SubscriptionPlan;
import android.util.SparseIntArray;
import com.android.settings.overlay.FeatureFactory;
@@ -180,33 +177,17 @@
}
- private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
- @Override
- public void onUidRulesChanged(int uid, int uidRules) throws RemoteException {
- }
-
+ private final NetworkPolicyManager.Listener mPolicyListener =
+ new NetworkPolicyManager.Listener() {
@Override
public void onUidPoliciesChanged(final int uid, final int uidPolicies) {
ThreadUtils.postOnMainThread(() -> handleUidPoliciesChanged(uid, uidPolicies));
}
@Override
- public void onMeteredIfacesChanged(String[] strings) throws RemoteException {
- }
-
- @Override
- public void onRestrictBackgroundChanged(final boolean isDataSaving) throws RemoteException {
+ public void onRestrictBackgroundChanged(final boolean isDataSaving) {
ThreadUtils.postOnMainThread(() -> handleRestrictBackgroundChanged(isDataSaving));
}
-
- @Override
- public void onSubscriptionOverride(int subId, int overrideMask, int overrideValue,
- int[] networkTypes) {
- }
-
- @Override
- public void onSubscriptionPlansChanged(int subId, SubscriptionPlan[] plans) {
- }
};
public interface Listener {
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 367e7c5..e34ae9b 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -200,8 +200,6 @@
mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
mSwitchBar.setTitle(getContext().getString(R.string.developer_options_main_switch_title));
mSwitchBar.show();
- mSwitchBar.setTranslationZ(
- getActivity().findViewById(R.id.main_content).getTranslationZ() + 1);
mSwitchBarController = new DevelopmentSwitchBarController(
this /* DevelopmentSettings */, mSwitchBar, mIsAvailable,
getSettingsLifecycle());
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index 245118d..f4ef0eb 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -85,7 +85,8 @@
final Context prefContext = mCategoryRecentLocationRequests.getContext();
final List<RecentLocationAccesses.Access> recentLocationAccesses = new ArrayList<>();
final UserManager userManager = UserManager.get(mContext);
- for (RecentLocationAccesses.Access access : mRecentLocationApps.getAppListSorted()) {
+ for (RecentLocationAccesses.Access access : mRecentLocationApps.getAppListSorted(
+ /* showSystemApps= */ false)) {
if (isRequestMatchesProfileType(userManager, access, mType)) {
recentLocationAccesses.add(access);
}
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index aa70459..be8f257 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -70,6 +70,9 @@
if (sActiveResultsForTesting != null) {
return sActiveResultsForTesting;
}
+ if (manager == null) {
+ return Collections.emptyList();
+ }
final List<SubscriptionInfo> subscriptions = manager.getActiveSubscriptionInfoList();
if (subscriptions == null) {
return new ArrayList<>();
diff --git a/src/com/android/settings/network/ims/VolteQueryImsState.java b/src/com/android/settings/network/ims/VolteQueryImsState.java
index 167b4b1..b09a130 100644
--- a/src/com/android/settings/network/ims/VolteQueryImsState.java
+++ b/src/com/android/settings/network/ims/VolteQueryImsState.java
@@ -16,11 +16,14 @@
package com.android.settings.network.ims;
+import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS;
+
import android.content.Context;
import android.telecom.TelecomManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsException;
+import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;
@@ -133,4 +136,15 @@
}
return isEnabledByUser(mSubId);
}
+
+ /**
+ * Get VoIMS opt-in configuration.
+ *
+ * @return true when VoIMS opt-in has been enabled, otherwise false
+ */
+ public boolean isVoImsOptInEnabled() {
+ int voImsOptInStatus = ProvisioningManager.createForSubscriptionId(mSubId)
+ .getProvisioningIntValue(KEY_VOIMS_OPT_IN_STATUS);
+ return voImsOptInStatus == ProvisioningManager.PROVISIONING_VALUE_ENABLED;
+ }
}
diff --git a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java
index 2c6c963..8d037fb 100644
--- a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java
@@ -32,6 +32,7 @@
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
+import java.util.List;
import java.util.Objects;
/**
@@ -67,14 +68,22 @@
@Override
public int getAvailabilityStatus(int subId) {
- return hasBackupCallingFeature(subId) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ if (!hasBackupCallingFeature(subId)) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ List<SubscriptionInfo> subIdList = getActiveSubscriptionList();
+ SubscriptionInfo subInfo = getSubscriptionInfoFromList(subIdList, subId);
+ if (subInfo == null) { // given subId is not actives
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ return (subIdList.size() > 1) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
/**
* Implementation of abstract methods
**/
public boolean setChecked(boolean isChecked) {
- ImsMmTelManager imsMmTelMgr = getImsMmTelManager();
+ ImsMmTelManager imsMmTelMgr = getImsMmTelManager(mSubId);
if (imsMmTelMgr == null) {
return false;
}
@@ -92,7 +101,7 @@
* Implementation of abstract methods
**/
public boolean isChecked() {
- ImsMmTelManager imsMmTelMgr = getImsMmTelManager();
+ ImsMmTelManager imsMmTelMgr = getImsMmTelManager(mSubId);
if (imsMmTelMgr == null) {
return false;
}
@@ -110,16 +119,17 @@
if ((preference == null) || (!(preference instanceof SwitchPreference))) {
return;
}
+ SubscriptionInfo subInfo = getSubscriptionInfoFromActiveList(mSubId);
+
mPreference = preference;
final SwitchPreference switchPreference = (SwitchPreference) preference;
- switchPreference.setChecked(isChecked());
+ switchPreference.setChecked((subInfo != null) ? isChecked() : false);
- updateSummary(getLatestSummary());
+ updateSummary(getLatestSummary(subInfo));
}
- private String getLatestSummary() {
- SubscriptionInfo subInfo = getSubscriptionInfo();
+ private String getLatestSummary(SubscriptionInfo subInfo) {
return Objects.toString((subInfo == null) ? null
: SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, mContext), "");
}
@@ -144,19 +154,34 @@
CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL, false);
}
- private ImsMmTelManager getImsMmTelManager() {
- if (!SubscriptionManager.isUsableSubscriptionId(mSubId)) {
+ private ImsMmTelManager getImsMmTelManager(int subId) {
+ if (!SubscriptionManager.isUsableSubscriptionId(subId)) {
return null;
}
ImsManager imsMgr = mContext.getSystemService(ImsManager.class);
- return (imsMgr == null) ? null : imsMgr.getImsMmTelManager(mSubId);
+ return (imsMgr == null) ? null : imsMgr.getImsMmTelManager(subId);
}
- private SubscriptionInfo getSubscriptionInfo() {
- SubscriptionManager subInfoMgr = mContext.getSystemService(SubscriptionManager.class);
- if (subInfoMgr == null) {
+ private List<SubscriptionInfo> getActiveSubscriptionList() {
+ SubscriptionManager subscriptionManager =
+ mContext.getSystemService(SubscriptionManager.class);
+ return SubscriptionUtil.getActiveSubscriptions(subscriptionManager);
+ }
+
+ private SubscriptionInfo getSubscriptionInfoFromList(
+ List<SubscriptionInfo> subInfoList, int subId) {
+ for (SubscriptionInfo subInfo : subInfoList) {
+ if ((subInfo != null) && (subInfo.getSubscriptionId() == subId)) {
+ return subInfo;
+ }
+ }
+ return null;
+ }
+
+ private SubscriptionInfo getSubscriptionInfoFromActiveList(int subId) {
+ if (!SubscriptionManager.isUsableSubscriptionId(subId)) {
return null;
}
- return subInfoMgr.getActiveSubscriptionInfo(mSubId);
+ return getSubscriptionInfoFromList(getActiveSubscriptionList(), subId);
}
}
diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
index fbbdabc..c2b1fc4 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
@@ -107,12 +107,18 @@
if (!isModeMatched()) {
return CONDITIONALLY_UNAVAILABLE;
}
+ final VolteQueryImsState queryState = queryImsState(subId);
+ // Show VoLTE settings if VoIMS opt-in has been enabled irrespective of other VoLTE settings
+ if (queryState.isVoImsOptInEnabled()) {
+ return AVAILABLE;
+ }
+
final PersistableBundle carrierConfig = getCarrierConfigForSubId(subId);
if ((carrierConfig == null)
|| carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL)) {
return CONDITIONALLY_UNAVAILABLE;
}
- final VolteQueryImsState queryState = queryImsState(subId);
+
if (!queryState.isReadyToVoLte()) {
return CONDITIONALLY_UNAVAILABLE;
}
diff --git a/src/com/android/settings/security/RequestManageCredentials.java b/src/com/android/settings/security/RequestManageCredentials.java
index 4ee4fdf..eb7a7d8 100644
--- a/src/com/android/settings/security/RequestManageCredentials.java
+++ b/src/com/android/settings/security/RequestManageCredentials.java
@@ -208,7 +208,7 @@
.write();
finishWithResultCancelled();
});
- allowButton.setOnClickListener(b -> setOrUpdateCredentialManagementApp());
+ allowButton.setOnClickListener(b -> setOrUpdateCredentialManagementAppAndFinish());
}
private void loadExtendedFloatingActionButton() {
@@ -220,13 +220,14 @@
});
}
- private void setOrUpdateCredentialManagementApp() {
+ private void setOrUpdateCredentialManagementAppAndFinish() {
try {
mKeyChainConnection.getService().setCredentialManagementApp(
mCredentialManagerPackage, mAuthenticationPolicy);
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_ACCEPTED)
.write();
+ setResult(RESULT_OK);
} catch (RemoteException e) {
Log.e(TAG, "Unable to set credential manager app", e);
logRequestFailure();
diff --git a/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java b/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java
index 9c45ef4..e8eab68 100644
--- a/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java
+++ b/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java
@@ -28,6 +28,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
@@ -88,6 +89,10 @@
if (key != null) {
if (key instanceof PrivateKey) {
mKeyCertAliases.add(alias);
+ final Certificate[] cert = keyStore.getCertificateChain(alias);
+ if (cert != null && cert.length >= 2) {
+ mCaCertAliases.add(alias);
+ }
}
} else {
if (keyStore.getCertificate(alias) != null) {
diff --git a/src/com/android/settings/vpn2/ConfigDialog.java b/src/com/android/settings/vpn2/ConfigDialog.java
index a0c7a1e..42bc67d 100644
--- a/src/com/android/settings/vpn2/ConfigDialog.java
+++ b/src/com/android/settings/vpn2/ConfigDialog.java
@@ -24,8 +24,6 @@
import android.net.ProxyInfo;
import android.os.Bundle;
import android.os.SystemProperties;
-import android.security.Credentials;
-import android.security.KeyStore;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
@@ -42,10 +40,12 @@
import com.android.internal.net.VpnProfile;
import com.android.net.module.util.ProxyUtils;
import com.android.settings.R;
+import com.android.settings.utils.AndroidKeystoreAliasLoader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
/**
@@ -58,7 +58,7 @@
class ConfigDialog extends AlertDialog implements TextWatcher,
View.OnClickListener, AdapterView.OnItemSelectedListener,
CompoundButton.OnCheckedChangeListener {
- private final KeyStore mKeyStore = KeyStore.getInstance();
+ private static final String TAG = "ConfigDialog";
private final DialogInterface.OnClickListener mListener;
private final VpnProfile mProfile;
@@ -153,10 +153,13 @@
mL2tpSecret.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Medium);
mIpsecIdentifier.setText(mProfile.ipsecIdentifier);
mIpsecSecret.setText(mProfile.ipsecSecret);
- loadCertificates(mIpsecUserCert, Credentials.USER_PRIVATE_KEY, 0, mProfile.ipsecUserCert);
- loadCertificates(mIpsecCaCert, Credentials.CA_CERTIFICATE,
+ AndroidKeystoreAliasLoader androidKeystoreAliasLoader =
+ new AndroidKeystoreAliasLoader(null);
+ loadCertificates(mIpsecUserCert, androidKeystoreAliasLoader.getKeyCertAliases(), 0,
+ mProfile.ipsecUserCert);
+ loadCertificates(mIpsecCaCert, androidKeystoreAliasLoader.getCaCertAliases(),
R.string.vpn_no_ca_cert, mProfile.ipsecCaCert);
- loadCertificates(mIpsecServerCert, Credentials.USER_CERTIFICATE,
+ loadCertificates(mIpsecServerCert, androidKeystoreAliasLoader.getKeyCertAliases(),
R.string.vpn_no_server_cert, mProfile.ipsecServerCert);
mSaveLogin.setChecked(mProfile.saveLogin);
mAlwaysOnVpn.setChecked(mProfile.key.equals(VpnUtils.getLockdownVpn()));
@@ -511,27 +514,30 @@
typeSpinner.setAdapter(adapter);
}
- private void loadCertificates(Spinner spinner, String prefix, int firstId, String selected) {
+ private void loadCertificates(Spinner spinner, Collection<String> choices, int firstId,
+ String selected) {
Context context = getContext();
String first = (firstId == 0) ? "" : context.getString(firstId);
- String[] certificates = mKeyStore.list(prefix);
+ String[] myChoices;
- if (certificates == null || certificates.length == 0) {
- certificates = new String[] {first};
+ if (choices == null || choices.size() == 0) {
+ myChoices = new String[] {first};
} else {
- String[] array = new String[certificates.length + 1];
- array[0] = first;
- System.arraycopy(certificates, 0, array, 1, certificates.length);
- certificates = array;
+ myChoices = new String[choices.size() + 1];
+ myChoices[0] = first;
+ int i = 1;
+ for (String c : choices) {
+ myChoices[i++] = c;
+ }
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
- context, android.R.layout.simple_spinner_item, certificates);
+ context, android.R.layout.simple_spinner_item, myChoices);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
- for (int i = 1; i < certificates.length; ++i) {
- if (certificates[i].equals(selected)) {
+ for (int i = 1; i < myChoices.length; ++i) {
+ if (myChoices[i].equals(selected)) {
spinner.setSelection(i);
break;
}
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index f339a69..b8825fe 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -25,7 +25,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.security.Credentials;
-import android.security.KeyStore;
+import android.security.LegacyVpnProfileStore;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
@@ -151,9 +151,8 @@
return;
}
- // Delete from KeyStore
- KeyStore keyStore = KeyStore.getInstance();
- keyStore.delete(Credentials.VPN + profile.key, KeyStore.UID_SELF);
+ // Delete from profile store.
+ LegacyVpnProfileStore.remove(Credentials.VPN + profile.key);
updateLockdownVpn(false, profile);
}
@@ -188,8 +187,7 @@
}
private void save(VpnProfile profile, boolean lockdown) {
- KeyStore.getInstance().put(Credentials.VPN + profile.key, profile.encode(),
- KeyStore.UID_SELF, /* flags */ 0);
+ LegacyVpnProfileStore.put(Credentials.VPN + profile.key, profile.encode());
// Flush out old version of profile
disconnect(profile);
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index 0a3b2b0..7635733 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -41,7 +41,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.security.Credentials;
-import android.security.KeyStore;
+import android.security.LegacyVpnProfileStore;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -57,7 +57,6 @@
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnProfile;
-import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.RestrictedSettingsFragment;
import com.android.settings.widget.GearPreference;
@@ -94,8 +93,6 @@
private UserManager mUserManager;
private VpnManager mVpnManager;
- private final KeyStore mKeyStore = KeyStore.getInstance();
-
private Map<String, LegacyVpnPreference> mLegacyVpnPreferences = new ArrayMap<>();
private Map<AppVpnInfo, AppPreference> mAppPreferences = new ArrayMap<>();
@@ -222,7 +219,7 @@
final Context context = activity.getApplicationContext();
// Run heavy RPCs before switching to UI thread
- final List<VpnProfile> vpnProfiles = loadVpnProfiles(mKeyStore);
+ final List<VpnProfile> vpnProfiles = loadVpnProfiles();
final List<AppVpnInfo> vpnApps = getVpnApps(context, /* includeProfiles */ true);
final Map<String, LegacyVpnInfo> connectedLegacyVpns = getConnectedLegacyVpns();
@@ -540,12 +537,13 @@
return result;
}
- static List<VpnProfile> loadVpnProfiles(KeyStore keyStore, int... excludeTypes) {
+ private static List<VpnProfile> loadVpnProfiles() {
final ArrayList<VpnProfile> result = Lists.newArrayList();
- for (String key : keyStore.list(Credentials.VPN)) {
- final VpnProfile profile = VpnProfile.decode(key, keyStore.get(Credentials.VPN + key));
- if (profile != null && !ArrayUtils.contains(excludeTypes, profile.type)) {
+ for (String key : LegacyVpnProfileStore.list(Credentials.VPN)) {
+ final VpnProfile profile = VpnProfile.decode(key,
+ LegacyVpnProfileStore.get(Credentials.VPN + key));
+ if (profile != null) {
result.add(profile);
}
}
diff --git a/src/com/android/settings/vpn2/VpnUtils.java b/src/com/android/settings/vpn2/VpnUtils.java
index 4c9338c..d6a5578 100644
--- a/src/com/android/settings/vpn2/VpnUtils.java
+++ b/src/com/android/settings/vpn2/VpnUtils.java
@@ -20,7 +20,7 @@
import android.os.RemoteException;
import android.provider.Settings;
import android.security.Credentials;
-import android.security.KeyStore;
+import android.security.LegacyVpnProfileStore;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
@@ -28,27 +28,25 @@
/**
* Utility functions for vpn.
*
- * Keystore methods should only be called in system user
+ * LegacyVpnProfileStore methods should only be called in system user
*/
public class VpnUtils {
private static final String TAG = "VpnUtils";
public static String getLockdownVpn() {
- final byte[] value = KeyStore.getInstance().get(
- Credentials.LOCKDOWN_VPN, true /* suppressKeyNotFoundWarning */);
+ final byte[] value = LegacyVpnProfileStore.get(Credentials.LOCKDOWN_VPN);
return value == null ? null : new String(value);
}
public static void clearLockdownVpn(Context context) {
- KeyStore.getInstance().delete(Credentials.LOCKDOWN_VPN);
+ LegacyVpnProfileStore.remove(Credentials.LOCKDOWN_VPN);
// Always notify VpnManager after keystore update
getVpnManager(context).updateLockdownVpn();
}
public static void setLockdownVpn(Context context, String lockdownKey) {
- KeyStore.getInstance().put(Credentials.LOCKDOWN_VPN, lockdownKey.getBytes(),
- KeyStore.UID_SELF, /* flags */ 0);
+ LegacyVpnProfileStore.put(Credentials.LOCKDOWN_VPN, lockdownKey.getBytes());
// Always notify VpnManager after keystore update
getVpnManager(context).updateLockdownVpn();
}
diff --git a/src/com/android/settings/widget/LabeledContinuousSeekBarPreference.java b/src/com/android/settings/widget/LabeledContinuousSeekBarPreference.java
new file mode 100644
index 0000000..e269818
--- /dev/null
+++ b/src/com/android/settings/widget/LabeledContinuousSeekBarPreference.java
@@ -0,0 +1,44 @@
+/*
+ * 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.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.settings.R;
+
+/** A continuous labeled slider preference */
+public class LabeledContinuousSeekBarPreference extends LabeledSeekBarPreference {
+ public LabeledContinuousSeekBarPreference(Context context) {
+ this(context, null);
+ }
+
+ public LabeledContinuousSeekBarPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public LabeledContinuousSeekBarPreference(Context context, AttributeSet attrs,
+ int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public LabeledContinuousSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ setLayoutResource(R.layout.preference_labeled_continuous_slider);
+ }
+}
diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
index 76f9b41..80a0021 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
@@ -176,6 +176,7 @@
* Update the status of switch but doesn't notify the mOnBeforeListener.
*/
public void setCheckedInternal(boolean checked) {
+ super.setChecked(checked);
if (mMainSwitchBar != null) {
mMainSwitchBar.setCheckedInternal(checked);
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index 3df6221..0ed6747 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -31,6 +31,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.Resources;
import android.os.Bundle;
import android.provider.Settings;
import android.view.LayoutInflater;
@@ -75,7 +76,8 @@
"com.android.server.accessibility.MagnificationController";
private TestToggleScreenMagnificationPreferenceFragment mFragment;
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext;
+ private Resources mResources;
@Mock
private PreferenceManager mPreferenceManager;
@@ -86,10 +88,14 @@
public void setUpTestFragment() {
MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
mFragment = spy(new TestToggleScreenMagnificationPreferenceFragment());
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mFragment.getContext()).thenReturn(mContext);
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mFragment.getContext().getResources()).thenReturn(mResources);
doReturn(null).when(mFragment).getPreferenceScreen();
doReturn(mActivity).when(mFragment).getActivity();
}
@@ -250,6 +256,16 @@
assertThat(expectedType).isEqualTo(UserShortcutType.HARDWARE | UserShortcutType.TRIPLETAP);
}
+ @Test
+ public void initSettingsPreference_notSupportsMagnificationArea_settingsPreferenceIsNull() {
+ when(mResources.getBoolean(
+ com.android.internal.R.bool.config_magnification_area))
+ .thenReturn(false);
+ mFragment.initSettingsPreference();
+
+ assertThat(mFragment.mSettingsPreference).isNull();
+ }
+
private void putStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
index b816a18..b3f732f 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
@@ -34,7 +34,7 @@
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
import android.os.UserHandle;
import android.os.UserManager;
@@ -57,7 +57,7 @@
@Mock
private UserManager mUserManager;
@Mock
- private ConnectivityManager mConnectivityManager;
+ private TetheringManager mTetheringManager;
@Mock
private UsbPort mUsbPort;
@Mock
@@ -69,8 +69,8 @@
when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI))
.thenReturn(true);
when((Object) mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
- when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
- .thenReturn(mConnectivityManager);
+ when((Object) mContext.getSystemService(
+ TetheringManager.class)).thenReturn(mTetheringManager);
when(mUsbManager.getPorts()).thenReturn(Collections.singletonList(mUsbPort));
when(mUsbPortStatus.isConnected()).thenReturn(true);
when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
index 4afe22a..c751e98 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
@@ -18,11 +18,12 @@
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
-import static android.net.ConnectivityManager.TETHERING_USB;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -30,7 +31,7 @@
import static org.mockito.Mockito.when;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
import androidx.preference.PreferenceScreen;
@@ -50,7 +51,7 @@
@Mock
private UsbBackend mUsbBackend;
@Mock
- private ConnectivityManager mConnectivityManager;
+ private TetheringManager mTetheringManager;
private UsbDefaultFragment mFragment;
@@ -59,7 +60,7 @@
MockitoAnnotations.initMocks(this);
mFragment = new TestFragment();
mFragment.mUsbBackend = mUsbBackend;
- mFragment.mConnectivityManager = mConnectivityManager;
+ mFragment.mTetheringManager = mTetheringManager;
}
@Test
@@ -136,8 +137,9 @@
mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS));
- verify(mConnectivityManager).startTethering(TETHERING_USB, true,
- mFragment.mOnStartTetheringCallback);
+ verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
+ any(),
+ eq(mFragment.mOnStartTetheringCallback));
assertThat(mFragment.mPreviousFunctions).isEqualTo(
UsbManager.FUNCTION_MTP);
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
index 3ea2756..9118645 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
@@ -18,11 +18,12 @@
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
-import static android.net.ConnectivityManager.TETHERING_USB;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -31,7 +32,7 @@
import android.content.Context;
import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceCategory;
@@ -73,7 +74,7 @@
@Mock
private FragmentActivity mActivity;
@Mock
- private ConnectivityManager mConnectivityManager;
+ private TetheringManager mTetheringManager;
@Before
public void setUp() {
@@ -89,7 +90,7 @@
when(mFragment.getContext()).thenReturn(mContext);
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
- when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+ when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
mDetailsFunctionsController = new UsbDetailsFunctionsController(mContext, mFragment,
mUsbBackend);
@@ -245,8 +246,9 @@
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
- verify(mConnectivityManager).startTethering(TETHERING_USB, true,
- mDetailsFunctionsController.mOnStartTetheringCallback);
+ verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
+ any(),
+ eq(mDetailsFunctionsController.mOnStartTetheringCallback));
assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo(
UsbManager.FUNCTION_MTP);
}
@@ -295,15 +297,16 @@
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
verify(mUsbBackend, never()).setCurrentFunctions(UsbManager.FUNCTION_PTP);
- verify(mConnectivityManager, never()).startTethering(TETHERING_USB, true,
- mDetailsFunctionsController.mOnStartTetheringCallback);
+ verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
+ any(),
+ eq(mDetailsFunctionsController.mOnStartTetheringCallback));
}
@Test
public void onTetheringFailed_resetPreviousFunctions() {
mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_PTP;
- mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed();
+ mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed(0);
verify(mUsbBackend).setCurrentFunctions(UsbManager.FUNCTION_PTP);
}
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BaseBluetoothDialogPreferenceTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BaseBluetoothDialogPreferenceTest.java
index 8a34930..323486e 100644
--- a/tests/robotests/src/com/android/settings/development/bluetooth/BaseBluetoothDialogPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/development/bluetooth/BaseBluetoothDialogPreferenceTest.java
@@ -105,6 +105,7 @@
public void onBindDialogView_checkRadioButtonsText() {
when(mView.findViewById(ID1)).thenReturn(mRadioButton1);
when(mView.findViewById(ID2)).thenReturn(mRadioButton2);
+ when(mView.findViewById(TEXT_VIEW_ID)).thenReturn(mTextView);
assertThat(mRadioButton1.getText()).isNotEqualTo(BUTTON1);
assertThat(mRadioButton2.getText()).isNotEqualTo(BUTTON2);
@@ -118,6 +119,7 @@
public void onBindDialogView_checkRadioButtonsState() {
when(mView.findViewById(ID1)).thenReturn(mRadioButton1);
when(mView.findViewById(ID2)).thenReturn(mRadioButton2);
+ when(mView.findViewById(TEXT_VIEW_ID)).thenReturn(mTextView);
List<Integer> indexes = new ArrayList<>();
indexes.add(0);
when(mCallback.getSelectableIndex()).thenReturn(indexes);
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
index 5feee60..32c8627 100644
--- a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
@@ -98,7 +98,7 @@
@Test
@Ignore
public void updateState_whenAppListIsEmpty_shouldDisplayTitleTextAndDetailsText() {
- doReturn(new ArrayList<>()).when(mRecentLocationApps).getAppListSorted();
+ doReturn(new ArrayList<>()).when(mRecentLocationApps).getAppListSorted(false);
mController.displayPreference(mScreen);
mController.updateState(mLayoutPreference);
diff --git a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
index dee8817..8dac893 100644
--- a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
@@ -24,11 +24,14 @@
import android.content.Context;
import android.content.res.Resources;
+import android.hardware.display.ColorDisplayManager;
import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.internal.R;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -79,8 +82,19 @@
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1);
mPreferenceController.onPreferenceChange(/* preference= */ null, 20);
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0))
+ assertThat(
+ mContext.getSystemService(
+ ColorDisplayManager.class).getReduceBrightColorsStrength())
.isEqualTo(20);
}
+
+ @Test
+ public void rangeOfSlider_staysWithinValidRange() {
+ when(mResources.getInteger(
+ R.integer.config_reduceBrightColorsStrengthMax)).thenReturn(90);
+ when(mResources.getInteger(
+ R.integer.config_reduceBrightColorsStrengthMin)).thenReturn(10);
+ assertThat(mPreferenceController.getMax() - mPreferenceController.getMin())
+ .isEqualTo(80);
+ }
}