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));