diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f3066ce33ff..ee11802232f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -954,7 +954,7 @@
+ android:value="@string/rotate_settings_class" />
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index d42f5822399..4aa67abc01c 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -2669,6 +2669,54 @@
column="13"/>
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 291a7d5f800..5c651b90c62 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -97,6 +97,15 @@
Make larger
+
+ Use Auto-Rotate
+
+
+
+ Face based Autorotate uses the front camera to see if and how someone is looking at the screen. It allows
+ for reading while lying down and images are never stored or sent to Google.<br><br>
+ <a href="http://support.google.com/mobile?p=telephony_rtt">Learn more</a>
+
Sample text
@@ -2704,8 +2713,18 @@
Display
+
+ com.android.settings.DisplaySettings
Auto-rotate screen
+
+ Off
+
+ On
+
+ On - Face-based
+
+ Enable Face Detection
Colors
@@ -4950,6 +4969,8 @@
Display
Text and display
+
+ Turn screen darker
Interaction controls
@@ -12590,13 +12611,15 @@
SMS
- Preferred for calls & SMS
+ preferred
- Preferred for calls
+ preferred for calls
- Preferred for SMS
+ preferred for SMS
- Temporarily unavailable
+ unavailable
+
+ Temporarily unavailable
No SIM
diff --git a/res/xml/accessibility_text_and_display.xml b/res/xml/accessibility_text_and_display.xml
index 7dce82636b7..bd30e61928d 100644
--- a/res/xml/accessibility_text_and_display.xml
+++ b/res/xml/accessibility_text_and_display.xml
@@ -21,18 +21,33 @@
android:persistent="false"
android:title="@string/accessibility_text_and_display_title">
-
+ android:title="@string/title_font_size"
+ settings:controller="com.android.settings.display.FontSizePreferenceController"
+ settings:searchable="false"/>
+
+
+ android:title="@string/force_bold_text"
+ settings:controller="com.android.settings.accessibility.FontWeightAdjustmentPreferenceController"/>
+
+
-
-
-
-
+ android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
+ settings:controller="com.android.settings.accessibility.HighTextContrastPreferenceController"/>
-
-
-
-
-
-
+ android:title="@string/experimental_category_title">
\ No newline at end of file
diff --git a/res/xml/accessibility_turn_screen_darker.xml b/res/xml/accessibility_turn_screen_darker.xml
new file mode 100644
index 00000000000..d87f23bf2bb
--- /dev/null
+++ b/res/xml/accessibility_turn_screen_darker.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/xml/auto_rotate_settings.xml b/res/xml/auto_rotate_settings.xml
new file mode 100644
index 00000000000..dfa31f71aaa
--- /dev/null
+++ b/res/xml/auto_rotate_settings.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 95c7f5687b4..c7925fb6945 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -115,12 +115,6 @@
android:title="@string/snooze_options_title"
settings:controller="com.android.settings.notification.SnoozeNotificationPreferenceController" />
-
-
-
-
-
-
-
-
createPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context);
+ }
+
+ private static List buildPreferenceControllers(
+ Context context) {
+ final List controllers = new ArrayList<>();
+ controllers.add(
+ new SmartAutoRotatePreferenceController(context, SMART_AUTO_ROTATE_CONTROLLER_KEY));
+ return controllers;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.auto_rotate_settings) {
+
+ @Override
+ public List createPreferenceControllers(
+ Context context) {
+ return buildPreferenceControllers(context);
+ }
+
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ return false;
+ }
+ };
+}
diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java
index 25ec9123bce..24fe284b2e4 100644
--- a/src/com/android/settings/network/InternetPreferenceController.java
+++ b/src/com/android/settings/network/InternetPreferenceController.java
@@ -103,6 +103,7 @@ public class InternetPreferenceController extends AbstractPreferenceController i
if (mPreference == null) {
return;
}
+
final @IdRes int icon = sIconMap.get(mInternetType);
if (icon != 0) {
final Drawable drawable = mContext.getDrawable(icon);
@@ -112,10 +113,17 @@ public class InternetPreferenceController extends AbstractPreferenceController i
mPreference.setIcon(drawable);
}
}
+
+ if (mustUseWiFiHelperSummary(mSummaryHelper.isWifiConnected(),
+ mSummaryHelper.getSummary())) {
+ return;
+ }
+
if (mInternetType == INTERNET_CELLULAR) {
updateCellularSummary();
return;
}
+
final @IdRes int summary = sSummaryMap.get(mInternetType);
if (summary != 0) {
mPreference.setSummary(summary);
@@ -161,9 +169,17 @@ public class InternetPreferenceController extends AbstractPreferenceController i
@Override
public void onSummaryChanged(String summary) {
- if (mPreference != null && mInternetType == INTERNET_WIFI) {
+ mustUseWiFiHelperSummary(mSummaryHelper.isWifiConnected(), summary);
+ }
+
+ @VisibleForTesting
+ boolean mustUseWiFiHelperSummary(boolean isWifiConnected, String summary) {
+ final boolean needUpdate = (mInternetType == INTERNET_WIFI)
+ || (mInternetType == INTERNET_APM_NETWORKS && isWifiConnected);
+ if (needUpdate && mPreference != null) {
mPreference.setSummary(summary);
}
+ return needUpdate;
}
@VisibleForTesting
diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsController.java b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
index 417c4a91c7e..f83418ba551 100644
--- a/src/com/android/settings/network/NetworkProviderCallsSmsController.java
+++ b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
@@ -20,8 +20,10 @@ import static androidx.lifecycle.Lifecycle.Event;
import android.content.Context;
import android.os.UserManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.LifecycleObserver;
@@ -31,6 +33,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -45,7 +48,7 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl
private UserManager mUserManager;
private SubscriptionManager mSubscriptionManager;
private SubscriptionsChangeListener mSubscriptionsChangeListener;
-
+ private TelephonyManager mTelephonyManager;
private RestrictedPreference mPreference;
/**
@@ -57,6 +60,7 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl
mUserManager = context.getSystemService(UserManager.class);
mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
if (lifecycle != null) {
mSubscriptionsChangeListener = new SubscriptionsChangeListener(context, this);
lifecycle.addObserver(this);
@@ -91,16 +95,18 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl
final StringBuilder summary = new StringBuilder();
for (SubscriptionInfo subInfo : subs) {
int subsSize = subs.size();
+ int subId = subInfo.getSubscriptionId();
final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName(
subInfo, mContext);
// Set displayName as summary if there is only one valid SIM.
if (subsSize == 1
- && SubscriptionManager.isValidSubscriptionId(subInfo.getSubscriptionId())) {
+ && SubscriptionManager.isValidSubscriptionId(subId)
+ && isInService(subId)) {
return displayName;
}
- CharSequence status = getPreferredStatus(subInfo);
+ CharSequence status = getPreferredStatus(subsSize, subId);
if (status.toString().isEmpty()) {
// If there are 2 or more SIMs and one of these has no preferred status,
// set only its displayName as summary.
@@ -121,14 +127,14 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl
}
@VisibleForTesting
- protected CharSequence getPreferredStatus(SubscriptionInfo subInfo) {
- final int subId = subInfo.getSubscriptionId();
+ protected CharSequence getPreferredStatus(int subsSize, int subId) {
String status = "";
boolean isDataPreferred = subId == getDefaultVoiceSubscriptionId();
boolean isSmsPreferred = subId == getDefaultSmsSubscriptionId();
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- status = setSummaryResId(R.string.calls_sms_unavailable);
+ if (!SubscriptionManager.isValidSubscriptionId(subId) || !isInService(subId)) {
+ status = setSummaryResId(subsSize > 1 ? R.string.calls_sms_unavailable :
+ R.string.calls_sms_temp_unavailable);
} else {
if (isDataPreferred && isSmsPreferred) {
status = setSummaryResId(R.string.calls_sms_preferred);
@@ -203,4 +209,11 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl
refreshSummary(mPreference);
update();
}
+
+ @VisibleForTesting
+ protected boolean isInService(int subId) {
+ ServiceState serviceState =
+ mTelephonyManager.createForSubscriptionId(subId).getServiceState();
+ return Utils.isInService(serviceState);
+ }
}
diff --git a/src/com/android/settings/network/VpnPreferenceController.java b/src/com/android/settings/network/VpnPreferenceController.java
index 62589d5bc00..9295414ac0a 100644
--- a/src/com/android/settings/network/VpnPreferenceController.java
+++ b/src/com/android/settings/network/VpnPreferenceController.java
@@ -19,12 +19,10 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
-import android.net.IConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
-import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.net.VpnManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -64,7 +62,7 @@ public class VpnPreferenceController extends AbstractPreferenceController
private final String mToggleable;
private final UserManager mUserManager;
private final ConnectivityManager mConnectivityManager;
- private final IConnectivityManager mConnectivityManagerService;
+ private final VpnManager mVpnManager;
private Preference mPreference;
public VpnPreferenceController(Context context) {
@@ -74,8 +72,7 @@ public class VpnPreferenceController extends AbstractPreferenceController
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mConnectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- mConnectivityManagerService = IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ mVpnManager = context.getSystemService(VpnManager.class);
}
@Override
@@ -122,27 +119,20 @@ public class VpnPreferenceController extends AbstractPreferenceController
}
// Copied from SystemUI::SecurityControllerImpl
SparseArray vpns = new SparseArray<>();
- try {
- final List users = mUserManager.getUsers();
- for (UserInfo user : users) {
- VpnConfig cfg = mConnectivityManagerService.getVpnConfig(user.id);
- if (cfg == null) {
+ final List users = mUserManager.getUsers();
+ for (UserInfo user : users) {
+ VpnConfig cfg = mVpnManager.getVpnConfig(user.id);
+ if (cfg == null) {
+ continue;
+ } else if (cfg.legacy) {
+ // Legacy VPNs should do nothing if the network is disconnected. Third-party
+ // VPN warnings need to continue as traffic can still go to the app.
+ final LegacyVpnInfo legacyVpn = mVpnManager.getLegacyVpnInfo(user.id);
+ if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
continue;
- } else if (cfg.legacy) {
- // Legacy VPNs should do nothing if the network is disconnected. Third-party
- // VPN warnings need to continue as traffic can still go to the app.
- final LegacyVpnInfo legacyVpn =
- mConnectivityManagerService.getLegacyVpnInfo(user.id);
- if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
- continue;
- }
}
- vpns.put(user.id, cfg);
}
- } catch (RemoteException rme) {
- // Roll back to previous state
- Log.e(TAG, "Unable to list active VPNs", rme);
- return;
+ vpns.put(user.id, cfg);
}
final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId());
final int uid;
diff --git a/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java b/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java
index 99009c9295e..36b19ba1e60 100644
--- a/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java
@@ -20,6 +20,8 @@ import android.content.Context;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import com.android.settings.Utils;
+
public class CallsDefaultSubscriptionController extends DefaultSubscriptionController {
public CallsDefaultSubscriptionController(Context context, String preferenceKey) {
@@ -40,4 +42,13 @@ public class CallsDefaultSubscriptionController extends DefaultSubscriptionContr
protected void setDefaultSubscription(int subscriptionId) {
mManager.setDefaultVoiceSubscriptionId(subscriptionId);
}
+
+ @Override
+ public CharSequence getSummary() {
+ if (Utils.isProviderModelEnabled(mContext)) {
+ return MobileNetworkUtils.getPreferredStatus(mContext, mManager, true);
+ } else {
+ return super.getSummary();
+ }
+ }
}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index e8f97708042..0834632a0dc 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -73,6 +73,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.ims.WifiCallingQueryImsState;
import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
@@ -600,8 +601,7 @@ public class MobileNetworkUtils {
final Drawable networkDrawable =
iconType == NO_CELL_DATA_TYPE_ICON
? EMPTY_DRAWABLE
- : context
- .getResources().getDrawable(iconType, context.getTheme());
+ : context.getResources().getDrawable(iconType, context.getTheme());
// Overlay the two drawables
final Drawable[] layers = {networkDrawable, signalDrawable};
@@ -920,4 +920,78 @@ public class MobileNetworkUtils {
}
return isWifiCallingEnabled;
}
+
+
+ /**
+ * Returns preferred status of Calls & SMS separately when Provider Model is enabled.
+ */
+ public static CharSequence getPreferredStatus(Context context,
+ SubscriptionManager subscriptionManager, boolean isPreferredCallStatus) {
+ final List subs = SubscriptionUtil.getActiveSubscriptions(
+ subscriptionManager);
+ if (!subs.isEmpty()) {
+ final StringBuilder summary = new StringBuilder();
+ for (SubscriptionInfo subInfo : subs) {
+ int subsSize = subs.size();
+ final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName(
+ subInfo, context);
+
+ // Set displayName as summary if there is only one valid SIM.
+ if (subsSize == 1
+ && SubscriptionManager.isValidSubscriptionId(subInfo.getSubscriptionId())) {
+ return displayName;
+ }
+
+ CharSequence status = isPreferredCallStatus
+ ? getPreferredCallStatus(context, subInfo)
+ : getPreferredSmsStatus(context, subInfo);
+ if (status.toString().isEmpty()) {
+ // If there are 2 or more SIMs and one of these has no preferred status,
+ // set only its displayName as summary.
+ summary.append(displayName);
+ } else {
+ summary.append(displayName)
+ .append(" (")
+ .append(status)
+ .append(")");
+ }
+ // Do not add ", " for the last subscription.
+ if (subInfo != subs.get(subs.size() - 1)) {
+ summary.append(", ");
+ }
+ }
+ return summary;
+ } else {
+ return "";
+ }
+ }
+
+ private static CharSequence getPreferredCallStatus(Context context, SubscriptionInfo subInfo) {
+ final int subId = subInfo.getSubscriptionId();
+ String status = "";
+ boolean isDataPreferred = subId == SubscriptionManager.getDefaultVoiceSubscriptionId();
+
+ if (isDataPreferred) {
+ status = setSummaryResId(context, R.string.calls_sms_preferred);
+ }
+
+ return status;
+ }
+
+ private static CharSequence getPreferredSmsStatus(Context context, SubscriptionInfo subInfo) {
+ final int subId = subInfo.getSubscriptionId();
+ String status = "";
+ boolean isSmsPreferred = subId == SubscriptionManager.getDefaultSmsSubscriptionId();
+
+ if (isSmsPreferred) {
+ status = setSummaryResId(context, R.string.calls_sms_preferred);
+ }
+
+ return status;
+ }
+
+ private static String setSummaryResId(Context context, int resId) {
+ return context.getResources().getString(resId);
+ }
+
}
diff --git a/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java b/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java
index fadddd54745..ca8c0f6c5d3 100644
--- a/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java
@@ -21,6 +21,8 @@ import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import com.android.settings.Utils;
+
public class SmsDefaultSubscriptionController extends DefaultSubscriptionController {
private final boolean mIsAskEverytimeSupported;
@@ -56,4 +58,13 @@ public class SmsDefaultSubscriptionController extends DefaultSubscriptionControl
// Not supporting calling account override by VoIP
return null;
}
+
+ @Override
+ public CharSequence getSummary() {
+ if (Utils.isProviderModelEnabled(mContext)) {
+ return MobileNetworkUtils.getPreferredStatus(mContext, mManager, false);
+ } else {
+ return super.getSummary();
+ }
+ }
}
diff --git a/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java b/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
deleted file mode 100644
index 3c6f17f0da1..00000000000
--- a/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2019 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.notification;
-
-import android.content.Context;
-import android.service.notification.Adjustment;
-
-import com.android.settings.core.TogglePreferenceController;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.List;
-
-public class AssistantCapabilityPreferenceController extends TogglePreferenceController {
-
- static final String PRIORITIZER_KEY = "asst_capability_prioritizer";
- static final String RANKING_KEY = "asst_capability_ranking";
- static final String SMART_KEY = "asst_capabilities_actions_replies";
- private NotificationBackend mBackend;
-
- public AssistantCapabilityPreferenceController(Context context, String key) {
- super(context, key);
- mBackend = new NotificationBackend();
- }
-
- @VisibleForTesting
- void setBackend(NotificationBackend backend) {
- mBackend = backend;
- }
-
- @Override
- public boolean isChecked() {
- List capabilities = mBackend.getAssistantAdjustments(mContext.getPackageName());
- if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
- return capabilities.contains(Adjustment.KEY_IMPORTANCE);
- } else if (RANKING_KEY.equals(getPreferenceKey())) {
- return capabilities.contains(Adjustment.KEY_RANKING_SCORE);
- } else if (SMART_KEY.equals(getPreferenceKey())) {
- return capabilities.contains(Adjustment.KEY_CONTEXTUAL_ACTIONS)
- && capabilities.contains(Adjustment.KEY_TEXT_REPLIES);
- }
- return false;
- }
-
- @Override
- public boolean setChecked(boolean isChecked) {
- if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
- mBackend.allowAssistantAdjustment(Adjustment.KEY_IMPORTANCE, isChecked);
- } else if (RANKING_KEY.equals(getPreferenceKey())) {
- mBackend.allowAssistantAdjustment(Adjustment.KEY_RANKING_SCORE, isChecked);
- } else if (SMART_KEY.equals(getPreferenceKey())) {
- mBackend.allowAssistantAdjustment(Adjustment.KEY_CONTEXTUAL_ACTIONS, isChecked);
- mBackend.allowAssistantAdjustment(Adjustment.KEY_TEXT_REPLIES, isChecked);
- }
- return true;
- }
-
- @Override
- public int getAvailabilityStatus() {
- return mBackend.getAllowedNotificationAssistant() != null
- ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
- }
-}
-
-
diff --git a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java
index df2f54effb4..f931fa4f662 100644
--- a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java
+++ b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java
@@ -16,24 +16,20 @@
package com.android.settings.users;
import android.content.Context;
-import android.os.UserHandle;
import android.provider.Settings;
import androidx.preference.Preference;
-import com.android.internal.widget.LockPatternUtils;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.RestrictedSwitchPreference;
public class AddUserWhenLockedPreferenceController extends TogglePreferenceController {
private final UserCapabilities mUserCaps;
- private final LockPatternUtils mLockPatternUtils;
public AddUserWhenLockedPreferenceController(Context context, String key) {
super(context, key);
mUserCaps = UserCapabilities.create(context);
- mLockPatternUtils = new LockPatternUtils(context);
}
@Override
@@ -57,8 +53,6 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
return DISABLED_FOR_USER;
} else if (mUserCaps.disallowAddUser() || mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
- } else if (!mLockPatternUtils.isSecure(UserHandle.myUserId())) {
- return CONDITIONALLY_UNAVAILABLE;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
diff --git a/src/com/android/settings/vpn2/AppDialogFragment.java b/src/com/android/settings/vpn2/AppDialogFragment.java
index 9c73784d048..45fb9bdb820 100644
--- a/src/com/android/settings/vpn2/AppDialogFragment.java
+++ b/src/com/android/settings/vpn2/AppDialogFragment.java
@@ -18,17 +18,13 @@ package com.android.settings.vpn2;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
-import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
-import android.net.IConnectivityManager;
+import android.net.ConnectivityManager;
import android.net.VpnManager;
import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
-import android.util.Log;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
@@ -52,9 +48,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
private PackageInfo mPackageInfo;
private Listener mListener;
+ private ConnectivityManager mConnectivityManager;
private UserManager mUserManager;
- private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ private VpnManager mVpnManager;
@Override
public int getMetricsCategory() {
@@ -97,7 +93,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
mUserManager = UserManager.get(getContext());
+ mVpnManager = getContext().getSystemService(VpnManager.class);
}
@Override
@@ -145,14 +143,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
return;
}
final int userId = getUserId();
- try {
- mService.setVpnPackageAuthorization(
- mPackageInfo.packageName, userId, VpnManager.TYPE_VPN_NONE);
- onDisconnect(dialog);
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to forget authorization of " + mPackageInfo.packageName +
- " for user " + userId, e);
- }
+ mVpnManager.setVpnPackageAuthorization(
+ mPackageInfo.packageName, userId, VpnManager.TYPE_VPN_NONE);
+ onDisconnect(dialog);
if (mListener != null) {
mListener.onForget();
@@ -164,15 +157,10 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
return;
}
final int userId = getUserId();
- try {
- if (mPackageInfo.packageName.equals(VpnUtils.getConnectedPackage(mService, userId))) {
- mService.setAlwaysOnVpnPackage(userId, null, /* lockdownEnabled */ false,
- /* lockdownAllowlist */ null);
- mService.prepareVpn(mPackageInfo.packageName, VpnConfig.LEGACY_VPN, userId);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to disconnect package " + mPackageInfo.packageName +
- " for user " + userId, e);
+ if (mPackageInfo.packageName.equals(VpnUtils.getConnectedPackage(mVpnManager, userId))) {
+ mConnectivityManager.setAlwaysOnVpnPackageForUser(userId, null,
+ /* lockdownEnabled */ false, /* lockdownAllowlist */ null);
+ mVpnManager.prepareVpn(mPackageInfo.packageName, VpnConfig.LEGACY_VPN, userId);
}
}
diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java
index d2cbcd5c1cf..9422010aed0 100644
--- a/src/com/android/settings/vpn2/AppManagementFragment.java
+++ b/src/com/android/settings/vpn2/AppManagementFragment.java
@@ -29,10 +29,8 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
-import android.net.IConnectivityManager;
+import android.net.VpnManager;
import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
@@ -72,7 +70,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment
private PackageManager mPackageManager;
private DevicePolicyManager mDevicePolicyManager;
private ConnectivityManager mConnectivityManager;
- private IConnectivityManager mConnectivityService;
+ private VpnManager mVpnManager;
// VPN app info
private final int mUserId = UserHandle.myUserId();
@@ -125,8 +123,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment
mPackageManager = getContext().getPackageManager();
mDevicePolicyManager = getContext().getSystemService(DevicePolicyManager.class);
mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
- mConnectivityService = IConnectivityManager.Stub
- .asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ mVpnManager = getContext().getSystemService(VpnManager.class);
mPreferenceVersion = findPreference(KEY_VERSION);
mPreferenceAlwaysOn = (RestrictedSwitchPreference) findPreference(KEY_ALWAYS_ON_VPN);
@@ -335,13 +332,8 @@ public class AppManagementFragment extends SettingsPreferenceFragment
* @return {@code true} if another VPN (VpnService or legacy) is connected or set as always-on.
*/
private boolean isAnotherVpnActive() {
- try {
- final VpnConfig config = mConnectivityService.getVpnConfig(mUserId);
- return config != null && !TextUtils.equals(config.user, mPackageName);
- } catch (RemoteException e) {
- Log.w(TAG, "Failure to look up active VPN", e);
- return false;
- }
+ final VpnConfig config = mVpnManager.getVpnConfig(mUserId);
+ return config != null && !TextUtils.equals(config.user, mPackageName);
}
public static class CannotConnectFragment extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index d6b92d71a01..e88e4efd588 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -21,10 +21,9 @@ import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.net.ConnectivityManager;
-import android.net.IConnectivityManager;
+import android.net.VpnManager;
import android.os.Bundle;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.security.Credentials;
import android.security.KeyStore;
@@ -52,9 +51,8 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
private static final String ARG_EDITING = "editing";
private static final String ARG_EXISTS = "exists";
- private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
private Context mContext;
+ private VpnManager mService;
@Override
@@ -80,6 +78,7 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
public void onAttach(final Context context) {
super.onAttach(context);
mContext = context;
+ mService = context.getSystemService(VpnManager.class);
}
@Override
@@ -212,8 +211,6 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
mService.startLegacyVpn(profile);
} catch (IllegalStateException e) {
Toast.makeText(mContext, R.string.vpn_no_network, Toast.LENGTH_LONG).show();
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to connect", e);
}
}
}
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index 8a2b465d7f2..79f6be3c75b 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -30,16 +30,14 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
-import android.net.IConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.net.VpnManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.security.Credentials;
@@ -92,10 +90,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.build();
- private final IConnectivityManager mConnectivityService = IConnectivityManager.Stub
- .asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
private ConnectivityManager mConnectivityManager;
private UserManager mUserManager;
+ private VpnManager mVpnManager;
private final KeyStore mKeyStore = KeyStore.getInstance();
@@ -124,6 +121,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements
mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ mVpnManager = (VpnManager) getSystemService(Context.VPN_MANAGEMENT_SERVICE);
mUnavailable = isUiRestricted();
setHasOptionsMenu(!mUnavailable);
@@ -467,13 +465,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
@WorkerThread
private Map getConnectedLegacyVpns() {
- try {
- mConnectedLegacyVpn = mConnectivityService.getLegacyVpnInfo(UserHandle.myUserId());
- if (mConnectedLegacyVpn != null) {
- return Collections.singletonMap(mConnectedLegacyVpn.key, mConnectedLegacyVpn);
- }
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Failure updating VPN list with connected legacy VPNs", e);
+ mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId());
+ if (mConnectedLegacyVpn != null) {
+ return Collections.singletonMap(mConnectedLegacyVpn.key, mConnectedLegacyVpn);
}
return Collections.emptyMap();
}
@@ -482,15 +476,11 @@ public class VpnSettings extends RestrictedSettingsFragment implements
private Set getConnectedAppVpns() {
// Mark connected third-party services
Set connections = new ArraySet<>();
- try {
- for (UserHandle profile : mUserManager.getUserProfiles()) {
- VpnConfig config = mConnectivityService.getVpnConfig(profile.getIdentifier());
- if (config != null && !config.legacy) {
- connections.add(new AppVpnInfo(profile.getIdentifier(), config.user));
- }
+ for (UserHandle profile : mUserManager.getUserProfiles()) {
+ VpnConfig config = mVpnManager.getVpnConfig(profile.getIdentifier());
+ if (config != null && !config.legacy) {
+ connections.add(new AppVpnInfo(profile.getIdentifier(), config.user));
}
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Failure updating VPN list with connected app VPNs", e);
}
return connections;
}
diff --git a/src/com/android/settings/vpn2/VpnUtils.java b/src/com/android/settings/vpn2/VpnUtils.java
index 38c56c527d2..c6b79b4432b 100644
--- a/src/com/android/settings/vpn2/VpnUtils.java
+++ b/src/com/android/settings/vpn2/VpnUtils.java
@@ -17,13 +17,11 @@ package com.android.settings.vpn2;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.IConnectivityManager;
+import android.net.VpnManager;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.provider.Settings;
import android.security.Credentials;
import android.security.KeyStore;
-import android.util.Log;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
@@ -71,12 +69,11 @@ public class VpnUtils {
}
public static boolean isVpnActive(Context context) throws RemoteException {
- return getIConnectivityManager().getVpnConfig(context.getUserId()) != null;
+ return getVpnManager(context).getVpnConfig(context.getUserId()) != null;
}
- public static String getConnectedPackage(IConnectivityManager service, final int userId)
- throws RemoteException {
- final VpnConfig config = service.getVpnConfig(userId);
+ public static String getConnectedPackage(VpnManager vpnManager, final int userId) {
+ final VpnConfig config = vpnManager.getVpnConfig(userId);
return config != null ? config.user : null;
}
@@ -84,9 +81,8 @@ public class VpnUtils {
return context.getSystemService(ConnectivityManager.class);
}
- private static IConnectivityManager getIConnectivityManager() {
- return IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ private static VpnManager getVpnManager(Context context) {
+ return context.getSystemService(VpnManager.class);
}
public static boolean isAlwaysOnVpnSet(ConnectivityManager cm, final int userId) {
@@ -94,17 +90,12 @@ public class VpnUtils {
}
public static boolean disconnectLegacyVpn(Context context) {
- try {
- int userId = context.getUserId();
- IConnectivityManager connectivityService = getIConnectivityManager();
- LegacyVpnInfo currentLegacyVpn = connectivityService.getLegacyVpnInfo(userId);
- if (currentLegacyVpn != null) {
- clearLockdownVpn(context);
- connectivityService.prepareVpn(null, VpnConfig.LEGACY_VPN, userId);
- return true;
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Legacy VPN could not be disconnected", e);
+ int userId = context.getUserId();
+ LegacyVpnInfo currentLegacyVpn = getVpnManager(context).getLegacyVpnInfo(userId);
+ if (currentLegacyVpn != null) {
+ clearLockdownVpn(context);
+ getVpnManager(context).prepareVpn(null, VpnConfig.LEGACY_VPN, userId);
+ return true;
}
return false;
}
diff --git a/src/com/android/settings/wifi/WifiSummaryUpdater.java b/src/com/android/settings/wifi/WifiSummaryUpdater.java
index c559e7dcea3..79bab36054a 100644
--- a/src/com/android/settings/wifi/WifiSummaryUpdater.java
+++ b/src/com/android/settings/wifi/WifiSummaryUpdater.java
@@ -98,4 +98,11 @@ public final class WifiSummaryUpdater extends SummaryUpdater {
com.android.settingslib.R.string.preference_summary_default_combination,
ssid, mWifiTracker.statusLabel);
}
+
+ /**
+ * return true if Wi-Fi connected.
+ */
+ public boolean isWifiConnected() {
+ return mWifiTracker.connected;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TurnScreenDarkerFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TurnScreenDarkerFragmentTest.java
new file mode 100644
index 00000000000..f2562011709
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TurnScreenDarkerFragmentTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.XmlTestUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.List;
+
+/** Tests for {@link TurnScreenDarkerFragment}. */
+@RunWith(RobolectricTestRunner.class)
+public class TurnScreenDarkerFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List niks = TurnScreenDarkerFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_turn_screen_darker);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java
new file mode 100644
index 00000000000..b65785f5085
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java
@@ -0,0 +1,173 @@
+/*
+ * 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.display;
+
+import static android.provider.Settings.Secure.CAMERA_AUTOROTATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class SmartAutoRotatePreferenceControllerTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock
+ private PackageManager mPackageManager;
+ private ContentResolver mContentResolver;
+ private SmartAutoRotatePreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory.setupForTest();
+ mContentResolver = RuntimeEnvironment.application.getContentResolver();
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mContext.getContentResolver()).thenReturn(mContentResolver);
+ when(mContext.getString(R.string.auto_rotate_option_off))
+ .thenReturn("Off");
+ when(mContext.getString(R.string.auto_rotate_option_on))
+ .thenReturn("On");
+ when(mContext.getString(R.string.auto_rotate_option_face_based))
+ .thenReturn("On - Face-based");
+
+ disableCameraBasedRotation();
+
+ mController = new SmartAutoRotatePreferenceController(mContext, "smart_auto_rotate");
+ }
+
+ @Test
+ public void isAvailableWhenPolicyAllows() {
+ assertThat(mController.isAvailable()).isFalse();
+
+ enableAutoRotationPreference();
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void updatePreference_settingsIsOff_shouldTurnOffToggle() {
+ disableAutoRotation();
+
+ assertThat(mController.getSummary()).isEqualTo("Off");
+ }
+
+ @Test
+ public void updatePreference_settingsIsOn_shouldTurnOnToggle() {
+ enableAutoRotation();
+
+ assertThat(mController.getSummary()).isEqualTo("On");
+ }
+
+ @Test
+ public void updatePreference_settingsIsCameraBased_shouldTurnOnToggle() {
+ enableCameraBasedRotation();
+ enableAutoRotation();
+
+ assertThat(mController.getSummary()).isEqualTo("On - Face-based");
+
+ disableAutoRotation();
+
+ assertThat(mController.getSummary()).isEqualTo("Off");
+ }
+
+ @Test
+ public void testGetAvailabilityStatus() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(BasePreferenceController
+ .UNSUPPORTED_ON_DEVICE);
+
+ enableAutoRotationPreference();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(BasePreferenceController
+ .AVAILABLE);
+
+ disableAutoRotationPreference();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(BasePreferenceController
+ .UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void isSliceableCorrectKey_returnsTrue() {
+ final AutoRotatePreferenceController controller =
+ new AutoRotatePreferenceController(mContext, "auto_rotate");
+ assertThat(controller.isSliceable()).isTrue();
+ }
+
+ @Test
+ public void isSliceableIncorrectKey_returnsFalse() {
+ final AutoRotatePreferenceController controller =
+ new AutoRotatePreferenceController(mContext, "bad_key");
+ assertThat(controller.isSliceable()).isFalse();
+ }
+
+ private void enableAutoRotationPreference() {
+ when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+ when(mContext.getResources().getBoolean(anyInt())).thenReturn(true);
+ Settings.System.putInt(mContentResolver,
+ Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0);
+ }
+
+ private void disableAutoRotationPreference() {
+ when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+ when(mContext.getResources().getBoolean(anyInt())).thenReturn(true);
+ Settings.System.putInt(mContentResolver,
+ Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 1);
+ }
+
+ private void enableAutoRotation() {
+ Settings.System.putIntForUser(mContentResolver,
+ Settings.System.ACCELEROMETER_ROTATION, 1, UserHandle.USER_CURRENT);
+ }
+
+ private void disableAutoRotation() {
+ Settings.System.putIntForUser(mContentResolver,
+ Settings.System.ACCELEROMETER_ROTATION, 0, UserHandle.USER_CURRENT);
+ }
+
+ private void enableCameraBasedRotation() {
+ Settings.Secure.putIntForUser(mContentResolver,
+ CAMERA_AUTOROTATE, 1, UserHandle.USER_CURRENT);
+ }
+
+ private void disableCameraBasedRotation() {
+ Settings.Secure.putIntForUser(mContentResolver,
+ CAMERA_AUTOROTATE, 0, UserHandle.USER_CURRENT);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
deleted file mode 100644
index 5244c7e8ceb..00000000000
--- a/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2019 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.notification;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
-import static com.android.settings.notification.AssistantCapabilityPreferenceController.PRIORITIZER_KEY;
-import static com.android.settings.notification.AssistantCapabilityPreferenceController.RANKING_KEY;
-import static com.android.settings.notification.AssistantCapabilityPreferenceController.SMART_KEY;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.service.notification.Adjustment;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-@RunWith(RobolectricTestRunner.class)
-public class AssistantCapabilityPreferenceControllerTest {
-
- @Mock
- private NotificationBackend mBackend;
- @Mock
- private PreferenceScreen mScreen;
-
- private Context mContext;
- private AssistantCapabilityPreferenceController mPrioritizerController;
- private AssistantCapabilityPreferenceController mRankingController;
- private AssistantCapabilityPreferenceController mChipController;
- private Preference mPrioritizerPreference;
- private Preference mRankingPreference;
- private Preference mChipPreference;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mPrioritizerController = new AssistantCapabilityPreferenceController(
- mContext, PRIORITIZER_KEY);
- mPrioritizerController.setBackend(mBackend);
- mPrioritizerPreference = new Preference(mContext);
- mPrioritizerPreference.setKey(mPrioritizerController.getPreferenceKey());
- when(mScreen.findPreference(
- mPrioritizerController.getPreferenceKey())).thenReturn(mPrioritizerPreference);
- mRankingController = new AssistantCapabilityPreferenceController(
- mContext, RANKING_KEY);
- mRankingController.setBackend(mBackend);
- mRankingPreference = new Preference(mContext);
- mRankingPreference.setKey(mRankingController.getPreferenceKey());
- when(mScreen.findPreference(
- mRankingController.getPreferenceKey())).thenReturn(mRankingPreference);
- mChipController = new AssistantCapabilityPreferenceController(mContext, SMART_KEY);
- mChipController.setBackend(mBackend);
- mChipPreference = new Preference(mContext);
- mChipPreference.setKey(mChipController.getPreferenceKey());
- when(mScreen.findPreference(
- mChipController.getPreferenceKey())).thenReturn(mChipPreference);
- }
-
- @Test
- public void getAvailabilityStatus_NAS() {
- when(mBackend.getAllowedNotificationAssistant()).thenReturn(mock(ComponentName.class));
- assertThat(mPrioritizerController.getAvailabilityStatus())
- .isEqualTo(AVAILABLE);
- assertThat(mChipController.getAvailabilityStatus())
- .isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_noNAS() {
- when(mBackend.getAllowedNotificationAssistant()).thenReturn(null);
- assertThat(mPrioritizerController.getAvailabilityStatus())
- .isEqualTo(DISABLED_DEPENDENT_SETTING);
- assertThat(mChipController.getAvailabilityStatus())
- .isEqualTo(DISABLED_DEPENDENT_SETTING);
- }
-
- @Test
- public void isChecked_prioritizerSettingIsOff_false() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_USER_SENTIMENT);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mPrioritizerController.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_prioritizerSettingIsOn_true() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_IMPORTANCE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mPrioritizerController.isChecked()).isTrue();
-
- capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_RANKING_SCORE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mPrioritizerController.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_rankingSettingIsOff_false() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_IMPORTANCE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mRankingController.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_rankingSettingIsOn_true() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_RANKING_SCORE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mRankingController.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_chipSettingIsOff_false() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_IMPORTANCE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mChipController.isChecked()).isFalse();
-
- capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_RANKING_SCORE);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mChipController.isChecked()).isFalse();
-
- capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mChipController.isChecked()).isFalse();
-
- capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_TEXT_REPLIES);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mChipController.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_chipSettingIsOn_true() {
- List capabilities = new ArrayList<>();
- capabilities.add(Adjustment.KEY_TEXT_REPLIES);
- capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
- when(mBackend.getAssistantAdjustments(anyString())).thenReturn(capabilities);
- assertThat(mChipController.isChecked()).isTrue();
- }
-
- @Test
- public void onPreferenceChange_prioritizerOn() {
- mPrioritizerController.onPreferenceChange(mPrioritizerPreference, true);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_IMPORTANCE, true);
- }
-
- @Test
- public void onPreferenceChange_prioritizerOff() {
- mPrioritizerController.onPreferenceChange(mPrioritizerPreference, false);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_IMPORTANCE, false);
- }
-
- @Test
- public void onPreferenceChange_rankingOn() {
- mRankingController.onPreferenceChange(mRankingPreference, true);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_RANKING_SCORE, true);
- }
-
- @Test
- public void onPreferenceChange_rankingOff() {
- mRankingController.onPreferenceChange(mRankingPreference, false);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_RANKING_SCORE, false);
- }
-
- @Test
- public void onPreferenceChange_chipsOn() {
- mChipController.onPreferenceChange(mChipPreference, true);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_CONTEXTUAL_ACTIONS, true);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_TEXT_REPLIES, true);
- }
-
- @Test
- public void onPreferenceChange_chipsOff() {
- mChipController.onPreferenceChange(mChipPreference, false);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_CONTEXTUAL_ACTIONS, false);
- verify(mBackend).allowAssistantAdjustment(Adjustment.KEY_TEXT_REPLIES, false);
- }
-}
-
diff --git a/tests/robotests/src/com/android/settings/users/AddUserWhenLockedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/AddUserWhenLockedPreferenceControllerTest.java
index 7bfee10b458..b27b6367879 100644
--- a/tests/robotests/src/com/android/settings/users/AddUserWhenLockedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/AddUserWhenLockedPreferenceControllerTest.java
@@ -18,7 +18,6 @@ package com.android.settings.users;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -28,8 +27,6 @@ import android.provider.Settings.Global;
import androidx.preference.PreferenceScreen;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.RestrictedSwitchPreference;
@@ -42,7 +39,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUserManager.class})
@@ -55,16 +51,13 @@ public class AddUserWhenLockedPreferenceControllerTest {
private Context mContext;
private ShadowUserManager mUserManager;
private AddUserWhenLockedPreferenceController mController;
- private LockPatternUtils mLockPatternUtils;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
- mLockPatternUtils = mock(LockPatternUtils.class);
mUserManager = ShadowUserManager.getShadow();
mController = new AddUserWhenLockedPreferenceController(mContext, "fake_key");
- ReflectionHelpers.setField(mController, "mLockPatternUtils", mLockPatternUtils);
mUserManager.setSupportsMultipleUsers(true);
}
@@ -76,7 +69,6 @@ public class AddUserWhenLockedPreferenceControllerTest {
@Test
public void displayPref_NotAdmin_shouldNotDisplay() {
mUserManager.setIsAdminUser(false);
- when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
final RestrictedSwitchPreference preference = mock(RestrictedSwitchPreference.class);
when(preference.getKey()).thenReturn(mController.getPreferenceKey());
when(mScreen.findPreference(preference.getKey())).thenReturn(preference);
@@ -89,7 +81,6 @@ public class AddUserWhenLockedPreferenceControllerTest {
@Test
public void updateState_NotAdmin_shouldNotDisplayPreference() {
mUserManager.setIsAdminUser(false);
- when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
final RestrictedSwitchPreference preference = mock(RestrictedSwitchPreference.class);
mController.updateState(preference);
@@ -102,10 +93,8 @@ public class AddUserWhenLockedPreferenceControllerTest {
mUserManager.setIsAdminUser(true);
mUserManager.setUserSwitcherEnabled(true);
mUserManager.setSupportsMultipleUsers(true);
- when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
final AddUserWhenLockedPreferenceController controller =
new AddUserWhenLockedPreferenceController(mContext, "fake_key");
- ReflectionHelpers.setField(controller, "mLockPatternUtils", mLockPatternUtils);
final RestrictedSwitchPreference preference = mock(RestrictedSwitchPreference.class);
controller.updateState(preference);
@@ -154,40 +143,4 @@ public class AddUserWhenLockedPreferenceControllerTest {
assertThat(Global.getInt(mContext.getContentResolver(), Global.ADD_USERS_WHEN_LOCKED, 0))
.isEqualTo(0);
}
-
- @Test
- public void updateState_insecureLockScreen_shouldNotDisplayPreference() {
- mUserManager.setIsAdminUser(true);
- mUserManager.setUserSwitcherEnabled(true);
- mUserManager.setSupportsMultipleUsers(true);
- when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
- final AddUserWhenLockedPreferenceController controller =
- new AddUserWhenLockedPreferenceController(mContext, "fake_key");
- ReflectionHelpers.setField(controller, "mLockPatternUtils", mLockPatternUtils);
- final RestrictedSwitchPreference preference = mock(RestrictedSwitchPreference.class);
-
- controller.updateState(preference);
-
- verify(preference).setVisible(false);
- assertThat(controller.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void updateState_secureLockScreen_shouldDisplayPreference() {
- mUserManager.setIsAdminUser(true);
- mUserManager.setUserSwitcherEnabled(true);
- mUserManager.setSupportsMultipleUsers(true);
- when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
- final AddUserWhenLockedPreferenceController controller =
- new AddUserWhenLockedPreferenceController(mContext, "fake_key");
- ReflectionHelpers.setField(controller, "mLockPatternUtils", mLockPatternUtils);
- final RestrictedSwitchPreference preference = mock(RestrictedSwitchPreference.class);
-
- controller.updateState(preference);
-
- verify(preference).setVisible(true);
- assertThat(controller.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
}
diff --git a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
index be8bf27f0e7..ad07953b27e 100644
--- a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
@@ -16,6 +16,7 @@
package com.android.settings.network;
+import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS;
import static com.android.settings.network.InternetUpdater.INTERNET_WIFI;
import static com.google.common.truth.Truth.assertThat;
@@ -57,6 +58,7 @@ import org.mockito.junit.MockitoRule;
public class InternetPreferenceControllerTest {
private static final String TEST_SUMMARY = "test summary";
+ private static final String NOT_CONNECTED = "Not connected";
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -117,13 +119,37 @@ public class InternetPreferenceControllerTest {
}
@Test
- public void onSummaryChanged_shouldUpdatePreferenceSummary() {
+ public void mustUseWiFiHelperSummary_internetWifi_updateSummary() {
mController.onInternetTypeChanged(INTERNET_WIFI);
mController.displayPreference(mScreen);
- mController.onSummaryChanged(TEST_SUMMARY);
+ mController.mustUseWiFiHelperSummary(true /* isWifiConnected */, TEST_SUMMARY);
assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY);
+
+ mController.mustUseWiFiHelperSummary(false /* isWifiConnected */, NOT_CONNECTED);
+
+ assertThat(mPreference.getSummary()).isEqualTo(NOT_CONNECTED);
+ }
+
+ @Test
+ public void mustUseWiFiHelperSummary_internetApmNetworksWifiConnected_updateSummary() {
+ mController.onInternetTypeChanged(INTERNET_APM_NETWORKS);
+ mController.displayPreference(mScreen);
+
+ mController.mustUseWiFiHelperSummary(true /* isWifiConnected */, TEST_SUMMARY);
+
+ assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY);
+ }
+
+ @Test
+ public void mustUseWiFiHelperSummary_internetApmNetworksWifiDisconnected_notUpdateSummary() {
+ mController.onInternetTypeChanged(INTERNET_APM_NETWORKS);
+ mController.displayPreference(mScreen);
+
+ mController.mustUseWiFiHelperSummary(false /* isWifiConnected */, NOT_CONNECTED);
+
+ assertThat(mPreference.getSummary()).isNotEqualTo(NOT_CONNECTED);
}
@Test
diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java
index 16433c3ad5d..eba45d4ffbb 100644
--- a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java
@@ -93,7 +93,7 @@ public class NetworkProviderCallsSmsControllerTest {
private int mDefaultVoiceSubscriptionId;
private int mDefaultSmsSubscriptionId;
-
+ private boolean mIsInService;
@Override
protected int getDefaultVoiceSubscriptionId() {
return mDefaultVoiceSubscriptionId;
@@ -104,6 +104,11 @@ public class NetworkProviderCallsSmsControllerTest {
return mDefaultSmsSubscriptionId;
}
+ @Override
+ protected boolean isInService(int subId) {
+ return mIsInService;
+ }
+
public void setDefaultVoiceSubscriptionId(int subscriptionId) {
mDefaultVoiceSubscriptionId = subscriptionId;
}
@@ -111,6 +116,10 @@ public class NetworkProviderCallsSmsControllerTest {
public void setDefaultSmsSubscriptionId(int subscriptionId) {
mDefaultSmsSubscriptionId = subscriptionId;
}
+
+ public void setInService(boolean inService) {
+ mIsInService = inService;
+ }
}
@Before
@@ -128,7 +137,7 @@ public class NetworkProviderCallsSmsControllerTest {
mPreference = new RestrictedPreference(mContext);
mPreference.setKey(KEY_PREFERENCE_CALLS_SMS);
mController = new MockNetworkProviderCallsSmsController(mContext, mLifecycle);
-
+ mController.setInService(true);
mLifecycleRegistry = new LifecycleRegistry(mLifecycleOwner);
when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
}
@@ -176,7 +185,7 @@ public class NetworkProviderCallsSmsControllerTest {
final StringBuilder summary = new StringBuilder();
summary.append(DISPLAY_NAME_1)
.append(" (")
- .append(setSummaryResId("calls_sms_unavailable"))
+ .append(setSummaryResId("calls_sms_temp_unavailable"))
.append(")");
assertTrue(TextUtils.equals(mController.getSummary(), summary));