From b8479ff1afa26324734a5d29b6f7ecc23be014d7 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 25 Feb 2021 03:12:22 +0800 Subject: [PATCH 01/11] Clean up RestrictedHomepagePreference Extend the RestrictedTopLevelPreference to clean up the same logic in RestrictedHomepagePreference. Bug: 177213699 Test: visual and test with TestDPC Change-Id: I287cd1973baebfaf73c09b626177be983651987c --- .../RestrictedHomepagePreference.java | 80 +------------------ 1 file changed, 3 insertions(+), 77 deletions(-) diff --git a/src/com/android/settings/homepage/RestrictedHomepagePreference.java b/src/com/android/settings/homepage/RestrictedHomepagePreference.java index bee52ec25f8..476642df138 100644 --- a/src/com/android/settings/homepage/RestrictedHomepagePreference.java +++ b/src/com/android/settings/homepage/RestrictedHomepagePreference.java @@ -16,27 +16,21 @@ package com.android.settings.homepage; -import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; - import android.content.Context; -import android.os.UserHandle; import android.util.AttributeSet; import androidx.core.content.res.TypedArrayUtils; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceViewHolder; import com.android.settings.R; -import com.android.settingslib.RestrictedPreferenceHelper; +import com.android.settingslib.RestrictedTopLevelPreference; /** Homepage preference that can be disabled by a device admin using a user restriction. */ -public class RestrictedHomepagePreference extends HomepagePreference { - private RestrictedPreferenceHelper mHelper; +public class RestrictedHomepagePreference extends RestrictedTopLevelPreference { public RestrictedHomepagePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs); + setLayoutResource(R.layout.homepage_preference); } public RestrictedHomepagePreference(Context context, AttributeSet attrs, int defStyleAttr) { @@ -51,72 +45,4 @@ public class RestrictedHomepagePreference extends HomepagePreference { public RestrictedHomepagePreference(Context context) { this(context, /* attrs= */ null); } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - mHelper.onBindViewHolder(holder); - } - - @Override - public void performClick() { - if (!mHelper.performClick()) { - super.performClick(); - } - } - - @Override - protected void onAttachedToHierarchy(PreferenceManager preferenceManager) { - mHelper.onAttachedToHierarchy(); - super.onAttachedToHierarchy(preferenceManager); - } - - /** - * Set the user restriction and disable this preference. - * - * @param userRestriction constant from {@link android.os.UserManager} - */ - public void checkRestrictionAndSetDisabled(String userRestriction) { - mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); - } - - /** - * Set the user restriction and disable this preference for the given user. - * - * @param userRestriction constant from {@link android.os.UserManager} - * @param userId user to check the restriction for. - */ - public void checkRestrictionAndSetDisabled(String userRestriction, int userId) { - mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); - } - - @Override - public void setEnabled(boolean enabled) { - if (enabled && isDisabledByAdmin()) { - mHelper.setDisabledByAdmin(/* admin= */ null); - return; - } - super.setEnabled(enabled); - } - - /** - * Check whether this preference is disabled by admin. - * - * @return true if this preference is disabled by admin. - */ - public boolean isDisabledByAdmin() { - return mHelper.isDisabledByAdmin(); - } - - /** - * Disable preference based on the enforce admin. - * - * @param admin details of the admin who enforced the restriction. If it is {@code null}, then - * this preference will be enabled. Otherwise, it will be disabled. - */ - public void setDisabledByAdmin(EnforcedAdmin admin) { - if (mHelper.setDisabledByAdmin(admin)) { - notifyChanged(); - } - } } From 1e607904c320893fd3bc9b77a7f12f46a4204cbe Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Thu, 25 Feb 2021 15:03:25 +0800 Subject: [PATCH 02/11] Update UI for factory reset flow After applying a collapsing toolbar in the Settings app, the factory reset screen is not displayed correctly. This is because 1) the factory reset page should not essentially have a toolbar since it has different UI layout form other pages. 2) this page was launched previously as a SubSettings so it applied a wrong theme. This change is mainly updating the inheritence structure and specifying the right theme for the factory reset page in order to have a correct layout. Bug: 179457252 Test: robotests and visual verified Change-Id: I91aec65a120d5a288507d89ace7c9298acdca42b --- src/com/android/settings/MainClear.java | 17 +++++++------ src/com/android/settings/Settings.java | 25 ++++++++++++++++++- .../core/gateway/SettingsGateway.java | 2 ++ .../FactoryResetPreferenceController.java | 14 +++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index 326aeef61a4..a7aa8eacf92 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -59,11 +59,11 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.settings.core.InstrumentedFragment; -import com.android.settings.core.SubSettingLauncher; import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.google.android.setupcompat.template.FooterBarMixin; @@ -187,12 +187,15 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis final Bundle args = new Bundle(); args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked()); args.putBoolean(ERASE_ESIMS_EXTRA, mEsimStorage.isChecked()); - new SubSettingLauncher(getContext()) - .setDestination(MainClearConfirm.class.getName()) - .setArguments(args) - .setTitleRes(R.string.main_clear_confirm_title) - .setSourceMetricsCategory(getMetricsCategory()) - .launch(); + final Intent intent = new Intent(); + intent.setClass(getContext(), + com.android.settings.Settings.FactoryResetConfirmActivity.class); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, MainClearConfirm.class.getName()); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, + R.string.main_clear_confirm_title); + intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, getMetricsCategory()); + getContext().startActivity(intent); } @VisibleForTesting diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 1008888504f..315eb19d3fc 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -123,7 +123,30 @@ public class Settings extends SettingsActivity { public static class ScanningSettingsActivity extends SettingsActivity { /* empty */ } public static class PrivacyDashboardActivity extends SettingsActivity { /* empty */ } public static class PrivacySettingsActivity extends SettingsActivity { /* empty */ } - public static class FactoryResetActivity extends SettingsActivity { /* empty */ } + public static class FactoryResetActivity extends SettingsActivity { + @Override + protected void onCreate(Bundle savedState) { + setTheme(SetupWizardUtils.getTheme(this, getIntent())); + super.onCreate(savedState); + } + + @Override + protected boolean isToolbarEnabled() { + return false; + } + } + public static class FactoryResetConfirmActivity extends SettingsActivity { + @Override + protected void onCreate(Bundle savedState) { + setTheme(SetupWizardUtils.getTheme(this, getIntent())); + super.onCreate(savedState); + } + + @Override + protected boolean isToolbarEnabled() { + return false; + } + } public static class RunningServicesActivity extends SettingsActivity { /* empty */ } public static class BatterySaverSettingsActivity extends SettingsActivity { /* empty */ } public static class BatterySaverScheduleSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 245389ea280..83ca2328a05 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -20,6 +20,7 @@ import com.android.settings.AllInOneTetherSettings; import com.android.settings.DisplaySettings; import com.android.settings.IccLockSettings; import com.android.settings.MainClear; +import com.android.settings.MainClearConfirm; import com.android.settings.Settings; import com.android.settings.TestingSettings; import com.android.settings.TetherSettings; @@ -282,6 +283,7 @@ public class SettingsGateway { WifiAPITest.class.getName(), WifiInfo.class.getName(), MainClear.class.getName(), + MainClearConfirm.class.getName(), ResetDashboardFragment.class.getName(), NightDisplaySettings.class.getName(), ManageDomainUrls.class.getName(), diff --git a/src/com/android/settings/system/FactoryResetPreferenceController.java b/src/com/android/settings/system/FactoryResetPreferenceController.java index cdeeaef5a3c..a307171d122 100644 --- a/src/com/android/settings/system/FactoryResetPreferenceController.java +++ b/src/com/android/settings/system/FactoryResetPreferenceController.java @@ -16,9 +16,13 @@ package com.android.settings.system; import android.content.Context; +import android.content.Intent; import android.os.UserManager; +import androidx.preference.Preference; + import com.android.settings.R; +import com.android.settings.Settings; import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; @@ -45,4 +49,14 @@ public class FactoryResetPreferenceController extends AbstractPreferenceControll public String getPreferenceKey() { return KEY_FACTORY_RESET; } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (KEY_FACTORY_RESET.equals(preference.getKey())) { + final Intent intent = new Intent(mContext, Settings.FactoryResetActivity.class); + mContext.startActivity(intent); + return true; + } + return false; + } } From e31fcb6dda510746baf2241c3dd78d2df9ef3a4f Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Mon, 15 Jun 2020 18:01:53 +0800 Subject: [PATCH 03/11] Avoid double-badging application icon in the dialog When creating a confirmation dialog for removing work profile, it will fetch an icon from ApplicationInfo and badge the icon. However, the cases of double-badging icon are happening in the some devices with higher density, which means the icon has already had a badge after getting it from ApplicationInfo. So this change attempts to directly use the icon. Bug: 148137991 Test: visual, manual 1. Install Test DPC from Play Store 2. Setup work profile 3. Settings -> Security -> Device admin apps 4. Click Test DPC item which has the badged icon -> Remove work profile 5. Observe the icon of the confirmation dialog Change-Id: I126bb799e37e168fb5fbc76107c0c897a6be2f9a --- src/com/android/settings/users/UserDialogs.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java index 0fb96369ef3..9aab5b03da1 100644 --- a/src/com/android/settings/users/UserDialogs.java +++ b/src/com/android/settings/users/UserDialogs.java @@ -92,8 +92,7 @@ public final class UserDialogs { View view = inflater.inflate(R.layout.delete_managed_profile_dialog, null); ImageView imageView = (ImageView) view.findViewById(R.id.delete_managed_profile_mdm_icon_view); - Drawable badgedApplicationIcon = packageManager.getUserBadgedIcon( - packageManager.getApplicationIcon(mdmApplicationInfo), new UserHandle(userId)); + Drawable badgedApplicationIcon = packageManager.getApplicationIcon(mdmApplicationInfo); imageView.setImageDrawable(badgedApplicationIcon); CharSequence appLabel = packageManager.getApplicationLabel(mdmApplicationInfo); From ade7bd8627b0e39c211a54e5287429f5752080a1 Mon Sep 17 00:00:00 2001 From: sallyyuen Date: Wed, 24 Feb 2021 10:01:19 -0800 Subject: [PATCH 04/11] Call into ColorDisplayManager for RBC slider range Test: atest ReduceBrightColorsIntensityPreferenceControllerTest Bug: b/179805222 Change-Id: I0927f41fad27e6b9b54c374e2c6a7cc6e0c5240d --- ...ghtColorsIntensityPreferenceController.java | 18 ++++++++---------- ...olorsIntensityPreferenceControllerTest.java | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java index ea7fb7c3111..3b220e4aa3e 100644 --- a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java +++ b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java @@ -29,8 +29,11 @@ import com.android.settings.widget.SeekBarPreference; /** PreferenceController for feature intensity. */ public class ReduceBrightColorsIntensityPreferenceController extends SliderPreferenceController { + private final ColorDisplayManager mColorDisplayManager; + public ReduceBrightColorsIntensityPreferenceController(Context context, String key) { super(context, key); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); } @Override @@ -59,31 +62,26 @@ public class ReduceBrightColorsIntensityPreferenceController extends SliderPrefe @Override public final void updateState(Preference preference) { super.updateState(preference); - preference.setEnabled(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0) == 1); + preference.setEnabled(mColorDisplayManager.isReduceBrightColorsActivated()); } @Override public int getSliderPosition() { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0); + return mColorDisplayManager.getReduceBrightColorsStrength(); } @Override public boolean setSliderPosition(int position) { - return Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, position); + return mColorDisplayManager.setReduceBrightColorsStrength(position); } @Override public int getMax() { - // TODO(b/170970675): Call into CDS to get config max intensity - return 100; + return ColorDisplayManager.getMaximumReduceBrightColorsStrength(mContext); } @Override public int getMin() { - // TODO(b/170970675): Call into CDS to get config min intensity - return 0; + return ColorDisplayManager.getMinimumReduceBrightColorsStrength(mContext); } } diff --git a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java index dee88176da5..8dac89318a0 100644 --- a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java @@ -24,11 +24,14 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; +import android.hardware.display.ColorDisplayManager; import android.provider.Settings; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.internal.R; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -79,8 +82,19 @@ public class ReduceBrightColorsIntensityPreferenceControllerTest { Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1); mPreferenceController.onPreferenceChange(/* preference= */ null, 20); - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0)) + assertThat( + mContext.getSystemService( + ColorDisplayManager.class).getReduceBrightColorsStrength()) .isEqualTo(20); } + + @Test + public void rangeOfSlider_staysWithinValidRange() { + when(mResources.getInteger( + R.integer.config_reduceBrightColorsStrengthMax)).thenReturn(90); + when(mResources.getInteger( + R.integer.config_reduceBrightColorsStrengthMin)).thenReturn(10); + assertThat(mPreferenceController.getMax() - mPreferenceController.getMin()) + .isEqualTo(80); + } } From f76cd69793ccac261aa190b4329b86ee4c24d55a Mon Sep 17 00:00:00 2001 From: Naga Venkata Durga Ashok Mutyala Date: Fri, 12 Feb 2021 11:51:57 +0000 Subject: [PATCH 05/11] Wellbeing Package needs to be enabled by default Add the wellbeing application to keepEnabledPackages. so, it will prevent the users to disable explicitly. Test: NA Bug: 180078180 Change-Id: I2645f30fac60106410eaf2126c10d8ab804fd1b7 --- .../settings/applications/ApplicationFeatureProviderImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index ac8146a580e..153e339d24d 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -180,6 +180,9 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide // Keep Package Installer enabled. keepEnabledPackages.add(mContext.getString(R.string.config_package_installer_package_name)); + if (mPm.getWellbeingPackageName() != null) { + keepEnabledPackages.add(mPm.getWellbeingPackageName()); + } return keepEnabledPackages; } From dc92d9e4c4a7a45ebed9d8b0e4553e430a2cf03b Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Fri, 26 Feb 2021 23:53:54 +0800 Subject: [PATCH 06/11] Make sucUsePartnerResource configurable The sucUsePartnerResource attribute should be able to configure seperately. In order to make it happen, we created a config for sucUsePartnerResource. Bug: 179882711 Test: robotests Change-Id: I755ea30f52d58167ab377277f7181696e72e184c --- res/values/config.xml | 3 +++ res/values/styles.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index 57d5a75ff3e..e923fbd3350 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -503,4 +503,7 @@ false + + + false diff --git a/res/values/styles.xml b/res/values/styles.xml index 993417aaf62..0d773f124fc 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -606,7 +606,7 @@ From 747597c72af515eff92a5db695d82cfbd117043d Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Sat, 27 Feb 2021 04:06:20 +0800 Subject: [PATCH 07/11] Make Reset Wi-Fi, mobile & bluetooth scrollable After setting both font size and display size to largest and enabling collapsing toolbar, the content in this page will be out of screen and be unable to scroll. Updating ScrollView to NestedScrollView can fix this kind of issue since ScrollView can't work with CoordinatorLayout. Bug: 178458729 Test: visual verified 1) Set font size and display size to largest 2) Navigate to Settings -> System -> Reset options -> Reset Wi-Fi mobile & bluetooth 3) Observe and check if the content area is able to scroll. Change-Id: I63451b99c6caa9283a45499e1374a58ccc224bfb --- res/layout/reset_network.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/layout/reset_network.xml b/res/layout/reset_network.xml index f6135a9af21..47fa56ad44f 100644 --- a/res/layout/reset_network.xml +++ b/res/layout/reset_network.xml @@ -19,7 +19,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > - - + Date: Sun, 7 Feb 2021 09:31:24 -0800 Subject: [PATCH 08/11] [Reduce Bright Colors] reorder preferences Test: Manual Bug: 128465252 Change-Id: I76b0b0c510a438a05c77cd77b64281882e553124 --- ...eReduceBrightColorsPreferenceFragment.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java index 09690d96ba7..f65bd62d786 100644 --- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java @@ -29,9 +29,13 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.preference.PreferenceCategory; +import androidx.preference.SwitchPreference; + import com.android.internal.accessibility.AccessibilityShortcutController; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.widget.SeekBarPreference; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.search.SearchIndexable; @@ -75,7 +79,21 @@ public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePre } }; - return super.onCreateView(inflater, container, savedInstanceState); + final View view = super.onCreateView(inflater, container, savedInstanceState); + updateGeneralCategoryOrder(); + return view; + } + + private void updateGeneralCategoryOrder() { + final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY); + final SeekBarPreference intensity = findPreference(KEY_INTENSITY); + getPreferenceScreen().removePreference(intensity); + intensity.setOrder(mShortcutPreference.getOrder() - 2); + generalCategory.addPreference(intensity); + final SwitchPreference persist = findPreference(KEY_PERSIST); + getPreferenceScreen().removePreference(persist); + persist.setOrder(mShortcutPreference.getOrder() - 1); + generalCategory.addPreference(persist); } @Override @@ -83,17 +101,6 @@ public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePre super.onViewCreated(view, savedInstanceState); } - /** Customizes the order by preference key. */ - protected List getPreferenceOrderList() { - final List lists = new ArrayList<>(); - lists.add(KEY_USE_SERVICE_PREFERENCE); - lists.add(KEY_INTENSITY); - lists.add(KEY_GENERAL_CATEGORY); - lists.add(KEY_PERSIST); - lists.add(KEY_INTRODUCTION_CATEGORY); - return lists; - } - @Override public void onResume() { super.onResume(); From f1489b51a3b5044f0211c2fa91777816284a8775 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Sat, 20 Feb 2021 22:32:13 +0800 Subject: [PATCH 09/11] [Provider Model] Show connected networks in APM/APM networks - Separate APM and APM network types from other Internet types because they can coexist at the same time. - Show no internet icon in airplane-mode networks. - Show connected non-carrier(Wi-Fi) network in airplane-mode networks. - Show connected Ethernet network when airplane mode on. - Screenshot: https://screenshot.googleplex.com/cr3eWNLMEuJ8zvP https://screenshot.googleplex.com/6DiMqKBBnBoxxhN Bug: 180778141 Bug: 180778839 Bug: 179106406 Test: manual test atest -c ConnectedEthernetNetworkControllerTest \ InternetConnectivityPanelTest \ InternetPreferenceControllerTest \ InternetUpdaterTest Change-Id: I861d5ce879facbb61dfdc5b7be943662d55bdcca --- res/drawable/ic_no_internet_available.xml | 31 ++++ res/drawable/ic_no_internet_unavailable.xml | 28 ++++ .../ConnectedEthernetNetworkController.java | 2 +- .../network/InternetPreferenceController.java | 43 +++-- .../settings/network/InternetUpdater.java | 149 ++++++++++++++---- .../telephony/NetworkProviderWorker.java | 5 +- .../panel/InternetConnectivityPanel.java | 79 +++++----- ...onnectedEthernetNetworkControllerTest.java | 12 +- .../InternetPreferenceControllerTest.java | 29 +--- .../settings/network/InternetUpdaterTest.java | 42 ++--- .../panel/InternetConnectivityPanelTest.java | 111 ++++++------- 11 files changed, 330 insertions(+), 201 deletions(-) create mode 100644 res/drawable/ic_no_internet_available.xml create mode 100644 res/drawable/ic_no_internet_unavailable.xml diff --git a/res/drawable/ic_no_internet_available.xml b/res/drawable/ic_no_internet_available.xml new file mode 100644 index 00000000000..06c6ef37f2f --- /dev/null +++ b/res/drawable/ic_no_internet_available.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable/ic_no_internet_unavailable.xml b/res/drawable/ic_no_internet_unavailable.xml new file mode 100644 index 00000000000..d255cb47377 --- /dev/null +++ b/res/drawable/ic_no_internet_unavailable.xml @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/com/android/settings/network/ConnectedEthernetNetworkController.java b/src/com/android/settings/network/ConnectedEthernetNetworkController.java index 5918331ceb0..2f7b4a912f8 100644 --- a/src/com/android/settings/network/ConnectedEthernetNetworkController.java +++ b/src/com/android/settings/network/ConnectedEthernetNetworkController.java @@ -33,7 +33,7 @@ import com.android.settingslib.core.AbstractPreferenceController; * PreferenceController to show the connected ethernet network. */ public class ConnectedEthernetNetworkController extends AbstractPreferenceController - implements InternetUpdater.OnInternetTypeChangedListener { + implements InternetUpdater.InternetChangeListener { public static final String KEY = "connected_ethernet_network"; diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java index 24fe284b2e4..2fe9c0adf16 100644 --- a/src/com/android/settings/network/InternetPreferenceController.java +++ b/src/com/android/settings/network/InternetPreferenceController.java @@ -19,10 +19,10 @@ package com.android.settings.network; import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; -import static com.android.settings.network.InternetUpdater.INTERNET_APM; -import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; +import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE; +import static com.android.settings.network.InternetUpdater.INTERNET_OFF; import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; import android.content.Context; @@ -53,7 +53,7 @@ import java.util.Map; */ public class InternetPreferenceController extends AbstractPreferenceController implements LifecycleObserver, SummaryUpdater.OnSummaryChangeListener, - InternetUpdater.OnInternetTypeChangedListener { + InternetUpdater.InternetChangeListener { public static final String KEY = "internet_settings"; @@ -65,8 +65,8 @@ public class InternetPreferenceController extends AbstractPreferenceController i @VisibleForTesting static Map sIconMap = new HashMap<>(); static { - sIconMap.put(INTERNET_APM, R.drawable.ic_airplanemode_active); - sIconMap.put(INTERNET_APM_NETWORKS, R.drawable.ic_airplane_safe_networks_24dp); + sIconMap.put(INTERNET_OFF, R.drawable.ic_no_internet_unavailable); + sIconMap.put(INTERNET_NETWORKS_AVAILABLE, R.drawable.ic_no_internet_available); sIconMap.put(INTERNET_WIFI, R.drawable.ic_wifi_signal_4); sIconMap.put(INTERNET_CELLULAR, R.drawable.ic_network_cell); sIconMap.put(INTERNET_ETHERNET, R.drawable.ic_settings_ethernet); @@ -74,8 +74,8 @@ public class InternetPreferenceController extends AbstractPreferenceController i private static Map sSummaryMap = new HashMap<>(); static { - sSummaryMap.put(INTERNET_APM, R.string.condition_airplane_title); - sSummaryMap.put(INTERNET_APM_NETWORKS, R.string.airplane_mode_network_available); + sSummaryMap.put(INTERNET_OFF, R.string.condition_airplane_title); + sSummaryMap.put(INTERNET_NETWORKS_AVAILABLE, R.string.disconnected); sSummaryMap.put(INTERNET_WIFI, 0); sSummaryMap.put(INTERNET_CELLULAR, 0); sSummaryMap.put(INTERNET_ETHERNET, R.string.to_switch_networks_disconnect_ethernet); @@ -114,8 +114,8 @@ public class InternetPreferenceController extends AbstractPreferenceController i } } - if (mustUseWiFiHelperSummary(mSummaryHelper.isWifiConnected(), - mSummaryHelper.getSummary())) { + if (mInternetType == INTERNET_WIFI) { + mPreference.setSummary(mSummaryHelper.getSummary()); return; } @@ -124,6 +124,12 @@ public class InternetPreferenceController extends AbstractPreferenceController i return; } + if (mInternetType == INTERNET_NETWORKS_AVAILABLE + && mInternetUpdater.isApmNetworksAvailable()) { + mPreference.setSummary(R.string.airplane_mode_network_available); + return; + } + final @IdRes int summary = sSummaryMap.get(mInternetType); if (summary != 0) { mPreference.setSummary(summary); @@ -157,6 +163,7 @@ public class InternetPreferenceController extends AbstractPreferenceController i * * @param internetType the internet type */ + @Override public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) { final boolean needUpdate = (internetType != mInternetType); mInternetType = internetType; @@ -167,19 +174,21 @@ public class InternetPreferenceController extends AbstractPreferenceController i } } + /** + * Called when airplane mode state is changed. + */ @Override - public void onSummaryChanged(String summary) { - mustUseWiFiHelperSummary(mSummaryHelper.isWifiConnected(), summary); + public void onAirplaneModeChanged(boolean isAirplaneModeOn) { + ThreadUtils.postOnMainThread(() -> { + updateState(mPreference); + }); } - @VisibleForTesting - boolean mustUseWiFiHelperSummary(boolean isWifiConnected, String summary) { - final boolean needUpdate = (mInternetType == INTERNET_WIFI) - || (mInternetType == INTERNET_APM_NETWORKS && isWifiConnected); - if (needUpdate && mPreference != null) { + @Override + public void onSummaryChanged(String summary) { + if (mInternetType == INTERNET_WIFI && mPreference != null) { mPreference.setSummary(summary); } - return needUpdate; } @VisibleForTesting diff --git a/src/com/android/settings/network/InternetUpdater.java b/src/com/android/settings/network/InternetUpdater.java index d415b10e20c..3bd1e7b2204 100644 --- a/src/com/android/settings/network/InternetUpdater.java +++ b/src/com/android/settings/network/InternetUpdater.java @@ -34,6 +34,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkCapabilities.Transport; import android.net.wifi.WifiManager; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; @@ -55,27 +56,45 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange private static final String TAG = "InternetUpdater"; - private OnInternetTypeChangedListener mOnInternetTypeChangedListener; + private InternetChangeListener mListener; - /** Interface that handles the internet type changed callback */ - public interface OnInternetTypeChangedListener { + /** Interface that handles the internet updater callback */ + public interface InternetChangeListener { /** * Called when internet type is changed. * * @param internetType the internet type */ - void onInternetTypeChanged(@InternetType int internetType); + default void onInternetTypeChanged(@InternetType int internetType) {}; + + /** + * Called when airplane mode state is changed. + */ + default void onAirplaneModeChanged(boolean isAirplaneModeOn) {}; + + /** + * Called when airplane mode networks state is changed. + */ + default void onAirplaneModeNetworksChanged(boolean available) {}; } /** - * Indicates this internet is unavailable type in airplane mode on. + * Indicates the internet is off when airplane mode is on. */ - public static final int INTERNET_APM = 0; + public static final int INTERNET_OFF = 0; /** - * Indicates this internet uses an airplane mode network type. + * Indicates this internet is not connected (includes no networks connected) or network(s) + * available. + * + * Examples include: + *

When airplane mode is turned off, and some networks (Wi-Fi, Mobile-data) are turned on, + * but no network can access the Internet. + * + *

When the airplane mode is turned on, and the WiFi is also turned on, but the WiFi is not + * connected or cannot access the Internet. */ - public static final int INTERNET_APM_NETWORKS = 1; + public static final int INTERNET_NETWORKS_AVAILABLE = 1; /** * Indicates this internet uses a Wi-Fi network type. @@ -94,8 +113,8 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange @Retention(RetentionPolicy.SOURCE) @android.annotation.IntDef(prefix = { "INTERNET_" }, value = { - INTERNET_APM, - INTERNET_APM_NETWORKS, + INTERNET_OFF, + INTERNET_NETWORKS_AVAILABLE, INTERNET_WIFI, INTERNET_CELLULAR, INTERNET_ETHERNET, @@ -110,6 +129,8 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange @VisibleForTesting AirplaneModeEnabler mAirplaneModeEnabler; + @VisibleForTesting + boolean mInternetAvailable; @VisibleForTesting @Transport int mTransport; private static Map sTransportMap = new HashMap<>(); @@ -120,22 +141,14 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange } private NetworkCallback mNetworkCallback = new NetworkCallback() { + public void onCapabilitiesChanged(@NonNull Network network, + @NonNull NetworkCapabilities networkCapabilities) { + checkNetworkCapabilities(networkCapabilities); + } + @Override - public void onAvailable(@NonNull Network network) { - if (network == null) { - return; - } - final NetworkCapabilities networkCapabilities = - mConnectivityManager.getNetworkCapabilities(network); - if (networkCapabilities == null) { - return; - } - for (@Transport int transport : networkCapabilities.getTransportTypes()) { - if (sTransportMap.containsKey(transport)) { - mTransport = transport; - break; - } - } + public void onLost(@NonNull Network network) { + mInternetAvailable = false; update(); } }; @@ -143,18 +156,22 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - update(); + fetchActiveNetwork(); + if (mListener != null && mAirplaneModeEnabler.isAirplaneModeOn()) { + mListener.onAirplaneModeNetworksChanged( + mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED); + } } }; - public InternetUpdater(Context context, Lifecycle lifecycle, - OnInternetTypeChangedListener listener) { + public InternetUpdater(Context context, Lifecycle lifecycle, InternetChangeListener listener) { mContext = context; mAirplaneModeEnabler = new AirplaneModeEnabler(mContext, this); mConnectivityManager = mContext.getSystemService(ConnectivityManager.class); mWifiManager = mContext.getSystemService(WifiManager.class); mWifiStateFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); - mOnInternetTypeChangedListener = listener; + mListener = listener; + fetchActiveNetwork(); if (lifecycle != null) { lifecycle.addObserver(this); } @@ -178,18 +195,65 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange @Override public void onAirplaneModeChanged(boolean isAirplaneModeOn) { + fetchActiveNetwork(); + if (mListener != null) { + mListener.onAirplaneModeChanged(isAirplaneModeOn); + } + } + + private void fetchActiveNetwork() { + Network activeNetwork = mConnectivityManager.getActiveNetwork(); + if (activeNetwork == null) { + mInternetAvailable = false; + update(); + return; + } + + NetworkCapabilities activeNetworkCapabilities = + mConnectivityManager.getNetworkCapabilities(activeNetwork); + if (activeNetworkCapabilities == null) { + mInternetAvailable = false; + update(); + return; + } + + checkNetworkCapabilities(activeNetworkCapabilities); + } + + private void checkNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) { + if (!networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { + mInternetAvailable = false; + update(); + return; + } + + boolean internetAvailable = false; + for (@Transport int transport : networkCapabilities.getTransportTypes()) { + if (sTransportMap.containsKey(transport)) { + mTransport = transport; + internetAvailable = true; + Log.i(TAG, "Detect an internet capability network with transport type: " + + mTransport); + break; + } + } + mInternetAvailable = internetAvailable; update(); } @VisibleForTesting void update() { - if (mAirplaneModeEnabler.isAirplaneModeOn()) { - mInternetType = mWifiManager.isWifiEnabled() ? INTERNET_APM_NETWORKS : INTERNET_APM; - } else { - mInternetType = sTransportMap.get(mTransport); + @InternetType int internetType = INTERNET_NETWORKS_AVAILABLE; + if (mInternetAvailable) { + internetType = sTransportMap.get(mTransport); + } else if (mAirplaneModeEnabler.isAirplaneModeOn() + && mWifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED) { + internetType = INTERNET_OFF; } - if (mOnInternetTypeChangedListener != null) { - mOnInternetTypeChangedListener.onInternetTypeChanged(mInternetType); + mInternetType = internetType; + + if (mListener != null) { + mListener.onInternetTypeChanged(mInternetType); } } @@ -199,4 +263,19 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange public @InternetType int getInternetType() { return mInternetType; } + + /** + * Return ture when the airplane mode is on. + */ + public boolean isAirplaneModeOn() { + return mAirplaneModeEnabler.isAirplaneModeOn(); + } + + /** + * Return ture when the APM networks is available. + */ + public boolean isApmNetworksAvailable() { + return mAirplaneModeEnabler.isAirplaneModeOn() + && (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED); + } } diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java index 50c56cf659f..9e23c7ce2dc 100644 --- a/src/com/android/settings/network/telephony/NetworkProviderWorker.java +++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java @@ -49,9 +49,8 @@ import java.util.Collections; */ public class NetworkProviderWorker extends WifiScanWorker implements SignalStrengthListener.Callback, MobileDataEnabledListener.Client, - DataConnectivityListener.Client, - SubscriptionsChangeListener.SubscriptionsChangeListenerClient, - InternetUpdater.OnInternetTypeChangedListener { + DataConnectivityListener.Client, InternetUpdater.InternetChangeListener, + SubscriptionsChangeListener.SubscriptionsChangeListenerClient { private static final String TAG = "NetworkProviderWorker"; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 4; private DataContentObserver mMobileDataObserver; diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java index c90d22b35de..bdaa8492230 100644 --- a/src/com/android/settings/panel/InternetConnectivityPanel.java +++ b/src/com/android/settings/panel/InternetConnectivityPanel.java @@ -19,8 +19,6 @@ package com.android.settings.panel; import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; -import static com.android.settings.network.InternetUpdater.INTERNET_APM; -import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS; import android.app.settings.SettingsEnums; @@ -46,14 +44,15 @@ import java.util.List; * Represents the Internet Connectivity Panel. */ public class InternetConnectivityPanel implements PanelContent, LifecycleObserver, - InternetUpdater.OnInternetTypeChangedListener { + InternetUpdater.InternetChangeListener { private final Context mContext; @VisibleForTesting boolean mIsProviderModelEnabled; private PanelContentCallback mCallback; private InternetUpdater mInternetUpdater; - private @InternetUpdater.InternetType int mInternetType; + private boolean mIsAirplaneModeOn; + private boolean mIsApmNetworksAvailable; public static InternetConnectivityPanel create(Context context) { return new InternetConnectivityPanel(context); @@ -63,7 +62,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mContext = context.getApplicationContext(); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); - mInternetType = mInternetUpdater.getInternetType(); + mIsAirplaneModeOn = mInternetUpdater.isAirplaneModeOn(); + mIsApmNetworksAvailable = mInternetUpdater.isApmNetworksAvailable(); } /** @OnLifecycleEvent(ON_RESUME) */ @@ -90,7 +90,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve @Override public CharSequence getTitle() { if (mIsProviderModelEnabled) { - return mContext.getText(mInternetType == INTERNET_APM_NETWORKS + return mContext.getText(mIsApmNetworksAvailable ? R.string.airplane_mode_network_panel_title : R.string.provider_internet_settings); } @@ -102,7 +102,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public CharSequence getSubTitle() { - if (mIsProviderModelEnabled && mInternetType == INTERNET_APM) { + if (mIsProviderModelEnabled && mIsAirplaneModeOn && !mIsApmNetworksAvailable) { return mContext.getText(R.string.condition_airplane_title); } return null; @@ -136,7 +136,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve @Override public CharSequence getCustomizedButtonTitle() { - if (mInternetType == INTERNET_APM) { + if (mIsAirplaneModeOn && !mIsApmNetworksAvailable) { return null; } return mContext.getText(R.string.settings_button); @@ -158,40 +158,43 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } /** - * Called when internet type is changed. - * - * @param internetType the internet type + * Called when airplane mode state is changed. */ - public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) { - if (internetType == mInternetType) { + @Override + public void onAirplaneModeChanged(boolean isAirplaneModeOn) { + if (!isAirplaneModeOn) { + mIsApmNetworksAvailable = false; + } + mIsAirplaneModeOn = isAirplaneModeOn; + updatePanelTitle(); + } + + /** + * Called when airplane mode networks state is changed. + */ + @Override + public void onAirplaneModeNetworksChanged(boolean available) { + mIsApmNetworksAvailable = available; + updatePanelTitle(); + } + + private void updatePanelTitle() { + if (mCallback == null) { return; } - final boolean changeToApm = (internetType == INTERNET_APM); - final boolean changeFromApm = (mInternetType == INTERNET_APM); - final boolean changeWithApmNetworks = - (internetType == INTERNET_APM_NETWORKS || mInternetType == INTERNET_APM_NETWORKS); - mInternetType = internetType; - - if (mCallback != null) { - if (changeToApm) { - // The internet type is changed to the airplane mode. - // Title: Internet - // Sub-Title: Airplane mode is on - // Settings button: Hide - mCallback.onHeaderChanged(); - mCallback.onCustomizedButtonStateChanged(); - } else if (changeFromApm) { - // The internet type is changed from the airplane mode. - // Title: Internet - // Settings button: Show - mCallback.onTitleChanged(); - mCallback.onCustomizedButtonStateChanged(); - } else if (changeWithApmNetworks) { - // The internet type is changed with the airplane mode networks. - // Title: Airplane mode networks / Internet - mCallback.onTitleChanged(); - } + if (mIsAirplaneModeOn && !mIsApmNetworksAvailable) { + // When the airplane mode is on. + // Title: Internet + // Sub-Title: Airplane mode is on + // Settings button: Hide + mCallback.onHeaderChanged(); + } else { + // Except for airplane mode on. + // Title: Airplane mode networks / Internet + // Settings button: Show + mCallback.onTitleChanged(); } + mCallback.onCustomizedButtonStateChanged(); } } diff --git a/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java b/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java index b5acdc5f584..5c56a45d63c 100644 --- a/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java +++ b/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java @@ -16,10 +16,10 @@ package com.android.settings.network; -import static com.android.settings.network.InternetUpdater.INTERNET_APM; -import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; +import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE; +import static com.android.settings.network.InternetUpdater.INTERNET_OFF; import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; import static com.google.common.truth.Truth.assertThat; @@ -77,15 +77,15 @@ public class ConnectedEthernetNetworkControllerTest { } @Test - public void isAvailable_internetApm_shouldBeFalse() { - mController.onInternetTypeChanged(INTERNET_APM); + public void isAvailable_internetOff_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_OFF); assertThat(mController.isAvailable()).isFalse(); } @Test - public void isAvailable_internetApmNetworks_shouldBeFalse() { - mController.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void isAvailable_internetNetworksAvailable_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_NETWORKS_AVAILABLE); assertThat(mController.isAvailable()).isFalse(); } diff --git a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java index ad07953b27e..60057131da3 100644 --- a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java @@ -16,7 +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_NETWORKS_AVAILABLE; import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; import static com.google.common.truth.Truth.assertThat; @@ -119,37 +119,24 @@ public class InternetPreferenceControllerTest { } @Test - public void mustUseWiFiHelperSummary_internetWifi_updateSummary() { + public void onSummaryChanged_internetWifi_updateSummary() { mController.onInternetTypeChanged(INTERNET_WIFI); mController.displayPreference(mScreen); - 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); + mController.onSummaryChanged(TEST_SUMMARY); assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY); } @Test - public void mustUseWiFiHelperSummary_internetApmNetworksWifiDisconnected_notUpdateSummary() { - mController.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void onSummaryChanged_internetNetworksAvailable_notUpdateSummary() { + mController.onInternetTypeChanged(INTERNET_NETWORKS_AVAILABLE); mController.displayPreference(mScreen); + mPreference.setSummary(NOT_CONNECTED); - mController.mustUseWiFiHelperSummary(false /* isWifiConnected */, NOT_CONNECTED); + mController.onSummaryChanged(TEST_SUMMARY); - assertThat(mPreference.getSummary()).isNotEqualTo(NOT_CONNECTED); + assertThat(mPreference.getSummary()).isNotEqualTo(TEST_SUMMARY); } @Test diff --git a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java index 18998b787c3..94456fe3f1d 100644 --- a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java +++ b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java @@ -20,10 +20,10 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; -import static com.android.settings.network.InternetUpdater.INTERNET_APM; -import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; +import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE; +import static com.android.settings.network.InternetUpdater.INTERNET_OFF; import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; import static com.google.common.truth.Truth.assertThat; @@ -109,26 +109,30 @@ public class InternetUpdaterTest { @Test public void update_apmOnWifiOff_getInternetApm() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); - doReturn(false).when(mWifiManager).isWifiEnabled(); + doReturn(WifiManager.WIFI_STATE_DISABLED).when(mWifiManager).getWifiState(); + mInternetUpdater.mInternetAvailable = false; mInternetUpdater.update(); - assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_APM); + assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_OFF); } @Test - public void update_apmOnWifiOn_getInternetApmNetworks() { + public void update_apmOnWifiOnNotConnected_getInternetNetworksAvailable() { + doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); + doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); + mInternetUpdater.mInternetAvailable = false; + + mInternetUpdater.update(); + + assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_NETWORKS_AVAILABLE); + } + + @Test + public void update_apmOnWifiConnected_getInternetWifi() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mWifiManager).isWifiEnabled(); - - mInternetUpdater.update(); - - assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_APM_NETWORKS); - } - - @Test - public void update_apmOffWifiConnected_getInternetWifi() { - doReturn(false).when(mAirplaneModeEnabler).isAirplaneModeOn(); + mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_WIFI; mInternetUpdater.update(); @@ -137,8 +141,9 @@ public class InternetUpdaterTest { } @Test - public void update_apmOffCellularConnected_getInternetCellular() { - doReturn(false).when(mAirplaneModeEnabler).isAirplaneModeOn(); + public void update_apmOnCellularConnected_getInternetCellular() { + doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); + mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_CELLULAR; mInternetUpdater.update(); @@ -147,8 +152,9 @@ public class InternetUpdaterTest { } @Test - public void update_apmOffEthernetConnected_getInternetEthernet() { - doReturn(false).when(mAirplaneModeEnabler).isAirplaneModeOn(); + public void update_apmOnEthernetConnected_getInternetEthernet() { + doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); + mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_ETHERNET; mInternetUpdater.update(); diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java index a4d4ad1b916..4b4ec32681c 100644 --- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +++ b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java @@ -16,12 +16,6 @@ package com.android.settings.panel; -import static com.android.settings.network.InternetUpdater.INTERNET_APM; -import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; -import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; -import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; -import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.clearInvocations; @@ -78,79 +72,70 @@ public class InternetConnectivityPanelTest { } @Test - public void getTitle_internetApmNetworks_shouldBeApmNetworks() { - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void getTitle_apmOnApmNetworksOff_shouldBeInternet() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(false); + + assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); + } + + @Test + public void getTitle_apmOnApmNetworksOn_shouldBeApmNetworks() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(true); assertThat(mPanel.getTitle()).isEqualTo(TITLE_APM_NETWORKS); } @Test public void getTitle_notInternetApmNetworks_shouldBeInternet() { - mPanel.onInternetTypeChanged(INTERNET_APM); - - assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); - - mPanel.onInternetTypeChanged(INTERNET_WIFI); - - assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); - - mPanel.onInternetTypeChanged(INTERNET_CELLULAR); - - assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); - - mPanel.onInternetTypeChanged(INTERNET_ETHERNET); + mPanel.onAirplaneModeNetworksChanged(false); assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); } @Test - public void getSubTitle_internetApm_shouldBeApmIsOn() { - mPanel.onInternetTypeChanged(INTERNET_APM); + public void getSubTitle_apmOnApmNetworksOff_shouldBeApmIsOn() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(false); assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_APM_IS_ON); } @Test - public void getSubTitle_notinternetApm_shouldBeNull() { - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); - - assertThat(mPanel.getSubTitle()).isNull(); - - mPanel.onInternetTypeChanged(INTERNET_WIFI); - - assertThat(mPanel.getSubTitle()).isNull(); - - mPanel.onInternetTypeChanged(INTERNET_CELLULAR); - - assertThat(mPanel.getSubTitle()).isNull(); - - mPanel.onInternetTypeChanged(INTERNET_ETHERNET); + public void getSubTitle_apmOnApmNetworksOn_shouldBeNull() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(true); assertThat(mPanel.getSubTitle()).isNull(); } @Test - public void getCustomizedButtonTitle_internetApm_shouldBeNull() { - mPanel.onInternetTypeChanged(INTERNET_APM); + public void getSubTitle_apmOff_shouldBeNull() { + mPanel.onAirplaneModeChanged(false); + + assertThat(mPanel.getSubTitle()).isNull(); + } + + @Test + public void getCustomizedButtonTitle_apmOnApmNetworksOff_shouldBeNull() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(false); assertThat(mPanel.getCustomizedButtonTitle()).isNull(); } @Test - public void getCustomizedButtonTitle_notInternetApm_shouldBeSettings() { - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void getCustomizedButtonTitle_apmOnApmNetworksOn_shouldBeSettings() { + mPanel.onAirplaneModeChanged(true); + mPanel.onAirplaneModeNetworksChanged(true); assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_SETTINGS); + } - mPanel.onInternetTypeChanged(INTERNET_WIFI); - - assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_SETTINGS); - - mPanel.onInternetTypeChanged(INTERNET_CELLULAR); - - assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_SETTINGS); - - mPanel.onInternetTypeChanged(INTERNET_ETHERNET); + @Test + public void getCustomizedButtonTitle_apmOff_shouldBeSettings() { + mPanel.onAirplaneModeChanged(false); assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_SETTINGS); } @@ -181,44 +166,46 @@ public class InternetConnectivityPanelTest { } @Test - public void onInternetTypeChanged_internetTypeChangedToApm_changeHeaderAndHideSettings() { - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void onAirplaneModeOn_apmNetworksOff_changeHeaderAndHideSettings() { + mPanel.onAirplaneModeNetworksChanged(false); clearInvocations(mPanelContentCallback); - mPanel.onInternetTypeChanged(INTERNET_APM); + mPanel.onAirplaneModeChanged(true); verify(mPanelContentCallback).onHeaderChanged(); verify(mPanelContentCallback).onCustomizedButtonStateChanged(); } @Test - public void onInternetTypeChanged_internetTypeChangedFomApm_changeTitleAndShowSettings() { - mPanel.onInternetTypeChanged(INTERNET_APM); + public void onAirplaneModeOn_apmNetworksOn_changeTitleAndShowSettings() { + mPanel.onAirplaneModeNetworksChanged(true); clearInvocations(mPanelContentCallback); - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + mPanel.onAirplaneModeChanged(true); verify(mPanelContentCallback).onTitleChanged(); verify(mPanelContentCallback).onCustomizedButtonStateChanged(); } @Test - public void onInternetTypeChanged_internetTypeChangedToApmNetworks_changeTitle() { - mPanel.onInternetTypeChanged(INTERNET_WIFI); + public void onAirplaneModeNetworksOn_apmOff_changeTitleAndShowSettings() { + mPanel.onAirplaneModeChanged(false); clearInvocations(mPanelContentCallback); - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + mPanel.onAirplaneModeNetworksChanged(true); verify(mPanelContentCallback).onTitleChanged(); + verify(mPanelContentCallback).onCustomizedButtonStateChanged(); } @Test - public void onInternetTypeChanged_internetTypeChangedFromApmNetworks_changeTitle() { - mPanel.onInternetTypeChanged(INTERNET_APM_NETWORKS); + public void onAirplaneModeNetworksOff_apmOff_changeTitleAndShowSettings() { + mPanel.onAirplaneModeChanged(false); clearInvocations(mPanelContentCallback); - mPanel.onInternetTypeChanged(INTERNET_WIFI); + mPanel.onAirplaneModeNetworksChanged(false); verify(mPanelContentCallback).onTitleChanged(); + verify(mPanelContentCallback).onCustomizedButtonStateChanged(); } } From a9a411e3dfd7427a0970d2cda16021e359f536bc Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Sun, 28 Feb 2021 16:31:08 +0800 Subject: [PATCH 10/11] [Settings] Only display backup calling when more than 1 SIM Backup calling only available when more than 1 SIM available. Bug: 179802059 Test: on device Change-Id: I24e5eb9e1a7064c3ea65389fbb00c0ff2a5852ed --- .../settings/network/SubscriptionUtil.java | 3 ++ .../BackupCallingPreferenceController.java | 53 ++++++++++++++----- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index aa704593f1f..be8f2578a64 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -70,6 +70,9 @@ public class SubscriptionUtil { if (sActiveResultsForTesting != null) { return sActiveResultsForTesting; } + if (manager == null) { + return Collections.emptyList(); + } final List subscriptions = manager.getActiveSubscriptionInfoList(); if (subscriptions == null) { return new ArrayList<>(); diff --git a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java index 2c6c9631754..8d037fb15c7 100644 --- a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java @@ -32,6 +32,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.network.SubscriptionUtil; +import java.util.List; import java.util.Objects; /** @@ -67,14 +68,22 @@ public class BackupCallingPreferenceController extends TelephonyTogglePreference @Override public int getAvailabilityStatus(int subId) { - return hasBackupCallingFeature(subId) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + if (!hasBackupCallingFeature(subId)) { + return CONDITIONALLY_UNAVAILABLE; + } + List subIdList = getActiveSubscriptionList(); + SubscriptionInfo subInfo = getSubscriptionInfoFromList(subIdList, subId); + if (subInfo == null) { // given subId is not actives + return CONDITIONALLY_UNAVAILABLE; + } + return (subIdList.size() > 1) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } /** * Implementation of abstract methods **/ public boolean setChecked(boolean isChecked) { - ImsMmTelManager imsMmTelMgr = getImsMmTelManager(); + ImsMmTelManager imsMmTelMgr = getImsMmTelManager(mSubId); if (imsMmTelMgr == null) { return false; } @@ -92,7 +101,7 @@ public class BackupCallingPreferenceController extends TelephonyTogglePreference * Implementation of abstract methods **/ public boolean isChecked() { - ImsMmTelManager imsMmTelMgr = getImsMmTelManager(); + ImsMmTelManager imsMmTelMgr = getImsMmTelManager(mSubId); if (imsMmTelMgr == null) { return false; } @@ -110,16 +119,17 @@ public class BackupCallingPreferenceController extends TelephonyTogglePreference if ((preference == null) || (!(preference instanceof SwitchPreference))) { return; } + SubscriptionInfo subInfo = getSubscriptionInfoFromActiveList(mSubId); + mPreference = preference; final SwitchPreference switchPreference = (SwitchPreference) preference; - switchPreference.setChecked(isChecked()); + switchPreference.setChecked((subInfo != null) ? isChecked() : false); - updateSummary(getLatestSummary()); + updateSummary(getLatestSummary(subInfo)); } - private String getLatestSummary() { - SubscriptionInfo subInfo = getSubscriptionInfo(); + private String getLatestSummary(SubscriptionInfo subInfo) { return Objects.toString((subInfo == null) ? null : SubscriptionUtil.getUniqueSubscriptionDisplayName(subInfo, mContext), ""); } @@ -144,19 +154,34 @@ public class BackupCallingPreferenceController extends TelephonyTogglePreference CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL, false); } - private ImsMmTelManager getImsMmTelManager() { - if (!SubscriptionManager.isUsableSubscriptionId(mSubId)) { + private ImsMmTelManager getImsMmTelManager(int subId) { + if (!SubscriptionManager.isUsableSubscriptionId(subId)) { return null; } ImsManager imsMgr = mContext.getSystemService(ImsManager.class); - return (imsMgr == null) ? null : imsMgr.getImsMmTelManager(mSubId); + return (imsMgr == null) ? null : imsMgr.getImsMmTelManager(subId); } - private SubscriptionInfo getSubscriptionInfo() { - SubscriptionManager subInfoMgr = mContext.getSystemService(SubscriptionManager.class); - if (subInfoMgr == null) { + private List getActiveSubscriptionList() { + SubscriptionManager subscriptionManager = + mContext.getSystemService(SubscriptionManager.class); + return SubscriptionUtil.getActiveSubscriptions(subscriptionManager); + } + + private SubscriptionInfo getSubscriptionInfoFromList( + List subInfoList, int subId) { + for (SubscriptionInfo subInfo : subInfoList) { + if ((subInfo != null) && (subInfo.getSubscriptionId() == subId)) { + return subInfo; + } + } + return null; + } + + private SubscriptionInfo getSubscriptionInfoFromActiveList(int subId) { + if (!SubscriptionManager.isUsableSubscriptionId(subId)) { return null; } - return subInfoMgr.getActiveSubscriptionInfo(mSubId); + return getSubscriptionInfoFromList(getActiveSubscriptionList(), subId); } } From 00f07cf138898dc3f93db025d8ab7b84f66310f6 Mon Sep 17 00:00:00 2001 From: Jordan Liu Date: Tue, 23 Feb 2021 15:25:43 -0800 Subject: [PATCH 11/11] Turn off translations for string Also move to config.xml and rename config_*. Bug: 178490564 Test: no behavior change, follow up with testers to make sure manual test is fixed Change-Id: Idc1828c936121928e13ecf11f5437c3488f87565 --- res/values/config.xml | 3 +++ res/values/strings.xml | 3 --- res/xml/app_and_notification.xml | 2 +- res/xml/configure_notification_settings_v2.xml | 2 +- res/xml/emergency_settings.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index e923fbd3350..984906f718e 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -506,4 +506,7 @@ false + + + com.android.cellbroadcastreceiver.module diff --git a/res/values/strings.xml b/res/values/strings.xml index 5abba1faabd..46864c2a8ad 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7519,9 +7519,6 @@ Send & receive when mobile data is off - - com.android.cellbroadcastreceiver.module - diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml index bd2e85ce127..49d8e9b85fd 100644 --- a/res/xml/app_and_notification.xml +++ b/res/xml/app_and_notification.xml @@ -90,7 +90,7 @@ settings:useAdminDisabledSummary="true"> diff --git a/res/xml/configure_notification_settings_v2.xml b/res/xml/configure_notification_settings_v2.xml index 6c3ec5292c2..902922087c6 100644 --- a/res/xml/configure_notification_settings_v2.xml +++ b/res/xml/configure_notification_settings_v2.xml @@ -109,7 +109,7 @@ settings:useAdminDisabledSummary="true"> diff --git a/res/xml/emergency_settings.xml b/res/xml/emergency_settings.xml index 774e3281014..28ae8b19c56 100644 --- a/res/xml/emergency_settings.xml +++ b/res/xml/emergency_settings.xml @@ -39,7 +39,7 @@ settings:useAdminDisabledSummary="true">