From 3a4946241c4313c4f6bf7a64b80067ce7c50e9f1 Mon Sep 17 00:00:00 2001 From: Jacob Hobbie Date: Tue, 2 Nov 2021 21:17:51 +0000 Subject: [PATCH 01/14] Marking permission protected receiver exported. All dynamically registered receivers will have to have an explicit flag for exported/not exported, and since this receiver is permission protected we can safely mark it as exported, the current default behavior. Bug: 161145287 Test: no-op Change-Id: Ia8b2179e486df29d2bd8014420573c938c6cc1ac --- .../settings/network/telephony/EuiccOperationSidecar.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java index 0ee6d95fa83..05c866e7e9a 100644 --- a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java +++ b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java @@ -114,7 +114,8 @@ public abstract class EuiccOperationSidecar extends SidecarFragment { mReceiver, new IntentFilter(getReceiverAction()), Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS, - null); + null, + Context.RECEIVER_EXPORTED); } @Override From 0a3acc1c3fdf655d3d1177632e4665a1824aec96 Mon Sep 17 00:00:00 2001 From: Jacob Hobbie Date: Tue, 2 Nov 2021 21:44:01 +0000 Subject: [PATCH 02/14] Adding receiver exported flag. Since the broadcast receiver in question is permission protected we will add a RECEIVER_EXPORTED flag to make this receiver compatible with Android T+. Change-Id: Ib6453b47641a32796e202f4f9e37099c36b6c683 Test:no-op Bug:161145287 --- src/com/android/settings/wifi/tether/TetherService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/wifi/tether/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java index 59027193ed5..8a557ba0c3e 100644 --- a/src/com/android/settings/wifi/tether/TetherService.java +++ b/src/com/android/settings/wifi/tether/TetherService.java @@ -119,7 +119,8 @@ public class TetherService extends Service { if (mExpectedProvisionResponseAction != null) unregisterReceiver(mReceiver); registerReceiver(mReceiver, new IntentFilter(responseAction), - android.Manifest.permission.TETHER_PRIVILEGED, null /* handler */); + android.Manifest.permission.TETHER_PRIVILEGED, null /* handler */, + Context.RECEIVER_EXPORTED); mExpectedProvisionResponseAction = responseAction; if (DEBUG) Log.d(TAG, "registerReceiver " + responseAction); } From 928254beec2d09f301569706907b7c36867d26ec Mon Sep 17 00:00:00 2001 From: Jacob Hobbie Date: Tue, 2 Nov 2021 21:29:45 +0000 Subject: [PATCH 03/14] Adding RECEIVER_EXPORTED flag. ACTION_CLOSE_SySTEM_DIALOG has been deprecated and will be dropped by the system in non-debug builds S+, so we want to preserve the old behavior and should mark this receiver as exported for T+. Bug:161145287 Change-Id: I27fa0cbd971d17cb2bf7852e464c1b37d41350a8 Test: no-op --- .../homepage/contextualcards/ContextualCardsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java index 3b75ebf420e..fb879bacc5a 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java @@ -129,7 +129,7 @@ public class ContextualCardsFragment extends InstrumentedFragment implements private void registerKeyEventReceiver() { getActivity().registerReceiver(mKeyEventReceiver, - new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), Context.RECEIVER_EXPORTED); } private void unregisterKeyEventReceiver() { From d7f302fb4e76742772902e89c9d8a483b5778afa Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Thu, 11 Nov 2021 15:10:59 +0800 Subject: [PATCH 04/14] Fix suw display size flicker problem - Swipe the preview area will invoke the OnGlobalLayoutListener. - Sometime it cause a flicker when scroll view scrolling up and preivew area swiping. - It is no need to scroll up if the height of scroll view does not change. Fixes: 205918748 Test: manual test Change-Id: I8ed5454d32f0cf2a7bc3bac45c7aa054ce929c4b --- .../AccessibilityScreenSizeForSetupWizardActivity.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java index 7894c6e2789..10a0bce5c5a 100644 --- a/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java +++ b/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java @@ -63,6 +63,9 @@ public class AccessibilityScreenSizeForSetupWizardActivity extends InstrumentedA int SCREEN_SIZE = 2; } + // Keep the last height of the scroll view in the {@link GlifLayout} + private int mLastScrollViewHeight; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -143,11 +146,13 @@ public class AccessibilityScreenSizeForSetupWizardActivity extends InstrumentedA * Scrolls to bottom while {@link ScrollView} layout changed. */ private void scrollToBottom() { + mLastScrollViewHeight = 0; final GlifLayout layout = findViewById(R.id.setup_wizard_layout); final ScrollView scrollView = layout.getScrollView(); scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { final int scrollViewHeight = scrollView.getHeight(); - if (scrollViewHeight > 0) { + if (scrollViewHeight > 0 && scrollViewHeight != mLastScrollViewHeight) { + mLastScrollViewHeight = scrollViewHeight; scrollView.post(() -> { // Here is no need to show the scrolling animation. So disabled first and // then enabled it after scrolling finished. From eb70b243f7547b51b28be444648347248177fc6d Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 12 Nov 2021 22:50:12 +0800 Subject: [PATCH 05/14] Fix the CtsVerifier issue - The "android.settings.WIFI_SETTINGS" intent-filter needs to be the first element of the intent-filter in the activity for profile intent filters - Redirect the "android.settings.WIFI_SETTINGS" action to Internet Settings via FRAGMENT_CLASS meta-data - Add PRIMARY_PROFILE_CONTROLLED meta-data to WifiSettings2Activity - Remove unnecessary WifiSettings2Activity from Settings.java Bug: 205258444 Test: manual test - Long press the Internet Tile in QS for WIFI_SETTINGS action testing - Use adb command to test the shortcut action adb shell am start com.android.settings/.Settings\\\$WifiSettings2Activity Change-Id: I9ac397828edf1083efcf790eb41b3e978ed6bdca --- AndroidManifest.xml | 34 ++++++++++++++------------ src/com/android/settings/Settings.java | 1 - 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e4e1a10d293..afaf0466c8e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -305,12 +305,16 @@ android:icon="@drawable/ic_homepage_network" android:exported="true" android:configChanges="orientation|keyboardHidden|screenSize"> + + + + + android:value="com.android.settings.network.NetworkProviderSettings"/> + android:value="@string/menu_key_network"/> + android:value="true"/> @@ -321,9 +325,11 @@ android:icon="@drawable/ic_homepage_network" android:exported="true"> + android:value="com.android.settings.network.NetworkProviderSettings"/> + android:value="@string/menu_key_network"/> + - - + + - - - - - - + + + android:value="com.android.settings.network.NetworkProviderSettings"/> + android:value="@string/menu_key_network"/> + android:value="true"/> Date: Mon, 15 Nov 2021 12:38:57 +0800 Subject: [PATCH 06/14] Device do network scan after user rotates NetworkSelection page To avoid to do oncreate when device is rotated or the screenSize changed. Adding the activity's android:configChanges as "orientation|keyboard|keyboardHidden|screenSize|screenLayout |smallestScreenSize". (Based on SettingsHomepageActivity's settings and the smallestScreenSize is for screensize changed on different display.) Bug: 204039043 Test: atest AutoSelectPreferenceControllerTest (pass) atest OpenNetworkSelectPagePreferenceControllerTest (pass) atest NetworkSelectSettingsTest (pass) Change-Id: I6aa009fc52a85024a29bf48a3e7d1aadcab067d8 --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 638340e4498..4967adabd52 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -191,6 +191,7 @@ Date: Mon, 15 Nov 2021 04:50:25 +0000 Subject: [PATCH 07/14] Revert "Device do network scan after user rotates NetworkSelection page" This reverts commit f54ead1f9491b24db80c4ae52afcbd22dd34452e. Reason for revert: using another way. ag/16259258 Change-Id: I4ae695237cb3417cb3d08fcbb3354dc649681aab --- AndroidManifest.xml | 15 ---------- res/xml/mobile_network_settings.xml | 1 + src/com/android/settings/Settings.java | 1 - .../core/gateway/SettingsGateway.java | 3 -- .../telephony/NetworkSelectSettings.java | 17 ++--------- .../gsm/AutoSelectPreferenceController.java | 28 +++++++++--------- ...NetworkSelectPagePreferenceController.java | 29 ++++++++++++++----- .../telephony/NetworkSelectSettingsTest.java | 9 +++--- 8 files changed, 44 insertions(+), 59 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a41c89a58db..a471504d77c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -234,11 +234,6 @@ android:exported="true" android:launchMode="singleTask" android:configChanges="orientation|screenSize|keyboardHidden"> - @@ -350,16 +345,6 @@ android:value="true" /> - - - - - diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 6dd5a2ec5e5..4de795c41b5 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -91,7 +91,6 @@ public class Settings extends SettingsActivity { public static class WifiSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiSettings2Activity extends SettingsActivity { /* empty */ } public static class NetworkProviderSettingsActivity extends SettingsActivity { /* empty */ } - public static class NetworkSelectActivity extends SettingsActivity { /* empty */ } /** Activity for the Wi-Fi network details settings. */ public static class WifiDetailsSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiP2pSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index a9f8e3107af..3c594a714c0 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -119,7 +119,6 @@ import com.android.settings.network.NetworkDashboardFragment; import com.android.settings.network.NetworkProviderSettings; import com.android.settings.network.apn.ApnEditor; import com.android.settings.network.apn.ApnSettings; -import com.android.settings.network.telephony.NetworkSelectSettings; import com.android.settings.nfc.AndroidBeam; import com.android.settings.nfc.PaymentSettings; import com.android.settings.notification.ConfigureNotificationSettings; @@ -319,7 +318,6 @@ public class SettingsGateway { InteractAcrossProfilesDetails.class.getName(), MediaControlsSettings.class.getName(), NetworkProviderSettings.class.getName(), - NetworkSelectSettings.class.getName(), AlarmsAndRemindersDetails.class.getName(), MediaManagementAppsDetails.class.getName() }; @@ -343,7 +341,6 @@ public class SettingsGateway { Settings.WifiSettingsActivity.class.getName(), Settings.DataUsageSummaryActivity.class.getName(), Settings.NetworkProviderSettingsActivity.class.getName(), - Settings.NetworkSelectActivity.class.getName(), // Home page > Connected devices Settings.BluetoothSettingsActivity.class.getName(), Settings.WifiDisplaySettingsActivity.class.getName(), diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 67d3171e3d6..c72c18ddd63 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -19,7 +19,6 @@ package com.android.settings.network.telephony; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -102,7 +101,7 @@ public class NetworkSelectSettings extends DashboardFragment { @VisibleForTesting protected void onCreateInitialization() { mUseNewApi = enableNewAutoSelectNetworkUI(getContext()); - mSubId = getSubId(); + mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID); mPreferenceCategory = getPreferenceCategory(PREF_KEY_NETWORK_OPERATORS); mStatusMessagePreference = new Preference(getContext()); @@ -121,7 +120,7 @@ public class NetworkSelectSettings extends DashboardFragment { mMetricsFeatureProvider = getMetricsFeatureProvider(getContext()); mIsAggregationEnabled = enableAggregation(getContext()); Log.d(TAG, "init: mUseNewApi:" + mUseNewApi - + " ,mIsAggregationEnabled:" + mIsAggregationEnabled + " ,mSubId:" + mSubId); + + " ,mIsAggregationEnabled:" + mIsAggregationEnabled); } @Keep @@ -175,18 +174,6 @@ public class NetworkSelectSettings extends DashboardFragment { getPreferenceScreen().setEnabled(enable); } - @Keep - @VisibleForTesting - protected int getSubId() { - int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - Intent intent = getActivity().getIntent(); - if (intent != null) { - subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, - SubscriptionManager.INVALID_SUBSCRIPTION_ID); - } - return subId; - } - @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java index 028c4e77a78..997235c8a0c 100644 --- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java @@ -20,8 +20,9 @@ import static androidx.lifecycle.Lifecycle.Event.ON_START; import static androidx.lifecycle.Lifecycle.Event.ON_STOP; import android.app.ProgressDialog; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.Intent; +import android.os.Bundle; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; @@ -42,8 +43,10 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.settings.R; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.network.AllowedNetworkTypesListener; import com.android.settings.network.telephony.MobileNetworkUtils; +import com.android.settings.network.telephony.NetworkSelectSettings; import com.android.settings.network.telephony.TelephonyTogglePreferenceController; import com.android.settingslib.utils.ThreadUtils; @@ -148,26 +151,25 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon public boolean setChecked(boolean isChecked) { if (isChecked) { setAutomaticSelectionMode(); + return false; } else { - if (mSwitchPreference != null) { - Intent intent = new Intent(); - intent.setClassName("com.android.settings", - "com.android.settings.Settings$NetworkSelectActivity"); - intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); - mSwitchPreference.setIntent(intent); - } + final Bundle bundle = new Bundle(); + bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); + new SubSettingLauncher(mContext) + .setDestination(NetworkSelectSettings.class.getName()) + .setSourceMetricsCategory(SettingsEnums.MOBILE_NETWORK_SELECT) + .setTitleRes(R.string.choose_network_title) + .setArguments(bundle) + .launch(); + return false; } - return false; } @VisibleForTesting Future setAutomaticSelectionMode() { final long startMillis = SystemClock.elapsedRealtime(); showAutoSelectProgressBar(); - if (mSwitchPreference != null) { - mSwitchPreference.setIntent(null); - mSwitchPreference.setEnabled(false); - } + mSwitchPreference.setEnabled(false); return ThreadUtils.postOnBackgroundThread(() -> { // set network selection mode in background mTelephonyManager.setNetworkSelectionModeAutomatic(); diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java index 54f5ce15d72..4047009b325 100644 --- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java @@ -19,12 +19,14 @@ package com.android.settings.network.telephony.gsm; import static androidx.lifecycle.Lifecycle.Event.ON_START; import static androidx.lifecycle.Lifecycle.Event.ON_STOP; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.Intent; +import android.os.Bundle; import android.provider.Settings; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.text.TextUtils; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; @@ -33,8 +35,10 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.network.AllowedNetworkTypesListener; import com.android.settings.network.telephony.MobileNetworkUtils; +import com.android.settings.network.telephony.NetworkSelectSettings; import com.android.settings.network.telephony.TelephonyBasePreferenceController; /** @@ -98,12 +102,6 @@ public class OpenNetworkSelectPagePreferenceController extends super.updateState(preference); preference.setEnabled(mTelephonyManager.getNetworkSelectionMode() != TelephonyManager.NETWORK_SELECTION_MODE_AUTO); - - Intent intent = new Intent(); - intent.setClassName("com.android.settings", - "com.android.settings.Settings$NetworkSelectActivity"); - intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); - preference.setIntent(intent); } @Override @@ -116,6 +114,23 @@ public class OpenNetworkSelectPagePreferenceController extends } } + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (TextUtils.equals(preference.getKey(), getPreferenceKey())) { + final Bundle bundle = new Bundle(); + bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); + new SubSettingLauncher(mContext) + .setDestination(NetworkSelectSettings.class.getName()) + .setSourceMetricsCategory(SettingsEnums.MOBILE_NETWORK_SELECT) + .setTitleRes(R.string.choose_network_title) + .setArguments(bundle) + .launch(); + return true; + } + + return false; + } + public OpenNetworkSelectPagePreferenceController init(Lifecycle lifecycle, int subId) { mSubId = subId; mTelephonyManager = mContext.getSystemService(TelephonyManager.class) diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java index 6dbc4c9099e..391839cda50 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java @@ -122,6 +122,10 @@ public class NetworkSelectSettingsTest { public TargetClass(NetworkSelectSettingsTest env) { mTestEnv = env; + + Bundle bundle = new Bundle(); + bundle.putInt(Settings.EXTRA_SUB_ID, SUB_ID); + setArguments(bundle); } @Override @@ -180,11 +184,6 @@ public class NetworkSelectSettingsTest { protected boolean enableAggregation(Context context) { return mTestEnv.mIsAggregationEnabled; } - - @Override - protected int getSubId() { - return SUB_ID; - } } @Test From 4d00bce2b236fe8e51041e155db74c72511d0a5c Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Mon, 15 Nov 2021 22:22:19 +0800 Subject: [PATCH 08/14] Lost the registered cellinfo item after the aggregation Bug: 204384218 Test: atest NetworkSelectSettingsTest Change-Id: I8a1af6eadd5852788a5455dd637e1c63316bb802 Merged-In: I163ab8e966de57ddff7939a46fc47b05bea029e3 --- .../network/telephony/NetworkSelectSettings.java | 12 ++++++++++-- .../telephony/NetworkSelectSettingsTest.java | 13 +++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 813cc745680..c1c0f8f0dbd 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -50,6 +50,7 @@ import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -326,12 +327,19 @@ public class NetworkSelectSettings extends DashboardFragment { CellInfoUtil.getCellIdentityMccMnc(cellInfo.getCellIdentity())); Class className = cellInfo.getClass(); - if (aggregatedList.stream().anyMatch( + Optional itemInTheList = aggregatedList.stream().filter( item -> { String itemPlmn = CellInfoUtil.getNetworkTitle(item.getCellIdentity(), CellInfoUtil.getCellIdentityMccMnc(item.getCellIdentity())); return itemPlmn.equals(plmn) && item.getClass().equals(className); - })) { + }) + .findFirst(); + if (itemInTheList.isPresent()) { + if (cellInfo.isRegistered() && !itemInTheList.get().isRegistered()) { + // Adding the registered cellinfo item into list. If there are two registered + // cellinfo items, then select first one from source list. + aggregatedList.set(aggregatedList.indexOf(itemInTheList.get()), cellInfo); + } continue; } aggregatedList.add(cellInfo); diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java index 47e3ad903d6..02b8706843a 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java @@ -166,6 +166,19 @@ public class NetworkSelectSettingsTest { assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); } + @Test + public void doAggregation_hasDuplicateItemsDiffMccMncCase3_removeSamePlmnRatItem() { + List testList = Arrays.asList( + createLteCellInfo(false, 123, "123", "232", "CarrierA"), + createLteCellInfo(false, 124, "123", "233", "CarrierA"), + createLteCellInfo(true, 125, "123", "234", "CarrierA"), + createGsmCellInfo(false, 126, "456", "232", "CarrierA")); + List expected = Arrays.asList( + createLteCellInfo(true, 125, "123", "234", "CarrierA"), + createGsmCellInfo(false, 126, "456", "232", "CarrierA")); + assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); + } + private CellInfoLte createLteCellInfo(boolean registered, int cellId, String mcc, String mnc, String plmnName) { CellIdentityLte cil = new CellIdentityLte( From 68b861930a601f92ebad6b12a70077a3e248a92c Mon Sep 17 00:00:00 2001 From: Gary Jian Date: Mon, 15 Nov 2021 19:10:44 +0800 Subject: [PATCH 09/14] Added KEY_VONR_ENABLED_BOOL to obtain VoNR availability status Bug: 205809218 Test: atest NrAdvancedCallingPreferenceControllerTest Change-Id: I45ac1e95d669801c2d37f49943d7c16cfb7adae3 --- ...NrAdvancedCallingPreferenceController.java | 10 +++++- ...vancedCallingPreferenceControllerTest.java | 31 +++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java index 7615fe339bc..b585ecec6a4 100644 --- a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java @@ -46,6 +46,7 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer Preference mPreference; private TelephonyManager mTelephonyManager; private PhoneCallStateTelephonyCallback mTelephonyCallback; + private boolean mIsVonrEnabledFromCarrierConfig = false; private boolean mIsVonrVisibleFromCarrierConfig = false; private boolean mIsNrEnableFromCarrierConfig = false; private boolean mHas5gCapability = false; @@ -83,6 +84,9 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer if (carrierConfig == null) { return this; } + mIsVonrEnabledFromCarrierConfig = carrierConfig.getBoolean( + CarrierConfigManager.KEY_VONR_ENABLED_BOOL); + mIsVonrVisibleFromCarrierConfig = carrierConfig.getBoolean( CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL); @@ -92,6 +96,7 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer Log.d(TAG, "mHas5gCapability: " + mHas5gCapability + ",mIsNrEnabledFromCarrierConfig: " + mIsNrEnableFromCarrierConfig + + ",mIsVonrEnabledFromCarrierConfig: " + mIsVonrEnabledFromCarrierConfig + ",mIsVonrVisibleFromCarrierConfig: " + mIsVonrVisibleFromCarrierConfig); return this; } @@ -100,7 +105,10 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer public int getAvailabilityStatus(int subId) { init(subId); - if (mHas5gCapability && mIsNrEnableFromCarrierConfig && mIsVonrVisibleFromCarrierConfig) { + if (mHas5gCapability + && mIsNrEnableFromCarrierConfig + && mIsVonrEnabledFromCarrierConfig + && mIsVonrVisibleFromCarrierConfig) { return AVAILABLE; } return CONDITIONALLY_UNAVAILABLE; diff --git a/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java index 9eb67df96ca..fac777232f0 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java @@ -80,7 +80,8 @@ public class NrAdvancedCallingPreferenceControllerTest { mTelephonyManager).setVoNrEnabled(anyBoolean()); mCarrierConfig = new PersistableBundle(); doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false); + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false); + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true); mCarrierConfig.putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY, new int[]{1, 2}); @@ -92,7 +93,8 @@ public class NrAdvancedCallingPreferenceControllerTest { } @Test - public void getAvailabilityStatus_vonrDisabled_returnUnavailable() { + public void getAvailabilityStatus_vonrEnabledAndVisibleDisable_returnUnavailable() { + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, true); mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false); mController.init(SUB_ID); @@ -102,7 +104,30 @@ public class NrAdvancedCallingPreferenceControllerTest { } @Test - public void getAvailabilityStatus_vonrEnabled_returnAvailable() { + public void getAvailabilityStatus_vonrDisabledAndVisibleDisable_returnUnavailable() { + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false); + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false); + + mController.init(SUB_ID); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_vonrDisabledAndVisibleEnable_returnUnavailable() { + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false); + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true); + + mController.init(SUB_ID); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_vonrEnabledAndVisibleEnable_returnAvailable() { + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, true); mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true); mController.init(SUB_ID); From 3cb6a7a705ee17cda0c36287c212f33190645cc9 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 16 Nov 2021 22:10:23 +0800 Subject: [PATCH 10/14] [Settings] Avoid from dialog disappear when click outside Avoid dialog from unexpected close when click out of dialog area. This create better user experience since user might not click to the correct area all the time. Bug: 204020202 Test: local Change-Id: Ice5cde73eb849f3e5722ab778be41615746210c0 --- .../settings/datausage/BillingCycleSettings.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 8c433a061a6..57931c1b36b 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -271,12 +271,14 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements mView = dialogInflater.inflate(R.layout.data_usage_bytes_editor, null, false); setupPicker((EditText) mView.findViewById(R.id.bytes), (Spinner) mView.findViewById(R.id.size_spinner)); - return new AlertDialog.Builder(context) + Dialog dialog = new AlertDialog.Builder(context) .setTitle(isLimit ? R.string.data_usage_limit_editor_title : R.string.data_usage_warning_editor_title) .setView(mView) .setPositiveButton(R.string.data_usage_cycle_editor_positive, this) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } private void setupPicker(EditText bytesPicker, Spinner type) { @@ -402,10 +404,12 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements mCycleDayPicker.setValue(cycleDay); mCycleDayPicker.setWrapSelectorWheel(true); - return builder.setTitle(R.string.data_usage_cycle_editor_title) + Dialog dialog = builder.setTitle(R.string.data_usage_cycle_editor_title) .setView(view) .setPositiveButton(R.string.data_usage_cycle_editor_positive, this) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } @Override @@ -466,12 +470,14 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements public Dialog onCreateDialog(Bundle savedInstanceState) { final Context context = getActivity(); - return new AlertDialog.Builder(context) + Dialog dialog = new AlertDialog.Builder(context) .setTitle(R.string.data_usage_limit_dialog_title) .setMessage(R.string.data_usage_limit_dialog_mobile) .setPositiveButton(android.R.string.ok, this) .setNegativeButton(android.R.string.cancel, null) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } @Override From baacfd79859c702375f35e63da9823007a30e912 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Tue, 16 Nov 2021 11:48:13 -0800 Subject: [PATCH 11/14] Use different exceptions for different crash reasons Always throwing RemoteServiceException would make it impossible to tell the cause of a crash without the string message. Let's use a different exception type so developers can cluster crashes without the exception message. Bug: 124137635 Test: Treehugger Change-Id: Ibae57bdb1b8965241c41249a89c728d224e4e995 --- src/com/android/settings/password/PasswordUtils.java | 8 +++++--- .../android/settings/password/SetNewPasswordActivity.java | 4 +++- .../android/settings/password/SetupChooseLockGeneric.java | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/password/PasswordUtils.java b/src/com/android/settings/password/PasswordUtils.java index 5b75033f0f2..e8e309c40ec 100644 --- a/src/com/android/settings/password/PasswordUtils.java +++ b/src/com/android/settings/password/PasswordUtils.java @@ -79,18 +79,20 @@ public final class PasswordUtils extends com.android.settingslib.Utils { } /** Crashes the calling application and provides it with {@code message}. */ - public static void crashCallingApplication(IBinder activityToken, String message) { + public static void crashCallingApplication(IBinder activityToken, String message, + int exceptionTypeId) { IActivityManager am = ActivityManager.getService(); try { int uid = am.getLaunchedFromUid(activityToken); int userId = UserHandle.getUserId(uid); - am.crashApplication( + am.crashApplicationWithType( uid, /* initialPid= */ -1, getCallingAppPackageName(activityToken), userId, message, - false); + false, + exceptionTypeId); } catch (RemoteException e) { Log.v(TAG, "Could not talk to activity manager.", e); } diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java index 22825872128..fc664eccde1 100644 --- a/src/com/android/settings/password/SetNewPasswordActivity.java +++ b/src/com/android/settings/password/SetNewPasswordActivity.java @@ -29,6 +29,7 @@ import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_I import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import android.app.Activity; +import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.PasswordMetrics; @@ -101,7 +102,8 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo PasswordUtils.crashCallingApplication(activityToken, "Must have permission " + REQUEST_PASSWORD_COMPLEXITY + " to use extra " - + EXTRA_PASSWORD_COMPLEXITY); + + EXTRA_PASSWORD_COMPLEXITY, + MissingRequestPasswordComplexityPermissionException.TYPE_ID); finish(); return; } diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java index 3261b81083b..968af3232f8 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -21,6 +21,7 @@ import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; +import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -79,7 +80,8 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric { if (!hasPermission) { PasswordUtils.crashCallingApplication(activityToken, "Must have permission " + REQUEST_PASSWORD_COMPLEXITY - + " to use extra " + EXTRA_PASSWORD_COMPLEXITY); + + " to use extra " + EXTRA_PASSWORD_COMPLEXITY, + MissingRequestPasswordComplexityPermissionException.TYPE_ID); finish(); return; } From 7dff8c7210c2af64ffb10ab4c7005a5c192c036a Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 16 Nov 2021 22:10:23 +0800 Subject: [PATCH 12/14] [Settings] Avoid from dialog disappear when click outside Avoid dialog from unexpected close when click out of dialog area. This create better user experience since user might not click to the correct area all the time. Bug: 204020202 Test: local Change-Id: Ice5cde73eb849f3e5722ab778be41615746210c0 (cherry picked from commit 3cb6a7a705ee17cda0c36287c212f33190645cc9) --- .../settings/datausage/BillingCycleSettings.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 8c433a061a6..57931c1b36b 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -271,12 +271,14 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements mView = dialogInflater.inflate(R.layout.data_usage_bytes_editor, null, false); setupPicker((EditText) mView.findViewById(R.id.bytes), (Spinner) mView.findViewById(R.id.size_spinner)); - return new AlertDialog.Builder(context) + Dialog dialog = new AlertDialog.Builder(context) .setTitle(isLimit ? R.string.data_usage_limit_editor_title : R.string.data_usage_warning_editor_title) .setView(mView) .setPositiveButton(R.string.data_usage_cycle_editor_positive, this) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } private void setupPicker(EditText bytesPicker, Spinner type) { @@ -402,10 +404,12 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements mCycleDayPicker.setValue(cycleDay); mCycleDayPicker.setWrapSelectorWheel(true); - return builder.setTitle(R.string.data_usage_cycle_editor_title) + Dialog dialog = builder.setTitle(R.string.data_usage_cycle_editor_title) .setView(view) .setPositiveButton(R.string.data_usage_cycle_editor_positive, this) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } @Override @@ -466,12 +470,14 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements public Dialog onCreateDialog(Bundle savedInstanceState) { final Context context = getActivity(); - return new AlertDialog.Builder(context) + Dialog dialog = new AlertDialog.Builder(context) .setTitle(R.string.data_usage_limit_dialog_title) .setMessage(R.string.data_usage_limit_dialog_mobile) .setPositiveButton(android.R.string.ok, this) .setNegativeButton(android.R.string.cancel, null) .create(); + dialog.setCanceledOnTouchOutside(false); + return dialog; } @Override From 13a52a081e071ab2645ee859b8539f5e1fee4d48 Mon Sep 17 00:00:00 2001 From: ykhung Date: Thu, 4 Nov 2021 15:55:23 +0800 Subject: [PATCH 13/14] Update "Mobile network standby" attribute label into "Mobile network" Bug: 205051643 Test: make SettingsRoboTests Change-Id: Ia8f5c3e76d72ffa6fd0601c58b1b3d157b711b30 (cherry picked from commit 22dc875ba763d528df7e5f4d64008bb1939cfc19) --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 133b98392be..cc12254455b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6327,8 +6327,8 @@ Wi\u2011Fi Bluetooth - - Mobile network standby + + Mobile network Voice calls From cb4836b4868adc1f06212ce82851a5f16169ab5c Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Mon, 15 Nov 2021 08:27:16 -0500 Subject: [PATCH 14/14] [DO NOT MERGE] Allow a settings override for double-line clock This setting allows users to always show a single-line format clock, regardless of notification status. Fixes: 194905512 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.display Change-Id: I94ade1b2d968e5783750e7a98a9a5d28cc22b659 --- res/values/strings.xml | 4 + res/xml/security_lockscreen_settings.xml | 6 ++ .../LockscreenClockPreferenceController.java | 70 +++++++++++++++ ...ckscreenClockPreferenceControllerTest.java | 90 +++++++++++++++++++ 4 files changed, 170 insertions(+) create mode 100644 src/com/android/settings/display/LockscreenClockPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/display/LockscreenClockPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 2048d5cc20d..7262171e5b4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -13289,6 +13289,10 @@ Show device controls Access controls when locked + + Show double-line clock when available + + Double-line clock diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml index 82cb8609114..19a1a4cbba2 100644 --- a/res/xml/security_lockscreen_settings.xml +++ b/res/xml/security_lockscreen_settings.xml @@ -56,6 +56,12 @@ android:title="@string/lockscreen_privacy_controls_setting_toggle" android:summary="@string/lockscreen_privacy_controls_summary" settings:controller="com.android.settings.display.ControlsPrivacyPreferenceController" /> + +