diff --git a/color-check-baseline.xml b/color-check-baseline.xml index e6bf1ec29be..48a204f2cd2 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -413,6 +413,38 @@ column="5"/> + + + + + + + + + + + + + + + + + + + + + + + + @@ -1305,7 +1401,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1321,7 +1417,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1337,7 +1433,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1353,7 +1449,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1369,7 +1465,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1385,7 +1481,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1401,7 +1497,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1417,7 +1513,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1433,7 +1529,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1449,7 +1545,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1465,7 +1561,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1481,7 +1577,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1497,7 +1593,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1513,7 +1609,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1529,7 +1625,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1545,7 +1641,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1561,7 +1657,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1577,7 +1673,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1593,7 +1689,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1609,7 +1705,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1625,7 +1721,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1641,7 +1737,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1657,7 +1753,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1673,7 +1769,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1689,7 +1785,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1705,7 +1801,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1721,7 +1817,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1737,7 +1833,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1753,7 +1849,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1769,7 +1865,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1785,7 +1881,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1801,7 +1897,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1817,7 +1913,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1833,7 +1929,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1849,7 +1945,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1865,7 +1961,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1881,7 +1977,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1897,7 +1993,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1913,7 +2009,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1929,7 +2025,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1945,7 +2041,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1961,7 +2057,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1977,7 +2073,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1993,7 +2089,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -2093,6 +2189,230 @@ column="9"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - @@ -3529,7 +4153,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~"> @@ -3545,7 +4169,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~"> @@ -3561,10 +4185,26 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + + + + + + + + + + + + + + + + + + diff --git a/res/drawable/fingerprint_enroll_introduction.xml b/res/drawable/fingerprint_enroll_introduction.xml index 9781c54000f..1ad4302cd61 100644 --- a/res/drawable/fingerprint_enroll_introduction.xml +++ b/res/drawable/fingerprint_enroll_introduction.xml @@ -21,33 +21,33 @@ android:viewportHeight="210.0" android:viewportWidth="210.0"> diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml index 7783d723d33..77a10197f1b 100644 --- a/res/layout/face_enroll_introduction.xml +++ b/res/layout/face_enroll_introduction.xml @@ -27,7 +27,7 @@ @@ -42,24 +42,23 @@ + android:layout_marginTop="-24dp" + android:layout_marginBottom="4dp"> - + android:layout_width="match_parent" + android:layout_height="match_parent" + android:contentDescription="@null" + android:src="@drawable/face_enroll_intro_illustration"/> - + + android:orientation="vertical"> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_footer_title_2" + android:textColor="?android:attr/textColorPrimary"/> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_footer_message_2" + android:textColor="?android:attr/textColorPrimary"/> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_footer_message_3" + android:textColor="?android:attr/textColorPrimary"/> @@ -115,7 +118,8 @@ android:layout_height="wrap_content" android:textAlignment="viewStart" android:paddingTop="12dp" - android:text="@string/security_settings_fingerprint_enroll_introduction_footer_title_1" /> + android:text="@string/security_settings_fingerprint_enroll_introduction_footer_title_1" + android:textColor="?android:attr/textColorPrimary"/> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_footer_message_4" + android:textColor="?android:attr/textColorPrimary"/> @@ -147,7 +152,8 @@ android:layout_height="wrap_content" android:textAlignment="viewStart" android:paddingTop="12dp" - android:text="@string/security_settings_fingerprint_enroll_introduction_footer_title_2" /> + android:text="@string/security_settings_fingerprint_enroll_introduction_footer_title_2" + android:textColor="?android:attr/textColorPrimary"/> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_footer_message_5" + android:textColor="?android:attr/textColorPrimary"/> + android:text="@string/security_settings_fingerprint_v2_enroll_introduction_message_learn_more" + android:textColor="?android:attr/textColorPrimary"/> diff --git a/res/layout/font_size_activity.xml b/res/layout/font_size_activity.xml index c3b26ae7526..8850f8694e0 100644 --- a/res/layout/font_size_activity.xml +++ b/res/layout/font_size_activity.xml @@ -56,7 +56,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" - android:layoutDirection="ltr" android:paddingTop="8dp"> + android:textAppearance="?android:attr/textAppearanceListItem" /> + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:textColor="@*android:color/material_red_A700" + android:contentDescription="@string/battery_missing_link_a11y_message" /> diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml index faf7962ee59..0b685144134 100644 --- a/res/values-night/colors.xml +++ b/res/values-night/colors.xml @@ -41,5 +41,10 @@ @*android:color/surface_header_dark #f28b82 + + + #5bb974 + #669df6 + #5e5e5e diff --git a/res/values/colors.xml b/res/values/colors.xml index bd41f1ef08e..71d110b3408 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -126,6 +126,11 @@ #fffdd835 #ff9e9e9e + + #1e8e3e + #1a73e8 + #e3e3e3 + #ffff0000 #FF32c1de diff --git a/res/values/strings.xml b/res/values/strings.xml index c6ea2d273ba..a02ac79675c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -103,7 +103,7 @@ Face Detection uses the front-facing camera to improve Auto-rotate accuracy. Images are never stored or sent to Google.<br><br> - <a href="http://support.google.com/mobile?p=telephony_rtt">Learn more</a> + <a href="http://support.google.com/mobile?p=telephony_rtt">Learn more about Auto-rotate screen</a> Sample text - - <a href=" https://support.google.com/android/answer/3467281">Learn more</a> + + https://support.google.com/android/answer/3467281 @@ -5335,8 +5334,8 @@ Swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold. Customize accessibility button - - Learn more + + Learn more about %1$s Hold volume keys @@ -6052,7 +6051,7 @@ History details - View battery usage + Battery Usage View usage for past 24 hours @@ -6100,7 +6099,7 @@ Charging temporarily limited - Battery limited temporarily. Learn more. + To preserve your battery. Learn more. Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage: @@ -6201,9 +6200,11 @@ ^1 % - Can’t update battery info + Problem reading the battery meter. + + Tap to learn more about this error Stop app? @@ -10473,13 +10474,13 @@ Allowing %1$s to always run in the background may reduce battery life. \n\nYou can change this later from Settings > Apps & notifications. - %1$s use since last full charge + %1$s use for past 24 hours Power management - No battery use since last full charge + No battery use for past 24 hours App settings diff --git a/res/xml/auto_brightness_detail.xml b/res/xml/auto_brightness_detail.xml index d0bf3348666..a7c85e8759b 100644 --- a/res/xml/auto_brightness_detail.xml +++ b/res/xml/auto_brightness_detail.xml @@ -27,10 +27,11 @@ settings:preview="@drawable/aab_brightness" settings:controller="com.android.settings.widget.VideoPreferenceController"/> - diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 7c4966b7707..954d3ef74d0 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -21,13 +21,11 @@ android:key="privacy_dashboard_page" android:title="@string/privacy_dashboard_title"> - @@ -42,7 +40,6 @@ @@ -52,7 +49,6 @@ android:key="privacy_permissions_usage" android:title="@string/permissions_usage_title" android:summary="@string/permissions_usage_summary" - settings:allowDividerAbove="true" settings:searchable="false" settings:controller="com.android.settings.privacy.PrivacyHubPreferenceController"> diff --git a/res/xml/security_settings_face.xml b/res/xml/security_settings_face.xml index 229c9df78a4..6d7c0ba8d4b 100644 --- a/res/xml/security_settings_face.xml +++ b/res/xml/security_settings_face.xml @@ -70,21 +70,17 @@ settings:controller="com.android.settings.biometrics.face.FaceSettingsLockscreenBypassPreferenceController" /> - - + - - + { + final Intent helpIntent = HelpUtils.getHelpIntent( + mContext, mContext.getString(getHelpResource()), + mContext.getClass().getName()); + view.startActivityForResult(helpIntent, 0); + }); + + final String learnMoreContentDescription = mContext.getString( + R.string.footer_learn_more_content_description, getLabelName()); + footerPreference.setLearnMoreContentDescription(learnMoreContentDescription); } } } diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 4b1725ffe63..7c189436b60 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -55,6 +55,7 @@ import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; import com.android.settings.utils.LocaleUtils; import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; +import com.android.settingslib.HelpUtils; import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.widget.OnMainSwitchChangeListener; @@ -520,14 +521,25 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference new AccessibilityFooterPreference(screen.getContext()); htmlFooterPreference.setKey(KEY_HTML_DESCRIPTION_PREFERENCE); htmlFooterPreference.setSummary(htmlDescription); + htmlFooterPreference.setContentDescription( + generateFooterContentDescription(htmlDescription)); + // Only framework tools support help link if (getHelpResource() != 0) { - htmlFooterPreference.appendHelpLink(getHelpResource()); + htmlFooterPreference.setLearnMoreAction(view -> { + final Intent helpIntent = HelpUtils.getHelpIntent( + getContext(), getContext().getString(getHelpResource()), + getContext().getClass().getName()); + view.startActivityForResult(helpIntent, 0); + }); + + final String learnMoreContentDescription = getPrefContext().getString( + R.string.footer_learn_more_content_description, mPackageName); + htmlFooterPreference.setLearnMoreContentDescription(learnMoreContentDescription); htmlFooterPreference.setLinkEnabled(true); } else { htmlFooterPreference.setLinkEnabled(false); } - htmlFooterPreference.setIconContentDescription(iconContentDescription); screen.addPreference(htmlFooterPreference); } @@ -559,14 +571,33 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference final AccessibilityFooterPreference footerPreference = new AccessibilityFooterPreference(screen.getContext()); footerPreference.setSummary(summary); - footerPreference.setIconContentDescription(iconContentDescription); + footerPreference.setContentDescription( + generateFooterContentDescription(summary)); + + // Only framework tools support help link if (getHelpResource() != 0) { - footerPreference.appendHelpLink(getHelpResource()); - footerPreference.setLinkEnabled(true); + footerPreference.setLearnMoreAction(view -> { + final Intent helpIntent = HelpUtils.getHelpIntent( + getContext(), getContext().getString(getHelpResource()), + getContext().getClass().getName()); + view.startActivityForResult(helpIntent, 0); + }); + + final String learnMoreContentDescription = getPrefContext().getString( + R.string.footer_learn_more_content_description, mPackageName); + footerPreference.setLearnMoreContentDescription(learnMoreContentDescription); } screen.addPreference(footerPreference); } + private CharSequence generateFooterContentDescription(CharSequence footerContent) { + final StringBuffer sb = new StringBuffer(); + sb.append(getPrefContext().getString( + R.string.accessibility_introduction_title, mPackageName)) + .append("\n\n") + .append(footerContent); + return sb; + } @VisibleForTesting void setupEditShortcutDialog(Dialog dialog) { final View dialogSoftwareView = dialog.findViewById(R.id.software_shortcut); diff --git a/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProvider.java b/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProvider.java index 4de1c2c91c0..ec70f572cdc 100644 --- a/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProvider.java +++ b/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProvider.java @@ -36,7 +36,12 @@ public interface ExtraAppInfoFeatureProvider { void setPackageName(String packageName); /** - * gets the summary name + * Checks if enabled + */ + boolean isEnabled(Context context); + + /** + * Gets the summary name */ String getSummary(Context context); } diff --git a/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImpl.java b/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImpl.java index 55b9bf0dc75..7d800e68493 100644 --- a/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImpl.java +++ b/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImpl.java @@ -38,6 +38,11 @@ public class ExtraAppInfoFeatureProviderImpl implements return; } + @Override + public boolean isEnabled(Context context) { + return false; + } + @Override public String getSummary(Context context) { return ""; diff --git a/src/com/android/settings/applications/appinfo/ExtraAppInfoPreferenceController.java b/src/com/android/settings/applications/appinfo/ExtraAppInfoPreferenceController.java index 0d72b749119..43796d0d85c 100644 --- a/src/com/android/settings/applications/appinfo/ExtraAppInfoPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/ExtraAppInfoPreferenceController.java @@ -20,6 +20,7 @@ import android.content.Context; import android.text.TextUtils; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; import com.android.settings.overlay.FeatureFactory; @@ -55,6 +56,16 @@ public class ExtraAppInfoPreferenceController extends BasePreferenceController { return mExtraAppInfoFeatureProvider.getSummary(mContext); } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + + if (mExtraAppInfoFeatureProvider != null) { + final Preference preference = screen.findPreference(getPreferenceKey()); + preference.setEnabled(mExtraAppInfoFeatureProvider.isEnabled(preference.getContext())); + } + } + /** * Set the local package name */ diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index d5162a85c2d..164ef2d2723 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -123,7 +123,6 @@ import com.android.settings.notification.app.AppNotificationSettings; import com.android.settings.widget.LoadingViewController; import com.android.settings.wifi.AppStateChangeWifiStateBridge; import com.android.settings.wifi.ChangeWifiStateDetails; -import com.android.settingslib.HelpUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppFilter; @@ -661,10 +660,6 @@ public class ManageApplications extends InstrumentedFragment if (activity == null) { return; } - // TODO(b/176883483): Remove the help menu if this feature rolled out - if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) { - HelpUtils.prepareHelpMenuItem(activity, menu, getHelpResource(), getClass().getName()); - } mOptionsMenu = menu; inflater.inflate(R.menu.manage_apps, menu); diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index 4702fed424a..11313fd52d4 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -266,10 +266,12 @@ public class BiometricEnrollActivity extends InstrumentedActivity { faceManager.getSensorPropertiesInternal(); // This would need to be updated for devices with multiple sensors of the same modality - mIsFaceEnrollable = faceManager.getEnrolledFaces(mUserId).size() - < faceProperties.get(0).maxEnrollmentsPerUser; - mIsFingerprintEnrollable = fingerprintManager.getEnrolledFingerprints(mUserId).size() - < fpProperties.get(0).maxEnrollmentsPerUser; + mIsFaceEnrollable = !faceProperties.isEmpty() && + faceManager.getEnrolledFaces(mUserId).size() + < faceProperties.get(0).maxEnrollmentsPerUser; + mIsFingerprintEnrollable = !fpProperties.isEmpty() && + fingerprintManager.getEnrolledFingerprints(mUserId).size() + < fpProperties.get(0).maxEnrollmentsPerUser; if (!mConfirmingCredentials) { mConfirmingCredentials = true; diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 09d8e71fab5..a85382b9420 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -18,6 +18,8 @@ package com.android.settings.biometrics; import android.app.admin.DevicePolicyManager; import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.os.Bundle; @@ -25,14 +27,17 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.SetupWizardUtils; +import com.android.settings.Utils; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; @@ -182,6 +187,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } } + @Override + protected void onPostCreate(@Nullable Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + final LinearLayout buttonContainer = mFooterBarMixin.getButtonContainer(); + if (buttonContainer != null) { + buttonContainer.setBackgroundColor(getBackgroundColor()); + } + } + @Override protected void onResume() { super.onResume(); @@ -199,6 +213,12 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } } + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + getWindow().setStatusBarColor(getBackgroundColor()); + } + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -335,4 +355,10 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } return mIconColorFilter; } + + @ColorInt + private int getBackgroundColor() { + final ColorStateList stateList = Utils.getColorAttr(this, android.R.attr.windowBackground); + return stateList != null ? stateList.getDefaultColor() : Color.TRANSPARENT; + } } diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index c5d86e1cacd..fb9780f124c 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -67,7 +67,7 @@ public class SettingsBaseActivity extends FragmentActivity { /** * What type of page transition should be apply. */ - public static final String EXTRA_PAGE_TRANSITION_TYPE = "extra_page_transition_type"; + public static final String EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type"; protected static final boolean DEBUG_TIMING = false; private static final String TAG = "SettingsBaseActivity"; diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java index 2ee404b418c..893d592fe78 100644 --- a/src/com/android/settings/core/SubSettingLauncher.java +++ b/src/com/android/settings/core/SubSettingLauncher.java @@ -17,22 +17,17 @@ package com.android.settings.core; import android.annotation.StringRes; -import android.app.Activity; -import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; -import android.widget.Toolbar; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; -import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SubSettings; -import com.android.settings.Utils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType; @@ -199,14 +194,6 @@ public class SubSettingLauncher { @VisibleForTesting void launchForResult(Fragment listener, Intent intent, int requestCode) { - if (Utils.isPageTransitionEnabled(mContext)) { - final Activity activity = listener.getActivity(); - final Toolbar toolbar = activity.findViewById(R.id.action_bar); - final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity, toolbar, - "shared_element_view").toBundle(); - listener.startActivityForResult(intent, requestCode, bundle); - return; - } listener.startActivityForResult(intent, requestCode); } diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java index 786f0ecee2e..93907aade62 100644 --- a/src/com/android/settings/datausage/lib/DataUsageLib.java +++ b/src/com/android/settings/datausage/lib/DataUsageLib.java @@ -73,7 +73,7 @@ public class DataUsageLib { private static NetworkTemplate getMobileTemplateForSubId( TelephonyManager telephonyManager, int subId) { - return NetworkTemplate.buildTemplateMobileAll( + return NetworkTemplate.buildTemplateCarrierMetered( telephonyManager.getSubscriberId(subId)); } } diff --git a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java index 3138ae09b86..0a60ed31289 100644 --- a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java +++ b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java @@ -21,7 +21,7 @@ import android.widget.Switch; import androidx.preference.PreferenceScreen; -import com.android.settingslib.widget.MainSwitchPreference; +import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.widget.OnMainSwitchChangeListener; /** @@ -51,7 +51,7 @@ public class AutoBrightnessDetailPreferenceController extends public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - MainSwitchPreference pref = (MainSwitchPreference) screen.findPreference( + SettingsMainSwitchPreference pref = (SettingsMainSwitchPreference) screen.findPreference( getPreferenceKey()); pref.addOnSwitchChangeListener(this); pref.updateStatus(isChecked()); diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java index 056afdb00ba..5da076736e9 100644 --- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java +++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java @@ -46,30 +46,25 @@ import java.util.Objects; /** * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog. */ -public class ActionDisabledByAdminDialogHelper { +public final class ActionDisabledByAdminDialogHelper { private static final String TAG = ActionDisabledByAdminDialogHelper.class.getName(); @VisibleForTesting EnforcedAdmin mEnforcedAdmin; private ViewGroup mDialogView; - private String mRestriction = null; - private final Activity mActivity; + private String mRestriction; private final ActionDisabledByAdminController mActionDisabledByAdminController; + private final Activity mActivity; public ActionDisabledByAdminDialogHelper(Activity activity) { mActivity = activity; - mActionDisabledByAdminController = - ActionDisabledByAdminControllerFactory.createInstance( - mActivity.getSystemService(DevicePolicyManager.class), - new ActionDisabledLearnMoreButtonLauncherImpl(), - new DeviceAdminStringProviderImpl(mActivity)); + mDialogView = (ViewGroup) LayoutInflater.from(mActivity).inflate( + R.layout.admin_support_details_dialog, null); + mActionDisabledByAdminController = ActionDisabledByAdminControllerFactory + .createInstance(mActivity, new DeviceAdminStringProviderImpl(mActivity)); } private @UserIdInt int getEnforcementAdminUserId(@NonNull EnforcedAdmin admin) { - if (admin.user == null) { - return UserHandle.USER_NULL; - } else { - return admin.user.getIdentifier(); - } + return admin.user == null ? UserHandle.USER_NULL : admin.user.getIdentifier(); } private @UserIdInt int getEnforcementAdminUserId() { @@ -78,21 +73,24 @@ public class ActionDisabledByAdminDialogHelper { public AlertDialog.Builder prepareDialogBuilder(String restriction, EnforcedAdmin enforcedAdmin) { - mEnforcedAdmin = enforcedAdmin; - mRestriction = restriction; - final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); - mDialogView = (ViewGroup) LayoutInflater.from(mActivity).inflate( - R.layout.admin_support_details_dialog, null); - initializeDialogViews(mDialogView, mEnforcedAdmin, getEnforcementAdminUserId(), - mRestriction, mActionDisabledByAdminController); - builder.setPositiveButton(R.string.okay, null).setView(mDialogView); - maybeSetLearnMoreButton(builder); + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity) + .setPositiveButton(R.string.okay, null) + .setView(mDialogView); + prepareDialogBuilder(builder, restriction, enforcedAdmin); return builder; } @VisibleForTesting - void maybeSetLearnMoreButton(AlertDialog.Builder builder) { - mActionDisabledByAdminController.setupLearnMoreButton(mActivity, builder); + void prepareDialogBuilder(AlertDialog.Builder builder, String restriction, + EnforcedAdmin enforcedAdmin) { + mActionDisabledByAdminController.initialize( + new ActionDisabledLearnMoreButtonLauncherImpl(mActivity, builder)); + + mEnforcedAdmin = enforcedAdmin; + mRestriction = restriction; + initializeDialogViews(mDialogView, mEnforcedAdmin, getEnforcementAdminUserId(), + mRestriction); + mActionDisabledByAdminController.setupLearnMoreButton(mActivity); } public void updateDialog(String restriction, EnforcedAdmin admin) { @@ -102,17 +100,17 @@ public class ActionDisabledByAdminDialogHelper { mEnforcedAdmin = admin; mRestriction = restriction; initializeDialogViews(mDialogView, mEnforcedAdmin, getEnforcementAdminUserId(), - mRestriction, mActionDisabledByAdminController); + mRestriction); } private void initializeDialogViews(View root, EnforcedAdmin enforcedAdmin, int userId, - String restriction, ActionDisabledByAdminController controller) { + String restriction) { ComponentName admin = enforcedAdmin.component; if (admin == null) { return; } - controller.updateEnforcedAdmin(enforcedAdmin, userId); + mActionDisabledByAdminController.updateEnforcedAdmin(enforcedAdmin, userId); setAdminSupportIcon(root, admin, userId); if (isNotCurrentUserOrProfile(admin, userId)) { @@ -151,8 +149,7 @@ public class ActionDisabledByAdminDialogHelper { if (titleView == null) { return; } - titleView.setText( - mActionDisabledByAdminController.getAdminSupportTitle(restriction)); + titleView.setText(mActionDisabledByAdminController.getAdminSupportTitle(restriction)); } @VisibleForTesting diff --git a/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java b/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java index 98cad65b5d8..09337993d86 100644 --- a/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java +++ b/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImpl.java @@ -20,104 +20,67 @@ import static java.util.Objects.requireNonNull; import android.app.Activity; import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.net.Uri; import android.os.UserHandle; -import android.os.UserManager; import androidx.appcompat.app.AlertDialog; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd; -import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.enterprise.ActionDisabledLearnMoreButtonLauncher; -import java.util.function.BiConsumer; - /** * Helper class to set up the "Learn more" button in the action disabled dialog. */ -public class ActionDisabledLearnMoreButtonLauncherImpl - implements ActionDisabledLearnMoreButtonLauncher { +public final class ActionDisabledLearnMoreButtonLauncherImpl + extends ActionDisabledLearnMoreButtonLauncher { - static final BiConsumer SHOW_ADMIN_POLICIES = - (activity, enforcedAdmin) -> { - showAdminPolicies(enforcedAdmin, activity); - activity.finish(); - }; + private final Activity mActivity; + private final AlertDialog.Builder mBuilder; - static final BiConsumer LAUNCH_HELP_PAGE = (activity, url) -> { - launchLearnMoreHelpPage(activity, url); - activity.finish(); - }; - - @Override - public void setupLearnMoreButtonToShowAdminPolicies( - Context context, - Object alertDialogBuilder, - int enforcementAdminUserId, - EnforcedAdmin enforcedAdmin) { - requireNonNull(context); - requireNonNull(alertDialogBuilder); - requireNonNull(enforcedAdmin); - // The "Learn more" button appears only if the restriction is enforced by an admin in the - // same profile group. Otherwise the admin package and its policies are not accessible to - // the current user. - final UserManager um = UserManager.get(context); - if (um.isSameProfileGroup(enforcementAdminUserId, um.getUserHandle())) { - setupLearnMoreButton((AlertDialog.Builder) alertDialogBuilder, () -> - SHOW_ADMIN_POLICIES.accept((Activity) context, enforcedAdmin)); - } + ActionDisabledLearnMoreButtonLauncherImpl(Activity activity, AlertDialog.Builder builder) { + mActivity = requireNonNull(activity, "activity cannot be null"); + mBuilder = requireNonNull(builder, "builder cannot be null"); } @Override - public void setupLearnMoreButtonToLaunchHelpPage( - Context context, - Object alertDialogBuilder, - String url) { - requireNonNull(context); - requireNonNull(alertDialogBuilder); - requireNonNull(url); - setupLearnMoreButton((AlertDialog.Builder) alertDialogBuilder, - () -> LAUNCH_HELP_PAGE.accept((Activity) context, url)); + public void setLearnMoreButton(Runnable action) { + requireNonNull(action, "action cannot be null"); + + mBuilder.setNeutralButton(R.string.learn_more, (dialog, which) -> action.run()); } - private void setupLearnMoreButton(AlertDialog.Builder builder, Runnable runnable) { - builder.setNeutralButton(R.string.learn_more, (dialog, which) -> { - runnable.run(); - }); + @Override + protected void launchShowAdminPolicies(Context context, UserHandle user, ComponentName admin) { + requireNonNull(context, "context cannot be null"); + requireNonNull(user, "user cannot be null"); + requireNonNull(admin, "admin cannot be null"); + + Intent intent = new Intent() + .setClass(mActivity, DeviceAdminAdd.class) + .putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin) + .putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true); + // DeviceAdminAdd class may need to run as managed profile. + mActivity.startActivityAsUser(intent, user); } - private static void launchLearnMoreHelpPage(Activity activity, String url) { - activity.startActivityAsUser(createLearnMoreIntent(url), UserHandle.SYSTEM); + @Override + protected void launchShowAdminSettings(Context context) { + requireNonNull(context, "context cannot be null"); + + Intent intent = new Intent() + .setClass(mActivity, Settings.DeviceAdminSettingsActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // Activity merges both managed profile and parent users + // admins so show as same user as this activity. + mActivity.startActivity(intent); } - private static Intent createLearnMoreIntent(String url) { - final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - return intent; - } - - private static void showAdminPolicies( - EnforcedAdmin enforcedAdmin, - Activity activity) { - final Intent intent = new Intent(); - if (enforcedAdmin.component != null) { - intent.setClass(activity, DeviceAdminAdd.class); - intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, - enforcedAdmin.component); - intent.putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true); - // DeviceAdminAdd class may need to run as managed profile. - activity.startActivityAsUser(intent, enforcedAdmin.user); - } else { - intent.setClass(activity, Settings.DeviceAdminSettingsActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - // Activity merges both managed profile and parent users - // admins so show as same user as this activity. - activity.startActivity(intent); - } + @Override + protected void finishSelf() { + mActivity.finish(); } } diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java index 388d87ae9a9..854efa05531 100644 --- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java +++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java @@ -30,18 +30,14 @@ import android.content.om.OverlayInfo; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; -import android.util.FeatureFlagUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.core.FeatureFlags; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.actionbar.SearchMenuController; -import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; import com.android.settings.utils.CandidateInfoExtra; import com.android.settings.widget.RadioButtonPickerFragment; @@ -76,11 +72,6 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i @Override public void onAttach(Context context) { super.onAttach(context); - // TODO(b/176883483): Remove both search and help menu if this feature rolled out - if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) { - SearchMenuController.init(this /* host */); - HelpMenuController.init(this /* host */); - } SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) .getSuggestionFeatureProvider(context); diff --git a/src/com/android/settings/inputmethod/UserDictionarySettings.java b/src/com/android/settings/inputmethod/UserDictionarySettings.java index 5e3e7495359..f51629d2b7a 100644 --- a/src/com/android/settings/inputmethod/UserDictionarySettings.java +++ b/src/com/android/settings/inputmethod/UserDictionarySettings.java @@ -26,7 +26,6 @@ import android.database.Cursor; import android.os.Bundle; import android.provider.UserDictionary; import android.text.TextUtils; -import android.util.FeatureFlagUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -45,7 +44,6 @@ import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import com.android.settings.R; -import com.android.settings.core.FeatureFlags; import com.android.settings.core.SubSettingLauncher; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.Instrumentable; @@ -106,10 +104,7 @@ public class UserDictionarySettings extends ListFragment implements Instrumentab @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // TODO(b/176883483): Remove the title after material component updated - if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) { - getActivity().setTitle(R.string.user_dict_settings_title); - } + getActivity().setTitle(R.string.user_dict_settings_title); // Show the language as a subtitle of the action bar final ActionBar actionBar = getActivity().getActionBar(); if (actionBar != null) { diff --git a/src/com/android/settings/location/LocationSettingsFooterPreferenceController.java b/src/com/android/settings/location/LocationSettingsFooterPreferenceController.java index 281cc5abf9d..a3b68be7da2 100644 --- a/src/com/android/settings/location/LocationSettingsFooterPreferenceController.java +++ b/src/com/android/settings/location/LocationSettingsFooterPreferenceController.java @@ -31,6 +31,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settingslib.HelpUtils; import com.android.settingslib.widget.FooterPreference; import java.util.ArrayList; @@ -104,15 +105,22 @@ public class LocationSettingsFooterPreferenceController extends LocationBasePref + footerString; } if (mFooterPreference != null) { - mFooterPreference.setTitle(Html.fromHtml(footerString - + PARAGRAPH_SEPARATOR - + mContext.getString( - R.string.location_settings_footer_learn_more))); - mFooterPreference.setContentDescription(Html.fromHtml(footerString + mContext.getString( - R.string.location_settings_footer_learn_more_content_description))); + mFooterPreference.setTitle(Html.fromHtml(footerString)); + mFooterPreference.setLearnMoreAction(v -> openLocationLearnMoreLink()); + mFooterPreference.setLearnMoreContentDescription(mContext.getString( + R.string.location_settings_footer_learn_more_content_description)); } } + private void openLocationLearnMoreLink() { + mFragment.startActivityForResult( + HelpUtils.getHelpIntent( + mContext, + mContext.getString(R.string.location_settings_footer_learn_more_link), + /*backupContext=*/""), + /*requestCode=*/ 0); + } + /** * Location footer preference group should always be displayed. */ diff --git a/src/com/android/settings/security/ResetCredentialsPreferenceController.java b/src/com/android/settings/security/ResetCredentialsPreferenceController.java index 48e7f847ea0..5234ba8eab3 100644 --- a/src/com/android/settings/security/ResetCredentialsPreferenceController.java +++ b/src/com/android/settings/security/ResetCredentialsPreferenceController.java @@ -18,6 +18,8 @@ package com.android.settings.security; import android.content.Context; import android.os.UserManager; +import android.security.keystore.KeyProperties; +import android.security.keystore2.AndroidKeyStoreLoadStoreParameter; import androidx.preference.PreferenceScreen; @@ -35,6 +37,7 @@ public class ResetCredentialsPreferenceController extends RestrictedEncryptionPr private static final String KEY_RESET_CREDENTIALS = "credentials_reset"; private final KeyStore mKeyStore; + private final KeyStore mWifiKeyStore; private RestrictedPreference mPreference; @@ -45,8 +48,19 @@ public class ResetCredentialsPreferenceController extends RestrictedEncryptionPr keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); } catch (Exception e) { + keyStore = null; } mKeyStore = keyStore; + keyStore = null; + if (context.getUser().isSystem()) { + try { + keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore.load(new AndroidKeyStoreLoadStoreParameter(KeyProperties.NAMESPACE_WIFI)); + } catch (Exception e) { + keyStore = null; + } + } + mWifiKeyStore = keyStore; if (lifecycle != null) { lifecycle.addObserver(this); } @@ -68,9 +82,11 @@ public class ResetCredentialsPreferenceController extends RestrictedEncryptionPr if (mPreference != null && !mPreference.isDisabledByAdmin()) { boolean isEnabled = false; try { - if (mKeyStore != null) { - isEnabled = mKeyStore.aliases().hasMoreElements(); - } + isEnabled = (mKeyStore != null + && mKeyStore.aliases().hasMoreElements()) + || (mWifiKeyStore != null + && mWifiKeyStore.aliases().hasMoreElements()); + } catch (KeyStoreException e) { // If access to keystore fails, treat as disabled. } diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java index dd1d63ae339..4f235e18d85 100644 --- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java +++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java @@ -33,6 +33,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.SettingsBaseActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.security.SecurityFeatureProvider; @@ -44,6 +45,7 @@ import com.android.settingslib.core.lifecycle.events.OnCreate; import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; import com.android.settingslib.search.SearchIndexableRaw; +import com.android.settingslib.transition.SettingsTransitionHelper; import java.util.ArrayList; import java.util.List; @@ -128,6 +130,8 @@ public class TrustAgentListPreferenceController extends AbstractPreferenceContro .show(); mTrustAgentClickIntent = preference.getIntent(); + mTrustAgentClickIntent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, + SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE); if (!confirmationLaunched && mTrustAgentClickIntent != null) { // If this returns false, it means no password confirmation is required. diff --git a/src/com/android/settings/widget/SettingsMainSwitchBar.java b/src/com/android/settings/widget/SettingsMainSwitchBar.java index ce2dde59f19..5f752f9f7d5 100644 --- a/src/com/android/settings/widget/SettingsMainSwitchBar.java +++ b/src/com/android/settings/widget/SettingsMainSwitchBar.java @@ -16,6 +16,8 @@ package com.android.settings.widget; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.app.settings.SettingsEnums; import android.content.Context; import android.util.AttributeSet; @@ -47,7 +49,7 @@ public class SettingsMainSwitchBar extends MainSwitchBar { } private ImageView mRestrictedIcon; - private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin; + private EnforcedAdmin mEnforcedAdmin; private boolean mDisabledByAdmin; private final MetricsFeatureProvider mMetricsFeatureProvider; @@ -87,7 +89,7 @@ public class SettingsMainSwitchBar extends MainSwitchBar { * If admin is not null, disables the text and switch but keeps the view clickable (unless the * switch is disabled for other reasons). Otherwise, calls setEnabled. */ - public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { + public void setDisabledByAdmin(EnforcedAdmin admin) { mEnforcedAdmin = admin; if (admin != null) { super.setEnabled(true); diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java index 04317a8c48d..7f349bc6846 100644 --- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java +++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java @@ -16,10 +16,13 @@ package com.android.settings.widget; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.Context; import android.content.res.TypedArray; import android.text.TextUtils; import android.util.AttributeSet; +import android.widget.Switch; import androidx.core.content.res.TypedArrayUtils; import androidx.preference.PreferenceViewHolder; @@ -27,7 +30,7 @@ import androidx.preference.TwoStatePreference; import com.android.settings.R; import com.android.settings.widget.SettingsMainSwitchBar.OnBeforeCheckedChangeListener; -import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedPreferenceHelper; import com.android.settingslib.widget.OnMainSwitchChangeListener; import java.util.ArrayList; @@ -38,7 +41,9 @@ import java.util.List; * This component is used as the main switch of the page * to enable or disable the prefereces on the page. */ -public class SettingsMainSwitchPreference extends TwoStatePreference { +public class SettingsMainSwitchPreference extends TwoStatePreference implements + OnMainSwitchChangeListener { + private final List mBeforeCheckedChangeListeners = new ArrayList<>(); private final List mSwitchChangeListeners = new ArrayList<>(); @@ -46,8 +51,8 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { private SettingsMainSwitchBar mMainSwitchBar; private CharSequence mTitle; private boolean mIsVisible; - - private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin; + private EnforcedAdmin mEnforcedAdmin; + private RestrictedPreferenceHelper mRestrictedHelper; public SettingsMainSwitchPreference(Context context) { super(context); @@ -78,8 +83,8 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { holder.setDividerAllowedBelow(false); mMainSwitchBar = (SettingsMainSwitchBar) holder.findViewById(R.id.main_switch_bar); - mMainSwitchBar.show(); + mEnforcedAdmin = mRestrictedHelper.checkRestrictionEnforced(); updateStatus(isChecked()); registerListenerToSwitchBar(); @@ -90,6 +95,7 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { private void init(Context context, AttributeSet attrs) { setLayoutResource(R.layout.preference_widget_main_switch); + mSwitchChangeListeners.add(this); mIsVisible = true; if (attrs != null) { @@ -103,6 +109,8 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { setTitle(title.toString()); } a.recycle(); + + mRestrictedHelper = new RestrictedPreferenceHelper(context, this, attrs); } } @@ -129,13 +137,17 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { } } + @Override + public void onSwitchChanged(Switch switchView, boolean isChecked) { + super.setChecked(isChecked); + } + /** * Update the switch status of preference */ public void updateStatus(boolean checked) { setChecked(checked); if (mMainSwitchBar != null) { - mMainSwitchBar.setChecked(checked); mMainSwitchBar.setTitle(mTitle); mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin); mMainSwitchBar.show(); @@ -230,7 +242,7 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { * Otherwise, calls setEnabled which will enables the entire view including * the text and switch. */ - public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { + public void setDisabledByAdmin(EnforcedAdmin admin) { mEnforcedAdmin = admin; if (mMainSwitchBar != null) { mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin); diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java index 79f34c79962..86e7e8da670 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java @@ -22,7 +22,6 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.util.FeatureFlagUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -35,12 +34,10 @@ import androidx.fragment.app.FragmentPagerAdapter; import com.android.internal.util.CollectionUtils; import com.android.settings.R; -import com.android.settings.core.FeatureFlags; import com.android.settings.core.InstrumentedFragment; import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.ims.WifiCallingQueryImsState; import com.android.settings.search.actionbar.SearchMenuController; -import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; import com.android.settings.widget.RtlCompatibleViewPager; import com.android.settings.widget.SlidingTabLayout; @@ -121,12 +118,6 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - // TODO(b/176883483): Remove the option menu if collapsing toolbar feature rolled out - if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) { - setHasOptionsMenu(true); - SearchMenuController.init(this /* host */); - HelpMenuController.init(this /* host */); - } // TODO: besides in onCreate, we should also update subList when SIM / Sub status // changes. diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java deleted file mode 100644 index 2640c813810..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link AccessibilityButtonFooterPreferenceController}. */ -@RunWith(RobolectricTestRunner.class) -public class AccessibilityButtonFooterPreferenceControllerTest { - - private static final String TEST_KEY = "test_key"; - private static final String TEST_TITLE = "test_title"; - private final Context mContext = ApplicationProvider.getApplicationContext(); - private PreferenceScreen mScreen; - private AccessibilityButtonFooterPreferenceController mController; - - @Before - public void setUp() { - final PreferenceManager preferenceManager = new PreferenceManager(mContext); - mScreen = preferenceManager.createPreferenceScreen(mContext); - final AccessibilityFooterPreference footerPreference = - new AccessibilityFooterPreference(mContext); - footerPreference.setKey(TEST_KEY); - footerPreference.setTitle(TEST_TITLE); - mScreen.addPreference(footerPreference); - mController = new AccessibilityButtonFooterPreferenceController(mContext, TEST_KEY); - } - - @Test - public void onPreferenceChange_shouldSetCorrectIconContentDescription() { - mController.displayPreference(mScreen); - - final AccessibilityFooterPreference footerPreference = mScreen.findPreference(TEST_KEY); - final String packageName = mContext.getString(R.string.accessibility_button_title); - final String iconContentDescription = mContext.getString( - R.string.accessibility_introduction_title, - packageName); - assertThat(footerPreference.getIconContentDescription()).isEqualTo(iconContentDescription); - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceControllerTest.java deleted file mode 100644 index 23e479be539..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceControllerTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link AccessibilityControlTimeoutFooterPreferenceController}. */ -@RunWith(RobolectricTestRunner.class) -public class AccessibilityControlTimeoutFooterPreferenceControllerTest { - - private static final String TEST_KEY = "test_key"; - private static final String TEST_TITLE = "test_title"; - private final Context mContext = ApplicationProvider.getApplicationContext(); - private PreferenceScreen mScreen; - private AccessibilityControlTimeoutFooterPreferenceController mController; - - @Before - public void setUp() { - final PreferenceManager preferenceManager = new PreferenceManager(mContext); - mScreen = preferenceManager.createPreferenceScreen(mContext); - final AccessibilityFooterPreference footerPreference = - new AccessibilityFooterPreference(mContext); - footerPreference.setKey(TEST_KEY); - footerPreference.setTitle(TEST_TITLE); - mScreen.addPreference(footerPreference); - mController = new AccessibilityControlTimeoutFooterPreferenceController(mContext, TEST_KEY); - } - - @Test - public void onPreferenceChange_shouldSetCorrectIconContentDescription() { - mController.displayPreference(mScreen); - - final AccessibilityFooterPreference footerPreference = - mScreen.findPreference(TEST_KEY); - final String packageName = - mContext.getString(R.string.accessibility_setting_item_control_timeout_title); - final String iconContentDescription = mContext.getString( - R.string.accessibility_introduction_title, - packageName); - assertThat(footerPreference.getIconContentDescription()).isEqualTo(iconContentDescription); - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java index b8f97c7a3ea..14c56e84726 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java @@ -19,13 +19,12 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.text.method.MovementMethod; import android.view.LayoutInflater; import android.view.View; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.preference.PreferenceViewHolder; -import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; @@ -39,10 +38,6 @@ import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public final class AccessibilityFooterPreferenceTest { - private static final String DEFAULT_SUMMARY = "default summary"; - private static final String DEFAULT_DESCRIPTION = "default description"; - - private Context mContext = ApplicationProvider.getApplicationContext(); private AccessibilityFooterPreference mAccessibilityFooterPreference; private PreferenceViewHolder mPreferenceViewHolder; @@ -58,41 +53,22 @@ public final class AccessibilityFooterPreferenceTest { } @Test - public void onBindViewHolder_initTextConfig_parseTextAndFocusable() { - mAccessibilityFooterPreference.setSummary(DEFAULT_SUMMARY); + public void onBindViewHolder_LinkDisabledByDefault_notReturnLinkMovement() { + mAccessibilityFooterPreference.onBindViewHolder(mPreferenceViewHolder); + + final TextView summaryView = (TextView) mPreferenceViewHolder.findViewById( + android.R.id.title); + assertThat(summaryView.getMovementMethod()).isNull(); + } + + @Test + public void onBindViewHolder_setLinkEnabled_returnLinkMovement() { + mAccessibilityFooterPreference.setLinkEnabled(true); mAccessibilityFooterPreference.onBindViewHolder(mPreferenceViewHolder); final TextView summaryView = (TextView) mPreferenceViewHolder.findViewById( android.R.id.title); - assertThat(summaryView.getText().toString()).isEqualTo(DEFAULT_SUMMARY); - assertThat(summaryView.isFocusable()).isEqualTo(true); - } - - @Test - public void onBindViewHolder_initTextConfigAndAccessibleIcon_groupContentForAccessible() { - mAccessibilityFooterPreference.setSummary(DEFAULT_SUMMARY); - mAccessibilityFooterPreference.setIconContentDescription(DEFAULT_DESCRIPTION); - - mAccessibilityFooterPreference.onBindViewHolder(mPreferenceViewHolder); - - final TextView summaryView = (TextView) mPreferenceViewHolder.findViewById( - android.R.id.title); - assertThat(summaryView.getText().toString()).isEqualTo(DEFAULT_SUMMARY); - assertThat(summaryView.isFocusable()).isEqualTo(false); - final LinearLayout infoFrame = (LinearLayout) mPreferenceViewHolder.findViewById( - R.id.icon_frame); - assertThat(infoFrame.getContentDescription()).isEqualTo(DEFAULT_DESCRIPTION); - assertThat(infoFrame.isFocusable()).isEqualTo(false); - } - - @Test - public void appendHelpLink_timeoutHelpUri_updateSummary() { - mAccessibilityFooterPreference.setSummary(DEFAULT_SUMMARY); - - mAccessibilityFooterPreference.appendHelpLink(R.string.help_url_timeout); - - final String title = mAccessibilityFooterPreference.getTitle().toString(); - assertThat(title.contains(mContext.getString(R.string.footer_learn_more))).isTrue(); + assertThat(summaryView.getMovementMethod()).isInstanceOf(MovementMethod.class); } } diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionFooterPreferenceControllerTest.java deleted file mode 100644 index e5f67c5f308..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/CaptionFooterPreferenceControllerTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link CaptionFooterPreferenceController}. */ -@RunWith(RobolectricTestRunner.class) -public class CaptionFooterPreferenceControllerTest { - - private static final String TEST_KEY = "test_key"; - private static final String TEST_TITLE = "test_title"; - private final Context mContext = ApplicationProvider.getApplicationContext(); - private PreferenceScreen mScreen; - private CaptionFooterPreferenceController mController; - - @Before - public void setUp() { - final PreferenceManager preferenceManager = new PreferenceManager(mContext); - mScreen = preferenceManager.createPreferenceScreen(mContext); - final AccessibilityFooterPreference footerPreference = - new AccessibilityFooterPreference(mContext); - footerPreference.setKey(TEST_KEY); - footerPreference.setTitle(TEST_TITLE); - mScreen.addPreference(footerPreference); - mController = new CaptionFooterPreferenceController(mContext, TEST_KEY); - } - - @Test - public void onPreferenceChange_shouldSetCorrectIconContentDescription() { - mController.displayPreference(mScreen); - - final AccessibilityFooterPreference footerPreference = mScreen.findPreference(TEST_KEY); - final String packageName = mContext.getString(R.string.accessibility_captioning_title); - final String iconContentDescription = mContext.getString( - R.string.accessibility_introduction_title, - packageName); - assertThat(footerPreference.getIconContentDescription()).isEqualTo(iconContentDescription); - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceControllerTest.java deleted file mode 100644 index 2be4752b4f5..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceControllerTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link ToggleAutoclickFooterPreferenceController}. */ -@RunWith(RobolectricTestRunner.class) -public class ToggleAutoclickFooterPreferenceControllerTest { - - private static final String TEST_KEY = "test_key"; - private static final String TEST_TITLE = "test_title"; - private final Context mContext = ApplicationProvider.getApplicationContext(); - private PreferenceScreen mScreen; - private ToggleAutoclickFooterPreferenceController mController; - - @Before - public void setUp() { - final PreferenceManager preferenceManager = new PreferenceManager(mContext); - mScreen = preferenceManager.createPreferenceScreen(mContext); - final AccessibilityFooterPreference footerPreference = - new AccessibilityFooterPreference(mContext); - footerPreference.setKey(TEST_KEY); - footerPreference.setTitle(TEST_TITLE); - mScreen.addPreference(footerPreference); - mController = new ToggleAutoclickFooterPreferenceController(mContext, TEST_KEY); - } - - @Test - public void onPreferenceChange_shouldSetCorrectIconContentDescription() { - mController.displayPreference(mScreen); - - final AccessibilityFooterPreference footerPreference = mScreen.findPreference(TEST_KEY); - final String packageName = mContext.getString( - R.string.accessibility_autoclick_preference_title); - final String iconContentDescription = mContext.getString( - R.string.accessibility_introduction_title, - packageName); - assertThat(footerPreference.getIconContentDescription()).isEqualTo(iconContentDescription); - } -} diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index 01e9b38440d..4f4185cb81c 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -215,8 +215,6 @@ public class ToggleFeaturePreferenceFragmentTest { (AccessibilityFooterPreference) mFragment.getPreferenceScreen().getPreference( mFragment.getPreferenceScreen().getPreferenceCount() - 1); assertThat(accessibilityFooterPreference.getSummary()).isEqualTo(DEFAULT_SUMMARY); - assertThat(accessibilityFooterPreference.getIconContentDescription()).isEqualTo( - DEFAULT_DESCRIPTION); assertThat(accessibilityFooterPreference.isSelectable()).isEqualTo(true); assertThat(accessibilityFooterPreference.getOrder()).isEqualTo(Integer.MAX_VALUE - 1); } diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImplTest.java new file mode 100644 index 00000000000..d8ba07351e3 --- /dev/null +++ b/tests/robotests/src/com/android/settings/applications/appinfo/ExtraAppInfoFeatureProviderImplTest.java @@ -0,0 +1,54 @@ +/* + * 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.applications.appinfo; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class ExtraAppInfoFeatureProviderImplTest { + private Context mContext; + private ExtraAppInfoFeatureProviderImpl mController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mController = new ExtraAppInfoFeatureProviderImpl(); + } + + @Test + public void isSupported_notSupportedByDefault() { + assertThat(mController.isSupported(mContext)).isEqualTo(false); + } + + @Test + public void isEnabled_notEnabledByDefault() { + assertThat(mController.isEnabled(mContext)).isEqualTo(false); + } + + @Test + public void getSummary_emptyByDefault() { + assertThat(mController.getSummary(mContext)).isEqualTo(""); + } +} diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java index a74c01e9737..2a0d3df95cc 100644 --- a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java +++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java @@ -50,7 +50,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowUtils.class) public class SubSettingLauncherTest { @Mock @@ -117,7 +116,6 @@ public class SubSettingLauncherTest { @Test public void launch_hasRequestListener_shouldStartActivityForResult() { - ShadowUtils.setIsPageTransitionEnabled(true); final int requestCode = 123123; when(mFragment.getActivity()).thenReturn(mActivity); diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java index 6acc72fcf79..908864166f8 100644 --- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java @@ -200,24 +200,21 @@ public class ActionDisabledByAdminDialogHelperTest { @Test public void testMaybeSetLearnMoreButton() { - final UserManager userManager = RuntimeEnvironment.application.getSystemService( - UserManager.class); - final ShadowUserManager userManagerShadow = Shadow.extract(userManager); - mHelper.prepareDialogBuilder( - /* restriction= */ null, ENFORCED_ADMIN); - + UserManager userManager = RuntimeEnvironment.application + .getSystemService(UserManager.class); + ShadowUserManager userManagerShadow = Shadow.extract(userManager); // Set up for shadow call. userManagerShadow.getSameProfileGroupIds().put(USER_ID, 0); // Test that the button is shown when user IDs are in the same profile group AlertDialog.Builder builder = mock(AlertDialog.Builder.class); - mHelper.maybeSetLearnMoreButton(builder); + mHelper.prepareDialogBuilder(builder, /* restriction= */ null, ENFORCED_ADMIN); verify(builder).setNeutralButton(anyInt(), any()); // Test that the button is not shown when user IDs are not in the same profile group userManagerShadow.getSameProfileGroupIds().clear(); builder = mock(AlertDialog.Builder.class); - mHelper.maybeSetLearnMoreButton(builder); + mHelper.prepareDialogBuilder(builder, /* restriction= */ null, ENFORCED_ADMIN); verify(builder, never()).setNeutralButton(anyInt(), any()); } diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java new file mode 100644 index 00000000000..cb53805cc99 --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.widget; + +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.view.View; +import android.widget.ImageView; + +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 org.robolectric.util.ReflectionHelpers; + +@RunWith(RobolectricTestRunner.class) +public class SettingsMainSwitchPreferenceTest { + + @Mock + private EnforcedAdmin mEnforcedAdmin; + private SettingsMainSwitchPreference mPreference; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + final Context context = RuntimeEnvironment.application; + final SettingsMainSwitchBar switchBar = new SettingsMainSwitchBar(context); + mPreference = new SettingsMainSwitchPreference(context); + ReflectionHelpers.setField(mPreference, "mEnforcedAdmin", mEnforcedAdmin); + ReflectionHelpers.setField(mPreference, "mMainSwitchBar", switchBar); + } + + @Test + public void updateStatus_isRestricted_restrictIconShouldDisplay() { + mPreference.updateStatus(true); + + final SettingsMainSwitchBar switchBar = mPreference.getSwitchBar(); + final ImageView restrictedIcon = switchBar.findViewById( + com.android.settingslib.widget.R.id.restricted_icon); + + assertThat(restrictedIcon.getVisibility() == View.VISIBLE).isTrue(); + } +} diff --git a/tests/unit/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImplTest.java b/tests/unit/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImplTest.java index 68468ed4162..4f7ecc8904e 100644 --- a/tests/unit/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImplTest.java +++ b/tests/unit/src/com/android/settings/enterprise/ActionDisabledLearnMoreButtonLauncherImplTest.java @@ -24,86 +24,104 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.Activity; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.UserHandle; +import android.os.UserManager; +import androidx.appcompat.app.AlertDialog; import androidx.test.runner.AndroidJUnit4; import com.android.settings.Settings; import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd; -import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; @RunWith(AndroidJUnit4.class) public class ActionDisabledLearnMoreButtonLauncherImplTest { private static final int ENFORCED_ADMIN_USER_ID = 123; + private static final UserHandle ENFORCED_ADMIN_USER = UserHandle.of(ENFORCED_ADMIN_USER_ID); + + private static final int CONTEXT_USER_ID = -ENFORCED_ADMIN_USER_ID; + private static final UserHandle CONTEXT_USER = UserHandle.of(CONTEXT_USER_ID); + private static final ComponentName ADMIN_COMPONENT = new ComponentName("some.package.name", "some.package.name.SomeClass"); private static final String URL = "https://testexample.com"; private static final Uri URI = Uri.parse(URL); + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock private Activity mActivity; + @Captor + private ArgumentCaptor mIntentCaptor; + + @Mock + private AlertDialog.Builder mBuilder; + + private ActionDisabledLearnMoreButtonLauncherImpl mImpl; + + @Mock + private UserManager mUserManager; + @Before public void setUp() { - MockitoAnnotations.initMocks(this); + // Can't mock getSystemService(Class) directly because it's final + when(mActivity.getSystemServiceName(UserManager.class)).thenReturn(Context.USER_SERVICE); + when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + + when(mActivity.getUserId()).thenReturn(CONTEXT_USER_ID); + when(mUserManager.getUserHandle()).thenReturn(CONTEXT_USER_ID); + + mImpl = new ActionDisabledLearnMoreButtonLauncherImpl(mActivity, mBuilder); } @Test - public void showAdminPolicies_noComponent_works() { - final EnforcedAdmin enforcedAdmin = createEnforcedAdmin(/* component= */ null); + public void launchShowAdminSettings_works() { + mImpl.launchShowAdminSettings(mActivity); - ActionDisabledLearnMoreButtonLauncherImpl.SHOW_ADMIN_POLICIES - .accept(mActivity, enforcedAdmin); + verify(mActivity).startActivity(mIntentCaptor.capture()); + assertDeviceAdminSettingsActivity(mIntentCaptor.getValue()); + } - final ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); - verify(mActivity).startActivity(captor.capture()); - assertThat(captor.getValue().getComponent().getClassName()) + @Test + public void launchShowAdminPolicies_works() { + mImpl.launchShowAdminPolicies(mActivity, ENFORCED_ADMIN_USER, ADMIN_COMPONENT); + + verify(mActivity).startActivityAsUser(mIntentCaptor.capture(), eq(ENFORCED_ADMIN_USER)); + assertDeviceAdminAddIntent(mIntentCaptor.getValue()); + } + + @Test + public void showHelpPage_works() { + mImpl.showHelpPage(mActivity, URL); + + verify(mActivity).startActivityAsUser(mIntentCaptor.capture(), eq(CONTEXT_USER)); + assertActionViewIntent(mIntentCaptor.getValue()); + } + + private void assertDeviceAdminSettingsActivity(Intent intent) { + assertThat(intent.getComponent().getClassName()) .isEqualTo(Settings.DeviceAdminSettingsActivity.class.getName()); } - @Test - public void showAdminPolicies_withComponent_works() { - final EnforcedAdmin enforcedAdmin = createEnforcedAdmin(ADMIN_COMPONENT); - - ActionDisabledLearnMoreButtonLauncherImpl.SHOW_ADMIN_POLICIES - .accept(mActivity, enforcedAdmin); - - final ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); - verify(mActivity).startActivityAsUser( - captor.capture(), - eq(UserHandle.of(ENFORCED_ADMIN_USER_ID))); - assertDeviceAdminAddIntent(captor.getValue()); - } - - @Test - public void launchHelpPage_works() { - ActionDisabledLearnMoreButtonLauncherImpl.LAUNCH_HELP_PAGE.accept(mActivity, URL); - - final ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); - verify(mActivity).startActivityAsUser(captor.capture(), eq(UserHandle.SYSTEM)); - assertActionViewIntent(captor.getValue()); - } - - private EnforcedAdmin createEnforcedAdmin(ComponentName component) { - return new RestrictedLockUtils.EnforcedAdmin( - component, UserHandle.of(ENFORCED_ADMIN_USER_ID)); - } - private void assertDeviceAdminAddIntent(Intent intent) { assertThat(intent.getComponent().getClassName()) .isEqualTo(DeviceAdminAdd.class.getName());