From 565d44c4f8dbd8ae5987b213d904e44bdf02ecdd Mon Sep 17 00:00:00 2001 From: changbetty Date: Wed, 13 Oct 2021 12:55:07 +0000 Subject: [PATCH 01/10] Add String for information about Wi-Fi scanning when Wi-Fi is off. Bug: 202323013 Test: make Change-Id: I22618a57bfecd02508f2d4a53ff6c65071de2fd1 (cherry picked from commit b7509a307947791baf6914672e75862e35b773f3) --- res/values/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index 594de34ae15..c4609fb1f5c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -13400,6 +13400,9 @@ SMS mobile data + + To improve device experience, apps and services can still scan for Wi\u2011Fi networks at any time, even when Wi\u2011Fi is off. This can be used, for example, to improve location-based features and services. You can change this in Wi\u2011Fi scanning settings. Change From ba67825a5455d122658493a1410d65e1c7a2e5ff Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 13 Oct 2021 23:08:50 +0800 Subject: [PATCH 02/10] Add WIFI_SCANNING_SETTINGS action to Settings - Export the interface for System UI to launch Wi-Fi Scanning Settings. Bug: 202323013 Test: manual test by adb to launch Wi-Fi scanning settings below adb shell am start -a android.settings.WIFI_SCANNING_SETTINGS Change-Id: I893d3cea40d1f3ed4a962009416f54c99a91e11f (cherry picked from commit 9e6966d1c275e4c3e4cd0dd5b8ba2e7d56d27fde) --- AndroidManifest.xml | 17 +++++++++++++++++ src/com/android/settings/Settings.java | 1 + .../settings/core/gateway/SettingsGateway.java | 2 ++ 3 files changed, 20 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fb3d7014471..de85af307d0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1397,6 +1397,23 @@ android:value="true" /> + + + + + + + + + Date: Tue, 12 Oct 2021 19:43:16 +0800 Subject: [PATCH 03/10] [Settings] Crash when resetting downloaded eSIM Context need to be maintained when performing async operation in background thread. Bug: 202787946 Test: local Change-Id: Ia5b81ae66e9482b10df5133b2f1444fc007a78e8 (cherry picked from commit 8aa98d63fd7af3c7e347c226270f942db92038cc) (cherry picked from commit 21f7095b3a3df98f8445691a7bd98bd67e2820b2) --- .../network/EraseEuiccDataDialogFragment.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java index 819d3b1fc6e..2c3847c9f2b 100644 --- a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java +++ b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java @@ -19,6 +19,7 @@ package com.android.settings.network; import android.app.AlertDialog; import android.app.Dialog; import android.app.settings.SettingsEnums; +import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; @@ -75,23 +76,24 @@ public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment imp } if (which == DialogInterface.BUTTON_POSITIVE) { - if (ConfirmationSimDeletionPredicate.getSingleton().test(getContext())) { + Context context = getContext(); + if (ConfirmationSimDeletionPredicate.getSingleton().test(context)) { // Create a "verify it's you" verification over keyguard // when "erase" button been pressed. // This might protect from erasing by some automation process. - WifiDppUtils.showLockScreen(getContext(), () -> runAsyncWipe()); + WifiDppUtils.showLockScreen(context, () -> runAsyncWipe(context)); } else { - runAsyncWipe(); + runAsyncWipe(context); } } } - private void runAsyncWipe() { + private void runAsyncWipe(Context context) { AsyncTask.execute(new Runnable() { @Override public void run() { RecoverySystem.wipeEuiccData( - getContext(), PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + context, PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); } }); } From 435c3385f610d110605c624208665cf4c54d12bf Mon Sep 17 00:00:00 2001 From: changbetty Date: Wed, 13 Oct 2021 15:13:36 +0000 Subject: [PATCH 04/10] For Internet Picker - Information about Wi-Fi scanning when Wi-Fi is off Bug: 202323013 Test: manual test Test: make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Change-Id: I4a26ec43bb7e1758b8170a7ff9fa7d5846cb4a35 (cherry picked from commit bfd3020038bd9351c5d9ff4aedbc30b8dd3cf1cd) --- res/xml/network_provider_settings.xml | 6 +++ .../network/NetworkProviderSettings.java | 37 +++++++++++++++++++ .../network/NetworkProviderSettingsTest.java | 31 ++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/res/xml/network_provider_settings.xml b/res/xml/network_provider_settings.xml index 9cab9241534..2d211b5fc85 100644 --- a/res/xml/network_provider_settings.xml +++ b/res/xml/network_provider_settings.xml @@ -81,4 +81,10 @@ + + diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index 88211ad17ed..8a4929a591b 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -61,7 +61,9 @@ import com.android.settings.core.FeatureFlags; import com.android.settings.core.SubSettingLauncher; import com.android.settings.datausage.DataUsagePreference; import com.android.settings.datausage.DataUsageUtils; +import com.android.settings.location.WifiScanningFragment; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.utils.AnnotationSpan; import com.android.settings.wifi.AddNetworkFragment; import com.android.settings.wifi.AddWifiNetworkPreference; import com.android.settings.wifi.ConfigureWifiEntryFragment; @@ -79,6 +81,7 @@ import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.search.Indexable; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; +import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.wifi.LongPressWifiEntryPreference; import com.android.settingslib.wifi.WifiSavedConfigUtils; @@ -132,6 +135,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment @VisibleForTesting static final String PREF_KEY_DATA_USAGE = "non_carrier_data_usage"; private static final String PREF_KEY_RESET_INTERNET = "resetting_your_internet"; + private static final String PREF_KEY_WIFI_STATUS_MESSAGE = "wifi_status_message_footer"; private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0; @@ -231,6 +235,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment LayoutPreference mResetInternetPreference; @VisibleForTesting ConnectedEthernetNetworkController mConnectedEthernetNetworkController; + @VisibleForTesting + FooterPreference mWifiStatusMessagePreference; /** * Mobile networks list for provider model @@ -305,6 +311,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment addNetworkMobileProviderController(); addConnectedEthernetNetworkController(); addWifiSwitchPreferenceController(); + mWifiStatusMessagePreference = findPreference(PREF_KEY_WIFI_STATUS_MESSAGE); } private void updateAirplaneModeMsgPreference(boolean visible) { @@ -717,6 +724,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment switch (wifiState) { case WifiManager.WIFI_STATE_ENABLED: + setWifiScanMessage(/* isWifiEnabled */ true); updateWifiEntryPreferences(); break; @@ -732,6 +740,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment break; case WifiManager.WIFI_STATE_DISABLED: + setWifiScanMessage(/* isWifiEnabled */ false); removeConnectedWifiEntryPreference(); removeWifiEntryPreference(); setAdditionalSettingsSummaries(); @@ -741,6 +750,34 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment } } + @VisibleForTesting + void setWifiScanMessage(boolean isWifiEnabled) { + final Context context = getContext(); + if (context == null) { + return; + } + if (isWifiEnabled || !mWifiManager.isScanAlwaysAvailable()) { + mWifiStatusMessagePreference.setVisible(false); + return; + } + if (TextUtils.isEmpty(mWifiStatusMessagePreference.getTitle())) { + AnnotationSpan.LinkInfo info = new AnnotationSpan.LinkInfo( + AnnotationSpan.LinkInfo.DEFAULT_ANNOTATION, + v -> launchWifiScanningFragment()); + CharSequence text = AnnotationSpan.linkify( + context.getText(R.string.wifi_scan_notify_message), info); + mWifiStatusMessagePreference.setTitle(text); + } + mWifiStatusMessagePreference.setVisible(true); + } + + private void launchWifiScanningFragment() { + new SubSettingLauncher(getContext()) + .setDestination(WifiScanningFragment.class.getName()) + .setSourceMetricsCategory(SettingsEnums.SETTINGS_NETWORK_CATEGORY) + .launch(); + } + @Override public void onWifiEntriesChanged() { if (mIsWifiEntryListStale) { diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java index 19b044b7abf..e048849ae9c 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java @@ -67,6 +67,7 @@ import com.android.settings.wifi.AddWifiNetworkPreference; import com.android.settings.wifi.ConnectedWifiEntryPreference; import com.android.settings.wifi.WifiConfigController2; import com.android.settings.wifi.WifiDialog2; +import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.wifi.LongPressWifiEntryPreference; import com.android.wifitrackerlib.WifiEntry; @@ -144,6 +145,7 @@ public class NetworkProviderSettingsTest { mNetworkProviderSettings.mAirplaneModeMsgPreference = mAirplaneModeMsgPreference; mNetworkProviderSettings.mAirplaneModeEnabler = mAirplaneModeEnabler; mNetworkProviderSettings.mInternetUpdater = mInternetUpdater; + mNetworkProviderSettings.mWifiStatusMessagePreference = new FooterPreference(mContext); doReturn(NetworkProviderSettings.PREF_KEY_CONNECTED_ACCESS_POINTS) .when(mConnectedWifiEntryPreferenceCategory).getKey(); mNetworkProviderSettings.mConnectedWifiEntryPreferenceCategory = @@ -531,6 +533,35 @@ public class NetworkProviderSettingsTest { verify(mNetworkProviderSettings.mWifiEntryPreferenceCategory, never()).setVisible(true); } + @Test + public void setWifiScanMessage_wifiOnScanOn_footerIsInvisible() { + when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); + + mNetworkProviderSettings.setWifiScanMessage(/* isWifiEnabled */ true); + + assertThat(mNetworkProviderSettings.mWifiStatusMessagePreference.isVisible()).isFalse(); + } + + @Test + public void setWifiScanMessage_wifiOffScanOn_footerIsVisible() { + when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); + + mNetworkProviderSettings.setWifiScanMessage(/* isWifiEnabled */ false); + + assertThat(mNetworkProviderSettings.mWifiStatusMessagePreference.isVisible()).isTrue(); + assertThat(mNetworkProviderSettings.mWifiStatusMessagePreference.getTitle().length()) + .isNotEqualTo(0); + } + + @Test + public void setWifiScanMessage_wifiOffScanOff_footerIsInvisible() { + when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); + + mNetworkProviderSettings.setWifiScanMessage(/* isWifiEnabled */ false); + + assertThat(mNetworkProviderSettings.mWifiStatusMessagePreference.isVisible()).isFalse(); + } + @Test @Config(shadows = ShadowPreferenceFragmentCompat.class) public void onStop_shouldRemoveCallbacks() { From b172582c14abf47b39ee36a289a19cc2ffed0bae Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Thu, 14 Oct 2021 18:54:52 +0800 Subject: [PATCH 05/10] The Network name is not same as statusbar at SIM Edit page Using subscriptionInfo to get the network name. Bug: 203035698 Bug: 201591202 Test: make RunSettingsRoboTests ROBOTEST_FILTER=RenameMobileNetworkDialogFragmentTest (PASS) Change-Id: I84848a2801172b46f7cc3ff39d88ad57e34514a4 (cherry picked from commit 050b6d5224b078bc23b6ad212962b048d3d8a05e) --- .../telephony/RenameMobileNetworkDialogFragment.java | 5 +---- .../telephony/RenameMobileNetworkDialogFragmentTest.java | 7 +------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java index 8e65605eecc..5f208949e52 100644 --- a/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java +++ b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java @@ -25,7 +25,6 @@ import android.graphics.Paint; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.os.Bundle; -import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -52,7 +51,6 @@ import com.android.settingslib.DeviceInfoUtils; import com.google.common.collect.ImmutableMap; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -180,8 +178,7 @@ public class RenameMobileNetworkDialogFragment extends InstrumentedDialogFragmen final TextView operatorName = view.findViewById(R.id.operator_name_value); mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId); - final ServiceState serviceState = mTelephonyManager.getServiceState(); - operatorName.setText(serviceState == null ? "" : serviceState.getOperatorAlphaLong()); + operatorName.setText(info.getCarrierName()); final TextView phoneTitle = view.findViewById(R.id.number_label); phoneTitle.setVisibility(info.isOpportunistic() ? View.GONE : View.VISIBLE); diff --git a/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java index 70b05981370..ea440c771e0 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java @@ -31,7 +31,6 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; -import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -73,8 +72,6 @@ public class RenameMobileNetworkDialogFragmentTest { @Mock private TelephonyManager mTelephonyMgr; @Mock - private ServiceState mServiceState; - @Mock private SubscriptionManager mSubscriptionMgr; @Mock private SubscriptionInfo mSubscriptionInfo; @@ -95,11 +92,9 @@ public class RenameMobileNetworkDialogFragmentTest { stm.setTelephonyManagerForSubscriptionId(mSubscriptionId, mTelephonyMgr); when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr); - when(mTelephonyMgr.getServiceState()).thenReturn(mServiceState); - when(mServiceState.getOperatorAlphaLong()).thenReturn("fake carrier name"); - when(mSubscriptionInfo.getSubscriptionId()).thenReturn(mSubscriptionId); when(mSubscriptionInfo.getDisplayName()).thenReturn("test"); + when(mSubscriptionInfo.getCarrierName()).thenReturn("fake carrier name"); when(mSubscriptionMgr.setDisplayName(any(), anyInt(), anyInt())).thenReturn(0); mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).setup().get()); From 4436b7fe7dad82be4251484c21e2cf3a1e87c0e7 Mon Sep 17 00:00:00 2001 From: Jan Tomljanovic Date: Fri, 10 Dec 2021 15:09:31 +0000 Subject: [PATCH 06/10] Redirect intents leading to Security and Privacy pages We want them to lead to SafetyCenter when it's enabled. Test: atest SettingsUnitTests Test: manual: android.settings.PRIVACY_SETTINGS and android.settings.SECURITY_SETTINGS intent actions open the intended target page depending on the flag. Bug: 204978497 Change-Id: Idc0200f98da359cbf11952393d4c83599f3f541c --- src/com/android/settings/Settings.java | 49 +++++++- .../privacy/PrivacyDashboardActivityTest.java | 107 ++++++++++++++++++ .../SecurityDashboardActivityTest.java | 50 +++++++- 3 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index afd0d15ac2a..ed3e230cfdb 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -16,16 +16,19 @@ package com.android.settings; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.FeatureFlagUtils; +import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.core.FeatureFlags; import com.android.settings.enterprise.EnterprisePrivacySettings; import com.android.settings.overlay.FeatureFactory; +import com.android.settings.safetycenter.SafetyCenterStatus; import com.android.settings.security.SecuritySettingsFeatureProvider; import com.google.android.setupdesign.util.ThemeHelper; @@ -131,6 +134,27 @@ public class Settings extends SettingsActivity { /** Activity for the security dashboard. */ public static class SecurityDashboardActivity extends SettingsActivity { + private static final String TAG = "SecurityDashboardActivity"; + + @Override + protected void onCreate(Bundle savedState) { + super.onCreate(savedState); + handleSafetyCenterRedirection(); + } + + /** Redirects to SafetyCenter if enabled. */ + @VisibleForTesting + public void handleSafetyCenterRedirection() { + if (SafetyCenterStatus.isEnabled()) { + try { + startActivity(new Intent(Intent.ACTION_SAFETY_CENTER)); + finish(); + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Unable to open safety center", e); + } + } + } + /** Whether the given fragment is allowed. */ @VisibleForTesting @Override @@ -166,7 +190,30 @@ public class Settings extends SettingsActivity { public static class LocationSettingsActivity extends SettingsActivity { /* empty */ } public static class ScanningSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiScanningSettingsActivity extends SettingsActivity { /* empty */ } - public static class PrivacyDashboardActivity extends SettingsActivity { /* empty */ } + /** Activity for the privacy dashboard. */ + public static class PrivacyDashboardActivity extends SettingsActivity { + + private static final String TAG = "PrivacyDashboardActivity"; + + @Override + protected void onCreate(Bundle savedState) { + super.onCreate(savedState); + handleSafetyCenterRedirection(); + } + + /** Redirects to SafetyCenter if enabled. */ + @VisibleForTesting + public void handleSafetyCenterRedirection() { + if (SafetyCenterStatus.isEnabled()) { + try { + startActivity(new Intent(Intent.ACTION_SAFETY_CENTER)); + finish(); + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Unable to open safety center", e); + } + } + } + } public static class PrivacySettingsActivity extends SettingsActivity { /* empty */ } public static class FactoryResetActivity extends SettingsActivity { @Override diff --git a/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java b/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java new file mode 100644 index 00000000000..236555321d9 --- /dev/null +++ b/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java @@ -0,0 +1,107 @@ +/* + * 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.privacy; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Intent; +import android.provider.DeviceConfig; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import com.android.settings.Settings; +import com.android.settings.SettingsActivity; +import com.android.settings.safetycenter.SafetyCenterStatus; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; + +@RunWith(AndroidJUnit4.class) +public class PrivacyDashboardActivityTest { + + private static final String DEFAULT_FRAGMENT_CLASSNAME = "DefaultFragmentClassname"; + + private Settings.PrivacyDashboardActivity mActivity; + + @Before + public void setUp() { + DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS, + DeviceConfig.NAMESPACE_PRIVACY); + final Intent intent = new Intent(); + intent.setAction(android.provider.Settings.ACTION_PRIVACY_SETTINGS); + intent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(), + Settings.PrivacyDashboardActivity.class); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, DEFAULT_FRAGMENT_CLASSNAME); + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + try { + mActivity = + spy((Settings.PrivacyDashboardActivity) InstrumentationRegistry + .getInstrumentation().newActivity( + getClass().getClassLoader(), + Settings.PrivacyDashboardActivity.class.getName(), + intent)); + } catch (Exception e) { + throw new RuntimeException(e); // nothing to do + } + }); + doNothing().when(mActivity).startActivity(any(Intent.class)); + } + + @After + public void tearDown() { + DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS, + DeviceConfig.NAMESPACE_PRIVACY); + } + + @Test + public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() { + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_PRIVACY, + SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED, + /* value = */ Boolean.toString(true), + /* makeDefault = */ false); + final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + + mActivity.handleSafetyCenterRedirection(); + + verify(mActivity).startActivity(intentCaptor.capture()); + assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SAFETY_CENTER); + } + + @Test + public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() { + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_PRIVACY, + SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED, + /* value = */ Boolean.toString(false), + /* makeDefault = */ false); + + mActivity.handleSafetyCenterRedirection(); + + verify(mActivity, times(0)).startActivity(any()); + } +} diff --git a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java index 3bda96e9890..040661693cf 100644 --- a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java +++ b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java @@ -18,20 +18,29 @@ package com.android.settings.security; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Intent; +import android.provider.DeviceConfig; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; import com.android.settings.Settings; import com.android.settings.SettingsActivity; +import com.android.settings.safetycenter.SafetyCenterStatus; import com.android.settings.testutils.FakeFeatureFactory; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @@ -48,6 +57,8 @@ public class SecurityDashboardActivityTest { MockitoAnnotations.initMocks(this); FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest(); mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider(); + DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS, + DeviceConfig.NAMESPACE_PRIVACY); mDefaultIntent = new Intent(); mDefaultIntent.setAction(android.provider.Settings.ACTION_SECURITY_SETTINGS); mDefaultIntent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(), @@ -56,15 +67,22 @@ public class SecurityDashboardActivityTest { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { try { mActivity = - (Settings.SecurityDashboardActivity) InstrumentationRegistry + spy((Settings.SecurityDashboardActivity) InstrumentationRegistry .getInstrumentation().newActivity( getClass().getClassLoader(), Settings.SecurityDashboardActivity.class.getName(), - mDefaultIntent); + mDefaultIntent)); } catch (Exception e) { throw new RuntimeException(e); // nothing to do } }); + doNothing().when(mActivity).startActivity(any(Intent.class)); + } + + @After + public void tearDown() { + DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS, + DeviceConfig.NAMESPACE_PRIVACY); } @Test @@ -104,4 +122,32 @@ public class SecurityDashboardActivityTest { assertThat(mActivity.isValidFragment(ALTERNATIVE_FRAGMENT_CLASSNAME)).isTrue(); } + + @Test + public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() { + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_PRIVACY, + SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED, + /* value = */ Boolean.toString(true), + /* makeDefault = */ false); + final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + + mActivity.handleSafetyCenterRedirection(); + + verify(mActivity).startActivity(intentCaptor.capture()); + assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SAFETY_CENTER); + } + + @Test + public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() { + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_PRIVACY, + SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED, + /* value = */ Boolean.toString(false), + /* makeDefault = */ false); + + mActivity.handleSafetyCenterRedirection(); + + verify(mActivity, times(0)).startActivity(any()); + } } From 26b0bd7f1984441d19406f5a6288f6e69a8b1c9c Mon Sep 17 00:00:00 2001 From: tom hsu Date: Wed, 8 Dec 2021 16:27:47 +0800 Subject: [PATCH 07/10] [Panlingual] Add outside entry. - video: https://screencast.googleplex.com/cast/NjIxODkzNzYyMjU5MzUzNnwwMWMxYjI1Ny1hMw Bug: 207743479 Test: local Change-Id: Iab3ba4d14f581aed7b737521ccba4f62e1c04998 --- AndroidManifest.xml | 12 +++ .../appinfo/AppLocaleDetails.java | 11 ++- .../appinfo/AppLocalePickerActivity.java | 53 +++++++++++ .../core/gateway/SettingsGateway.java | 4 +- .../appinfo/AppLocalePickerActivityTest.java | 87 +++++++++++++++++++ 5 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 src/com/android/settings/applications/appinfo/AppLocalePickerActivity.java create mode 100644 tests/unit/src/com/android/settings/applications/appinfo/AppLocalePickerActivityTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6e82b11ad29..3cbb4278f8a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -843,6 +843,18 @@ android:theme="@style/Theme.LocalePickerWithRegionActivity"> + + + + + + + + Date: Fri, 17 Dec 2021 14:37:55 +0800 Subject: [PATCH 08/10] [Settings] Workaround for network and internet crash Network and internet UI crash. This is a temporarily workaround for it. Bug: 211045208 Test: local Change-Id: Ie19e565547c26967d83b194c2e098286dd676178 --- .../MobileDataPreferenceController.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java index 1ac121e56ff..69951bf43a0 100644 --- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java +++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java @@ -122,6 +122,7 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon @Override public boolean isChecked() { + mTelephonyManager = getTelephonyManager(); return mTelephonyManager.isDataEnabled(); } @@ -152,8 +153,21 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon public void init(FragmentManager fragmentManager, int subId) { mFragmentManager = fragmentManager; mSubId = subId; - mTelephonyManager = mContext.getSystemService(TelephonyManager.class) - .createForSubscriptionId(mSubId); + mTelephonyManager = null; + mTelephonyManager = getTelephonyManager(); + } + + private TelephonyManager getTelephonyManager() { + if (mTelephonyManager != null) { + return mTelephonyManager; + } + TelephonyManager telMgr = + mContext.getSystemService(TelephonyManager.class); + if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + telMgr = telMgr.createForSubscriptionId(mSubId); + } + mTelephonyManager = telMgr; + return telMgr; } public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) { @@ -163,6 +177,7 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon @VisibleForTesting boolean isDialogNeeded() { final boolean enableData = !isChecked(); + mTelephonyManager = getTelephonyManager(); final boolean isMultiSim = (mTelephonyManager.getActiveModemCount() > 1); final int defaultSubId = mSubscriptionManager.getDefaultDataSubscriptionId(); final boolean needToDisableOthers = mSubscriptionManager From 4780be49f3241ff3a8e1c09f60cc9305098da751 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Tue, 21 Dec 2021 05:39:09 +0800 Subject: [PATCH 09/10] [MEP] renew the sim confirm dialog UI - renew the sim confirm dialog Bug: 199902896 Test: build pass and local UI test Change-Id: Icb00b3fc32066e21d22cbeca1fdf50e5d7dbef20 --- AndroidManifest.xml | 8 ++-- .../sim_confirm_dialog_btn_outline.xml | 41 +++++++++++++++++++ .../sim_confirm_dialog_rounded_bg.xml | 30 ++++++++++++++ ...em_multiple_enabled_profiles_supported.xml | 30 ++++++++++++++ ...og_multiple_enabled_profiles_supported.xml | 31 ++++++++------ ...le_multiple_enabled_profiles_supported.xml | 25 +++++++++++ res/values-night/styles.xml | 15 +++++-- res/values-night/themes.xml | 6 +++ res/values/strings.xml | 2 +- res/values/styles.xml | 21 ++++++++++ res/values/themes.xml | 7 ++++ .../telephony/ConfirmDialogFragment.java | 22 +++++++--- 12 files changed, 212 insertions(+), 26 deletions(-) create mode 100644 res/drawable/sim_confirm_dialog_btn_outline.xml create mode 100644 res/drawable/sim_confirm_dialog_rounded_bg.xml create mode 100644 res/layout/sim_confirm_dialog_item_multiple_enabled_profiles_supported.xml create mode 100644 res/layout/sim_confirm_dialog_title_multiple_enabled_profiles_supported.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 99b62a3cd34..95f6a272532 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -659,12 +659,12 @@ + android:theme="@style/Theme.AlertDialog.SimConfirmDialog"/> + android:theme="@style/Theme.AlertDialog.SimConfirmDialog"/> + android:theme="@style/Theme.AlertDialog.SimConfirmDialog"/> + android:theme="@style/Theme.AlertDialog.SimConfirmDialog"/> diff --git a/res/drawable/sim_confirm_dialog_btn_outline.xml b/res/drawable/sim_confirm_dialog_btn_outline.xml new file mode 100644 index 00000000000..5722f8ce7ec --- /dev/null +++ b/res/drawable/sim_confirm_dialog_btn_outline.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable/sim_confirm_dialog_rounded_bg.xml b/res/drawable/sim_confirm_dialog_rounded_bg.xml new file mode 100644 index 00000000000..ab7e39229c4 --- /dev/null +++ b/res/drawable/sim_confirm_dialog_rounded_bg.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/res/layout/sim_confirm_dialog_item_multiple_enabled_profiles_supported.xml b/res/layout/sim_confirm_dialog_item_multiple_enabled_profiles_supported.xml new file mode 100644 index 00000000000..003cdbfa137 --- /dev/null +++ b/res/layout/sim_confirm_dialog_item_multiple_enabled_profiles_supported.xml @@ -0,0 +1,30 @@ + + + + diff --git a/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml b/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml index 44044820653..610bf3de2e8 100644 --- a/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml +++ b/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml @@ -16,42 +16,49 @@ + android:orientation="vertical"> + android:layout_height="wrap_content" + android:paddingEnd="24dp" + android:paddingTop="16dp" + android:paddingStart="24dp" + android:gravity="center" + android:textAppearance="@style/TextAppearance.DialogMessage"/> - + android:textColor="?android:attr/textColorSecondary" + android:textAppearance="@style/TextAppearance.DialogMessage"/> \ No newline at end of file diff --git a/res/layout/sim_confirm_dialog_title_multiple_enabled_profiles_supported.xml b/res/layout/sim_confirm_dialog_title_multiple_enabled_profiles_supported.xml new file mode 100644 index 00000000000..f43303f8497 --- /dev/null +++ b/res/layout/sim_confirm_dialog_title_multiple_enabled_profiles_supported.xml @@ -0,0 +1,25 @@ + + + + diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml index 87159b8b76f..a388855e8d7 100644 --- a/res/values-night/styles.xml +++ b/res/values-night/styles.xml @@ -16,9 +16,18 @@ --> + - + + \ No newline at end of file diff --git a/res/values-night/themes.xml b/res/values-night/themes.xml index 946cd91ce0a..4564827d40d 100644 --- a/res/values-night/themes.xml +++ b/res/values-night/themes.xml @@ -34,6 +34,12 @@ @*android:color/surface_dark + + + + + + + + diff --git a/res/values/themes.xml b/res/values/themes.xml index 7c5c11141cd..d73e1578c71 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -151,6 +151,13 @@ @*android:style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog + + +