From 0e03586ddae90d5a1481e28ec1f3e8d258743535 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 14 Nov 2022 10:06:48 +0000 Subject: [PATCH 01/22] [Settings] configuration for hidding SIM provider UI Hide SIM provider UI based on configuraion. Bug: 240515161 Test: test cases and local testing Merged-In: I1cb83787dc1ac1d61bb6bed6aa9c5e7a3ad6e69b Change-Id: Ibe22c3ba377a15f770622d235ebddc63b4bf3ed6 --- res/xml/network_provider_internet.xml | 3 +++ res/xml/network_provider_settings.xml | 1 + .../network/MobileNetworkSummaryController.java | 3 ++- .../network/NetworkProviderCallsSmsController.java | 3 ++- .../network/NetworkProviderCallsSmsFragment.java | 3 ++- .../settings/network/NetworkProviderSettings.java | 11 +++++++++++ .../settings/network/NetworkProviderSettingsTest.java | 5 ++++- 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index 07e797a07c1..c9c576e6b1b 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -37,6 +37,7 @@ android:icon="@drawable/ic_calls_sms" android:order="-20" android:summary="@string/summary_placeholder" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:allowDividerBelow="true" settings:keywords="@string/calls_and_sms" settings:useAdminDisabledSummary="true" /> @@ -49,6 +50,7 @@ android:order="-15" settings:keywords="@string/keywords_more_mobile_networks" settings:userRestriction="no_config_mobile_networks" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:allowDividerAbove="true" settings:useAdminDisabledSummary="true" /> @@ -66,6 +68,7 @@ android:persistent="false" android:order="19" settings:userRestriction="no_config_mobile_networks" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:useAdminDisabledSummary="true" /> Date: Mon, 14 Nov 2022 10:19:27 +0000 Subject: [PATCH 02/22] [Settings] configuration for hidding SIM remove UI Hide SIM remove UI based on configuraion. Bug: 240515161 Test: test cases and local testing Merged-In: Iea40b89733cc75a41f960fecb2ac24177a4cbd3d Change-Id: I8f0c1d53c4fe6e30280f2b7ae8f694cd27056e36 --- res/xml/reset_dashboard_fragment.xml | 1 + src/com/android/settings/MainClear.java | 11 ++++++++++- src/com/android/settings/ResetNetwork.java | 6 ++++++ .../settings/network/EraseEuiccDataController.java | 3 ++- .../src/com/android/settings/MainClearTest.java | 5 ++++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml index 9497c8fe7d7..25161a5a66d 100644 --- a/res/xml/reset_dashboard_fragment.xml +++ b/res/xml/reset_dashboard_fragment.xml @@ -37,6 +37,7 @@ diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index 2b0f01036ea..1434d7216a9 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -64,6 +64,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.core.InstrumentedFragment; import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; +import com.android.settings.network.SubscriptionUtil; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; import com.android.settingslib.RestrictedLockUtilsInternal; @@ -381,6 +382,14 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(this); } + /** + * Whether to show any UI which is SIM related. + */ + @VisibleForTesting + boolean showAnySubscriptionInfo(Context context) { + return (context != null) && SubscriptionUtil.isSimHardwareVisible(context); + } + /** * Whether to show strings indicating that the eUICC will be wiped. * @@ -390,7 +399,7 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis @VisibleForTesting boolean showWipeEuicc() { Context context = getContext(); - if (!isEuiccEnabled(context)) { + if (!showAnySubscriptionInfo(context) || !isEuiccEnabled(context)) { return false; } ContentResolver cr = context.getContentResolver(); diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index 7e58c0b9808..224ba13b9dc 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -239,6 +239,9 @@ public class ResetNetwork extends InstrumentedFragment { } private List getActiveSubscriptionInfoList() { + if (!SubscriptionUtil.isSimHardwareVisible(getActivity())) { + return Collections.emptyList(); + } SubscriptionManager mgr = getActivity().getSystemService(SubscriptionManager.class); if (mgr == null) { Log.w(TAG, "No SubscriptionManager"); @@ -264,6 +267,9 @@ public class ResetNetwork extends InstrumentedFragment { } private boolean showEuiccSettings(Context context) { + if (!SubscriptionUtil.isSimHardwareVisible(context)) { + return false; + } EuiccManager euiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE); if (!euiccManager.isEnabled()) { diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java index b1f964b2190..091b6d7748c 100644 --- a/src/com/android/settings/network/EraseEuiccDataController.java +++ b/src/com/android/settings/network/EraseEuiccDataController.java @@ -51,7 +51,8 @@ public class EraseEuiccDataController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return mContext.getPackageManager().hasSystemFeature( + return SubscriptionUtil.isSimHardwareVisible(mContext) && + mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_TELEPHONY_EUICC) ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java index ec33fadfd02..9795092a657 100644 --- a/tests/robotests/src/com/android/settings/MainClearTest.java +++ b/tests/robotests/src/com/android/settings/MainClearTest.java @@ -102,7 +102,10 @@ public class MainClearTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mMainClear = spy(new MainClear()); + mMainClear = spy(new MainClear() { + @Override + boolean showAnySubscriptionInfo(Context context) { return true; } + }); mActivity = Robolectric.setupActivity(FragmentActivity.class); mShadowActivity = Shadows.shadowOf(mActivity); UserManager userManager = mActivity.getSystemService(UserManager.class); From 3be07f0e15d3f08704fecfdec13d5f1839af0e64 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 14 Nov 2022 10:24:43 +0000 Subject: [PATCH 03/22] [Settings] configuration for hidding SIM settings UI Hide SIM settings UI based on configuraion. Bug: 240515161 Test: test cases and local testing Merged-In: If1df99a79e51125d03f534cdfc9408b01c61024f Change-Id: I3d6ecec1465189429f2a3ea026d15e23357d0832 --- .../settings/network/MobileNetworkListFragment.java | 7 ++++++- .../network/telephony/MobileNetworkSettings.java | 7 ++++++- .../settings/network/telephony/MobileNetworkUtils.java | 7 +++++++ .../network/MobileNetworkListFragmentTest.java | 10 ++++++++++ .../network/telephony/MobileNetworkSettingsTest.java | 8 ++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java index 7881690e106..ea7031ae132 100644 --- a/src/com/android/settings/network/MobileNetworkListFragment.java +++ b/src/com/android/settings/network/MobileNetworkListFragment.java @@ -60,6 +60,10 @@ public class MobileNetworkListFragment extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { final List controllers = new ArrayList<>(); + if (!SubscriptionUtil.isSimHardwareVisible(getContext())) { + finish(); + return controllers; + } NetworkProviderSimsCategoryController simCategoryPrefCtrl = new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM, @@ -88,7 +92,8 @@ public class MobileNetworkListFragment extends DashboardFragment { @Override protected boolean isPageSearchEnabled(Context context) { - return context.getSystemService(UserManager.class).isAdminUser(); + return SubscriptionUtil.isSimHardwareVisible(context) && + context.getSystemService(UserManager.class).isAdminUser(); } }; } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 94b6aaf1bcc..05e58e96ed7 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -120,6 +120,10 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { @Override protected List createPreferenceControllers(Context context) { + if (!SubscriptionUtil.isSimHardwareVisible(context)) { + finish(); + return Arrays.asList(); + } if (getArguments() == null) { Intent intent = getIntent(); if (intent != null) { @@ -398,7 +402,8 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { /** suppress full page if user is not admin */ @Override protected boolean isPageSearchEnabled(Context context) { - return context.getSystemService(UserManager.class).isAdminUser(); + return SubscriptionUtil.isSimHardwareVisible(context) && + context.getSystemService(UserManager.class).isAdminUser(); } }; diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java index 839a98cdb32..d44eadace08 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -261,6 +261,9 @@ public class MobileNetworkUtils { * the user has enabled development mode. */ public static boolean showEuiccSettings(Context context) { + if (!SubscriptionUtil.isSimHardwareVisible(context)) { + return false; + } long timeForAccess = SystemClock.elapsedRealtime(); try { Boolean isShow = ((Future) ThreadUtils.postOnBackgroundThread(() -> { @@ -1010,6 +1013,10 @@ public class MobileNetworkUtils { } public static void launchMobileNetworkSettings(Context context, SubscriptionInfo info) { + if (!SubscriptionUtil.isSimHardwareVisible(context)) { + Log.e(TAG, "launchMobileNetworkSettings fail, device without such UI."); + return; + } final int subId = info.getSubscriptionId(); if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { Log.d(TAG, "launchMobileNetworkSettings fail, subId is invalid."); diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java index fd2b520929f..2e04ea751f0 100644 --- a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java +++ b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java @@ -21,8 +21,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.res.Resources; import android.os.UserManager; +import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import org.junit.Before; @@ -38,6 +40,8 @@ public class MobileNetworkListFragmentTest { @Mock private Context mContext; @Mock + private Resources mResources; + @Mock private UserManager mUserManager; private MobileNetworkListFragment mFragment; @@ -55,6 +59,9 @@ public class MobileNetworkListFragmentTest { final BaseSearchIndexProvider provider = (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER; + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); + final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled", ReflectionHelpers.ClassParameter.from(Context.class, mContext)); final boolean isEnabled = (Boolean) obj; @@ -69,6 +76,9 @@ public class MobileNetworkListFragmentTest { final BaseSearchIndexProvider provider = (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER; + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); + final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled", ReflectionHelpers.ClassParameter.from(Context.class, mContext)); final boolean isEnabled = (Boolean) obj; diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java index 44611cec616..3e219a412ce 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.app.usage.NetworkStatsManager; import android.content.Context; +import android.content.res.Resources; import android.net.NetworkPolicyManager; import android.os.Bundle; import android.os.UserManager; @@ -37,6 +38,7 @@ import android.telephony.TelephonyManager; import androidx.fragment.app.FragmentActivity; +import com.android.settings.R; import com.android.settings.datausage.DataUsageSummaryPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; @@ -68,12 +70,18 @@ public class MobileNetworkSettingsTest { private FragmentActivity mActivity; private Context mContext; + private Resources mResources; private MobileNetworkSettings mFragment; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); + when(mActivity.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager); From f2838421df7061ec8b4c3837ee535be9b05fbe87 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 14 Nov 2022 09:39:22 +0000 Subject: [PATCH 04/22] [Settings] configuration for hidding SIM lock UI Hide SIM lock UI based on configuraion. Bug: 240515161 Test: test cases and local testing Merged-In: I870c0b53112db56b7bc80bfd585f6f7b3cf82737 Change-Id: I70be07dbc1decb5cb8eff384d4cb8bea355ab99d --- res/xml/security_advanced_settings.xml | 2 ++ src/com/android/settings/IccLockSettings.java | 5 ++-- .../security/SimLockPreferenceController.java | 5 ++++ .../SimLockPreferenceControllerTest.java | 24 ++++++++++++++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/res/xml/security_advanced_settings.xml b/res/xml/security_advanced_settings.xml index 6d43fe77451..b36fc73fdd2 100644 --- a/res/xml/security_advanced_settings.xml +++ b/res/xml/security_advanced_settings.xml @@ -64,6 +64,7 @@ android:order="50" android:key="sim_lock_settings" android:title="@string/sim_lock_settings_category" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.security.SimLockPreferenceController"> diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java index 71eb0f20e30..8e54e3196f7 100644 --- a/src/com/android/settings/IccLockSettings.java +++ b/src/com/android/settings/IccLockSettings.java @@ -174,8 +174,9 @@ public class IccLockSettings extends SettingsPreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Utils.isMonkeyRunning()) { - finish(); + if (Utils.isMonkeyRunning() || + !SubscriptionUtil.isSimHardwareVisible(getContext())) { + finishFragment(); return; } diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java index 7cd01732400..8429a9f352c 100644 --- a/src/com/android/settings/security/SimLockPreferenceController.java +++ b/src/com/android/settings/security/SimLockPreferenceController.java @@ -28,6 +28,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.SubscriptionUtil; import java.util.List; @@ -50,6 +51,10 @@ public class SimLockPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { + if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + final List subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java index ef5973c1d5b..f38cc4948d4 100644 --- a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java @@ -22,9 +22,11 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.res.Resources; import android.os.PersistableBundle; import android.os.UserManager; import android.telephony.CarrierConfigManager; @@ -35,6 +37,7 @@ import android.telephony.TelephonyManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import org.junit.Before; @@ -66,6 +69,7 @@ public class SimLockPreferenceControllerTest { private SimLockPreferenceController mController; private Preference mPreference; private Context mContext; + private Resources mResources; @Before public void setUp() { @@ -76,15 +80,28 @@ public class SimLockPreferenceControllerTest { shadowApplication.setSystemService(Context.CARRIER_CONFIG_SERVICE, mCarrierManager); shadowApplication.setSystemService(Context.USER_SERVICE, mUserManager); shadowApplication.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager); - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); + + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); + mController = new SimLockPreferenceController(mContext, "key"); mPreference = new Preference(mContext); mPreference.setKey(mController.getPreferenceKey()); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); } + @Test + public void isAvailable_notShowSimUi_false() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + @Test public void isAvailable_notAdmin_false() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(false); assertThat(mController.getAvailabilityStatus()) @@ -93,6 +110,7 @@ public class SimLockPreferenceControllerTest { @Test public void isAvailable_simIccNotReady_false() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(true); assertThat(mController.getAvailabilityStatus()) @@ -124,6 +142,7 @@ public class SimLockPreferenceControllerTest { @Test public void displayPreference_simReady_enablePreference() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); mController.displayPreference(mScreen); assertThat(mPreference.isEnabled()).isFalse(); @@ -140,12 +159,14 @@ public class SimLockPreferenceControllerTest { @Test public void getPreferenceKey_whenGivenValue_returnsGivenValue() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); mController = new SimLockPreferenceController(mContext, "key"); assertThat(mController.getPreferenceKey()).isEqualTo("key"); } private void setupMockIcc() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); final List subscriptionInfoList = new ArrayList<>(); SubscriptionInfo info = mock(SubscriptionInfo.class); subscriptionInfoList.add(info); @@ -156,6 +177,7 @@ public class SimLockPreferenceControllerTest { } private void setupMockSimReady() { + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); final List subscriptionInfoList = new ArrayList<>(); SubscriptionInfo info = mock(SubscriptionInfo.class); subscriptionInfoList.add(info); From 5c595b378978f8b73dceb9598717bdbd394065a9 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 14 Nov 2022 10:14:57 +0000 Subject: [PATCH 05/22] [Settings] configuration for hidding SIM notification UI Hide SIM notification UI based on configuraion. Bug: 240515161 Test: test cases and local testing Merged-In: I07d9ddeb96ca590decf28126ce97fba4c1783304 Merged-In: I7a912a3393694155d29614d325796e08598985bf Merged-In: I0a7e0e9826a301f2aa0ca34f40b5570f0e384b4f Change-Id: I1b88f0f70f1b7487163849abfce93dbbc35c9ff9 --- src/com/android/settings/sim/SimDialogActivity.java | 6 ++++++ .../android/settings/sim/SimSelectNotification.java | 4 ++++ .../sim/smartForwarding/SmartForwardingActivity.java | 10 +++++++++- .../settings/sim/SimSelectNotificationTest.java | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java index 732277b3d8a..db190d9249b 100644 --- a/src/com/android/settings/sim/SimDialogActivity.java +++ b/src/com/android/settings/sim/SimDialogActivity.java @@ -35,6 +35,7 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import com.android.settings.R; +import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.telephony.SubscriptionActionDialogActivity; import java.util.List; @@ -65,6 +66,11 @@ public class SimDialogActivity extends FragmentActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!SubscriptionUtil.isSimHardwareVisible(this)) { + Log.d(TAG, "Not support on device without SIM."); + finish(); + return; + } getWindow().addSystemFlags( WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); showOrUpdateDialog(); diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java index 5902b926020..c26e8f61841 100644 --- a/src/com/android/settings/sim/SimSelectNotification.java +++ b/src/com/android/settings/sim/SimSelectNotification.java @@ -77,6 +77,10 @@ public class SimSelectNotification extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + if (!SubscriptionUtil.isSimHardwareVisible(context)) { + Log.w(TAG, "Received unexpected intent with null action."); + return; + } String action = intent.getAction(); if (action == null) { diff --git a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java index 217801e5a17..070e65a1d56 100644 --- a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java +++ b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java @@ -38,6 +38,7 @@ import androidx.core.content.ContextCompat; import com.android.settings.R; import com.android.settings.core.SettingsBaseActivity; +import com.android.settings.network.SubscriptionUtil; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -48,6 +49,7 @@ import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.Executors; public class SmartForwardingActivity extends SettingsBaseActivity { + static final String LOG_TAG = SmartForwardingActivity.class.toString(); final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()); @@ -55,6 +57,12 @@ public class SmartForwardingActivity extends SettingsBaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!SubscriptionUtil.isSimHardwareVisible(this)) { + Log.d(LOG_TAG, "Not support on device without SIM."); + finish(); + return; + } + final Toolbar toolbar = findViewById(R.id.action_bar); toolbar.setVisibility(View.VISIBLE); setActionBar(toolbar); @@ -166,4 +174,4 @@ public class SmartForwardingActivity extends SettingsBaseActivity { .create(); mDialog.show(); } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java index 10e291cf2c0..e4c8a63a0be 100644 --- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java +++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java @@ -42,6 +42,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -137,6 +138,7 @@ public class SimSelectNotificationTest { when(mSubInfo.getDisplayName()).thenReturn(mFakeDisplayName); when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mResources.getText(R.string.enable_sending_mms_notification_title)) .thenReturn(mFakeNotificationTitle); when(mResources.getText(R.string.enable_mms_notification_channel_title)) @@ -236,6 +238,9 @@ public class SimSelectNotificationTest { @Test public void onReceivePrimarySubListChange_WithDismissExtra_shouldDismiss() { + doReturn(mExecutor).when(mActivity).getMainExecutor(); + SimDialogProhibitService.supportDismiss(mActivity); + Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED); intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE, EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA); From 7dc161dcc80633af7946e9711dd6d22392ade2ba Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Mon, 14 Nov 2022 09:54:47 +0000 Subject: [PATCH 06/22] [Settings] configuration for hidding SIM related UI Add overriable configuration for hidding SIM related UI. Bug: 240515161 Test: test cases and local testing Merged-In: I03d17beac0fb85a3d17acd7d0d581feb35e9582b Merged-In: I8d7ddd18861a696830da39f040dfb14b9ed46726 Merged-In: I45b7898da440c36045aec64a0a86fb804116cd9d Merged-In: Ie00bdce2fad429f2ed343e1d7aea4967bcaddf5a Change-Id: Id5ea14ca888f0cfc6ed5a7df3f77a8176232ef4f --- res/values/config.xml | 4 ++++ res/xml/my_device_info.xml | 3 +++ .../PhoneNumberPreferenceController.java | 7 +++++- .../imei/ImeiInfoPreferenceController.java | 7 +++++- .../SimStatusPreferenceController.java | 10 ++++++++ .../settings/network/SubscriptionUtil.java | 8 +++++++ .../ImeiInfoPreferenceControllerTest.java | 7 ++++++ .../SimStatusPreferenceControllerTest.java | 7 ++++++ .../network/SubscriptionUtilTest.java | 23 +++++++++++++++++++ 9 files changed, 74 insertions(+), 2 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index c4b7bb931a8..8ae73539574 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -626,4 +626,8 @@ @string/config_settingsintelligence_package_name android.uid.system:1000 + + + true + diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 9165745f472..08d3e6cc928 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -57,6 +57,7 @@ android:order="3" android:title="@string/status_number" android:summary="@string/summary_placeholder" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController" settings:enableCopying="true"/> @@ -98,6 +99,7 @@ android:title="@string/sim_status_title" settings:keywords="@string/keywords_sim_status" android:summary="@string/summary_placeholder" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:enableCopying="true"/> @@ -119,6 +121,7 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_imei_info" settings:enableCopying="true" + settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/> diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java index eb8add5dbe9..f91b98f249e 100644 --- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -29,6 +29,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.DeviceInfoUtils; import java.util.ArrayList; @@ -51,7 +52,8 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return mTelephonyManager.isVoiceCapable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return SubscriptionUtil.isSimHardwareVisible(mContext) ? + AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override @@ -79,6 +81,9 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { + return; + } final Preference preference = screen.findPreference(getPreferenceKey()); final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); mPreferenceList.add(preference); diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java index e90477270e0..9b7359b0c8d 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java @@ -33,6 +33,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.deviceinfo.PhoneNumberSummaryPreference; +import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.Utils; import java.util.ArrayList; @@ -63,6 +64,9 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { + return; + } final Preference preference = screen.findPreference(getPreferenceKey()); final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); @@ -119,7 +123,8 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return mContext.getSystemService(UserManager.class).isAdminUser() + return SubscriptionUtil.isSimHardwareVisible(mContext) && + mContext.getSystemService(UserManager.class).isAdminUser() && !Utils.isWifiOnly(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java index e392bd6cc90..f811d2a86d2 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java @@ -29,6 +29,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; import java.util.ArrayList; @@ -59,9 +60,18 @@ public class SimStatusPreferenceController extends return KEY_SIM_STATUS; } + @Override + public boolean isAvailable() { + return SubscriptionUtil.isSimHardwareVisible(mContext) && + super.isAvailable(); + } + @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { + return; + } final Preference preference = screen.findPreference(getPreferenceKey()); if (!isAvailable() || preference == null || !preference.isVisible()) { return; diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index 0bba86fafed..ccfcfb0a752 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -86,6 +86,14 @@ public class SubscriptionUtil { return subscriptions; } + /** + * Check if SIM hardware is visible to the end user. + */ + public static boolean isSimHardwareVisible(Context context) { + return context.getResources() + .getBoolean(R.bool.config_show_sim_info); + } + @VisibleForTesting static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) { if (slotInfo == null) { diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java index 55194add83d..bae629ced42 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.res.Resources; import android.os.UserManager; import android.telephony.TelephonyManager; @@ -69,12 +70,18 @@ public class ImeiInfoPreferenceControllerTest { private PreferenceCategory mCategory; private Context mContext; + private Resources mResources; private ImeiInfoPreferenceController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); mController = spy(new ImeiInfoPreferenceController(mContext, "imei_info")); mController.setHost(mFragment); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java index 85a6fac765a..4ffaf7ae6ec 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.UserManager; +import android.content.res.Resources; import android.telephony.TelephonyManager; import androidx.fragment.app.Fragment; @@ -64,12 +65,18 @@ public class SimStatusPreferenceControllerTest { private PreferenceCategory mCategory; private Context mContext; + private Resources mResources; private SimStatusPreferenceController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); mController = spy(new SimStatusPreferenceController(mContext, mFragment)); doReturn(true).when(mController).isAvailable(); diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java index 43a32b51fbc..63dca7e88eb 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java @@ -25,11 +25,14 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.res.Resources; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; +import com.android.settings.R; + import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -58,6 +61,8 @@ public class SubscriptionUtilTest { private SubscriptionManager mSubMgr; @Mock private TelephonyManager mTelMgr; + @Mock + private Resources mResources; @Before @@ -443,4 +448,22 @@ public class SubscriptionUtilTest { public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() { assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse(); } + + @Test + public void isSimHardwareVisible_configAsInvisible_returnFalse() { + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)) + .thenReturn(false); + + assertThat(SubscriptionUtil.isSimHardwareVisible(mContext)).isFalse(); + } + + @Test + public void isSimHardwareVisible_configAsVisible_returnTrue() { + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_show_sim_info)) + .thenReturn(true); + + assertTrue(SubscriptionUtil.isSimHardwareVisible(mContext)); + } } From 8c5d8e694a8a6a6fad0a260f5f15170ce4f52eca Mon Sep 17 00:00:00 2001 From: Hao Dong Date: Thu, 17 Nov 2022 20:35:52 +0000 Subject: [PATCH 07/22] Use the internal max faces number to check enrolled. Test: manually tested on device Test: robotest for FaceEnrollIntroductionTest Bug: 243759589 Change-Id: I193c7b7c49f884541bd5d8282d15bf69e46f3392 Merged-In: I193c7b7c49f884541bd5d8282d15bf69e46f3392 (cherry picked from commit b4000fb22666f1179bb99c9a2b281bf040f983fd) --- .../biometrics/face/FaceEnrollIntroduction.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index 259829643ef..ed74d2a550d 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.face.FaceManager; -import android.hardware.face.FaceSensorPropertiesInternal; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; @@ -54,8 +53,6 @@ import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.span.LinkSpan; -import java.util.List; - /** * Provides introductory info about face unlock and prompts the user to agree before starting face * enrollment. @@ -289,20 +286,12 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { } private boolean maxFacesEnrolled() { - final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); if (mFaceManager != null) { - final List props = - mFaceManager.getSensorPropertiesInternal(); // This will need to be updated for devices with multiple face sensors. - final int max = props.get(0).maxEnrollmentsPerUser; final int numEnrolledFaces = mFaceManager.getEnrolledFaces(mUserId).size(); - final int maxFacesEnrollableIfSUW = getApplicationContext().getResources() + final int maxFacesEnrollable = getApplicationContext().getResources() .getInteger(R.integer.suw_max_faces_enrollable); - if (isSetupWizard) { - return numEnrolledFaces >= maxFacesEnrollableIfSUW; - } else { - return numEnrolledFaces >= max; - } + return numEnrolledFaces >= maxFacesEnrollable; } else { return false; } From 30ccc43ae10a633b34e5707e23ff0b01a540d25c Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Mon, 21 Nov 2022 14:43:58 +0000 Subject: [PATCH 08/22] Revert^2 "Add configuration for defaulting notification behavior" Test: go through SUW on affected device, view notification screen Bug: 240472040 Change-Id: I34dbe28226d830bc5ba633e72cd529d97021de85 --- res/values/config.xml | 3 ++ .../notification/RedactionInterstitial.java | 5 +++- .../RedactionInterstitialTest.java | 29 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index 205b9b5baa5..b7c0bad7fd2 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -634,6 +634,9 @@ android.uid.system:1000 + + true + false diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java index f243250a611..d6fdaf81c95 100644 --- a/src/com/android/settings/notification/RedactionInterstitial.java +++ b/src/com/android/settings/notification/RedactionInterstitial.java @@ -189,13 +189,16 @@ public class RedactionInterstitial extends SettingsActivity { } private void loadFromSettings() { + final boolean showUnRedactedDefault = getContext().getResources().getBoolean( + R.bool.default_allow_sensitive_lockscreen_content); final boolean managedProfile = UserManager.get(getContext()).isManagedProfile(mUserId); // Hiding all notifications is device-wide setting, managed profiles can only set // whether their notifications are show in full or redacted. final boolean showNotifications = managedProfile || Settings.Secure.getIntForUser( getContentResolver(), LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, mUserId) != 0; final boolean showUnredacted = Settings.Secure.getIntForUser( - getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1, mUserId) != 0; + getContentResolver(), LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, + showUnRedactedDefault ? 1 : 0, mUserId) != 0; int checkedButtonId = R.id.hide_all; if (showNotifications) { diff --git a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java index 5c6da495235..9d475b84524 100644 --- a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java +++ b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java @@ -21,6 +21,7 @@ import android.widget.RadioButton; import com.android.settings.R; import com.android.settings.RestrictedRadioButton; import com.android.settings.notification.RedactionInterstitial.RedactionInterstitialFragment; +import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settings.testutils.shadow.ShadowUtils; @@ -38,6 +39,7 @@ import org.robolectric.shadows.ShadowUserManager; @Config(shadows = { ShadowUtils.class, ShadowRestrictedLockUtilsInternal.class, + SettingsShadowResources.class, }) public class RedactionInterstitialTest { private RedactionInterstitial mActivity; @@ -134,6 +136,28 @@ public class RedactionInterstitialTest { assertSelectedButton(R.id.redact_sensitive); } + @Test + public void defaultShowSensitiveContent_configDeny() { + final ContentResolver resolver = RuntimeEnvironment.application.getContentResolver(); + Settings.Secure.putIntForUser(resolver, + LOCK_SCREEN_SHOW_NOTIFICATIONS, 1, UserHandle.myUserId()); + setupConfig(false); + setupActivity(); + + assertSelectedButton(R.id.redact_sensitive); + } + + @Test + public void defaultShowSensitiveContent_configAllow() { + final ContentResolver resolver = RuntimeEnvironment.application.getContentResolver(); + Settings.Secure.putIntForUser(resolver, + LOCK_SCREEN_SHOW_NOTIFICATIONS, 1, UserHandle.myUserId()); + setupConfig(true); + setupActivity(); + + assertSelectedButton(R.id.show_all); + } + private void setupActivity() { mActivity = buildActivity(RedactionInterstitial.class, new Intent()).setup().get(); mFragment = (RedactionInterstitialFragment) @@ -142,6 +166,11 @@ public class RedactionInterstitialTest { assertThat(mFragment).isNotNull(); } + private void setupConfig(boolean allowSensitiveContent) { + SettingsShadowResources.overrideResource( + R.bool.default_allow_sensitive_lockscreen_content, allowSensitiveContent); + } + private void setupSettings(int show, int showUnredacted) { final ContentResolver resolver = RuntimeEnvironment.application.getContentResolver(); Settings.Secure.putIntForUser(resolver, From 3d10bebe06378be8c5ccd5a7dc721ff0b5fc88d2 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 21 Nov 2022 19:34:35 +0800 Subject: [PATCH 09/22] Move ComposeContentTestRuleExt to SpaLibTestUtils Also fix some failed tests. Bug: 259520506 Test: Unit test Change-Id: I0eaf00defdad2b90bf4e67476e33a86751488bc0 --- tests/spa_unit/Android.bp | 4 +-- .../spa/app/appinfo/AppButtonsTest.kt | 2 +- .../app/appinfo/AppDataUsagePreferenceTest.kt | 7 ++-- .../spa/app/appinfo/AppDisableButtonTest.kt | 2 +- .../appinfo/AppInstallerInfoPreferenceTest.kt | 2 +- .../app/appinfo/AppSettingsPreferenceTest.kt | 6 ---- .../app/appinfo/AppTimeSpentPreferenceTest.kt | 2 +- .../InstantAppDomainsPreferenceTest.kt | 23 +++++-------- .../testutils/ComposeContentTestRuleExt.kt | 33 ------------------- .../settings/testutils/FakeFeatureFactory.kt | 10 +++--- 10 files changed, 20 insertions(+), 71 deletions(-) delete mode 100644 tests/spa_unit/src/com/android/settings/testutils/ComposeContentTestRuleExt.kt diff --git a/tests/spa_unit/Android.bp b/tests/spa_unit/Android.bp index da334116004..0bd561348ef 100644 --- a/tests/spa_unit/Android.bp +++ b/tests/spa_unit/Android.bp @@ -30,13 +30,11 @@ android_test { static_libs: [ "Settings-core", + "SpaLibTestUtils", "androidx.compose.runtime_runtime", - "androidx.compose.ui_ui-test-junit4", - "androidx.compose.ui_ui-test-manifest", "androidx.test.ext.junit", "androidx.test.runner", "mockito-target-extended-minus-junit4", - "truth-prebuilt", ], jni_libs: [ "libdexmakerjvmtiagent", diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt index d71b4eeceb4..0ca4f67f800 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt @@ -31,8 +31,8 @@ import androidx.compose.ui.test.onRoot import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.dx.mockito.inline.extended.ExtendedMockito -import com.android.settings.testutils.delay import com.android.settingslib.applications.AppUtils +import com.android.settingslib.spa.testutils.delay import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn import org.junit.After diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDataUsagePreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDataUsagePreferenceTest.kt index 174f5085864..b6816e65242 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDataUsagePreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDataUsagePreferenceTest.kt @@ -30,7 +30,6 @@ import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.printToLog import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.dx.mockito.inline.extended.ExtendedMockito @@ -39,9 +38,9 @@ import com.android.settings.R import com.android.settings.Utils import com.android.settings.applications.appinfo.AppInfoDashboardFragment import com.android.settings.datausage.AppDataUsage -import com.android.settings.testutils.waitUntilExists import com.android.settingslib.net.NetworkCycleDataForUid import com.android.settingslib.net.NetworkCycleDataForUidLoader +import com.android.settingslib.spa.testutils.waitUntilExists import org.junit.After import org.junit.Before import org.junit.Rule @@ -134,9 +133,7 @@ class AppDataUsagePreferenceTest { setContent() - composeTestRule.onRoot().printToLog("AAA") - composeTestRule.onNodeWithText(context.getString(R.string.no_data_usage)) - .assertIsDisplayed() + composeTestRule.waitUntilExists(hasText(context.getString(R.string.no_data_usage))) } @Test diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDisableButtonTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDisableButtonTest.kt index f35810ff858..beb6abc592d 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDisableButtonTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppDisableButtonTest.kt @@ -61,7 +61,7 @@ class AppDisableButtonTest { private lateinit var devicePolicyManager: DevicePolicyManager private val fakeFeatureFactory = FakeFeatureFactory() - private val appFeatureProvider = fakeFeatureFactory.applicationFeatureProvider + private val appFeatureProvider = fakeFeatureFactory.mockApplicationFeatureProvider private lateinit var appDisableButton: AppDisableButton diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreferenceTest.kt index b66967a96c2..53a18683a7d 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreferenceTest.kt @@ -38,8 +38,8 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.settings.R import com.android.settings.Utils import com.android.settings.applications.AppStoreUtil -import com.android.settings.testutils.waitUntilExists import com.android.settingslib.applications.AppUtils +import com.android.settingslib.spa.testutils.waitUntilExists import com.android.settingslib.spaprivileged.framework.common.userManager import com.android.settingslib.spaprivileged.model.app.userHandle import org.junit.After diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt index 1184ee7270a..a1fb367d1df 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt @@ -29,18 +29,13 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.assertIsNotEnabled -import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.printToLog import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R -import com.android.settings.testutils.waitUntilExists -import com.android.settingslib.applications.AppUtils import com.android.settingslib.spaprivileged.model.app.userHandle import com.android.settingslib.spaprivileged.model.app.userId import com.google.common.truth.Truth.assertThat @@ -49,7 +44,6 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers import org.mockito.Mock import org.mockito.Mockito.any import org.mockito.Mockito.eq diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreferenceTest.kt index e3fcdd904ae..b2ff4f2e8a8 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreferenceTest.kt @@ -63,7 +63,7 @@ class AppTimeSpentPreferenceTest { private lateinit var packageManager: PackageManager private val fakeFeatureFactory = FakeFeatureFactory() - private val appFeatureProvider = fakeFeatureFactory.applicationFeatureProvider + private val appFeatureProvider = fakeFeatureFactory.mockApplicationFeatureProvider @Before fun setUp() { diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreferenceTest.kt index 9782817f742..1a78c4974e3 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreferenceTest.kt @@ -24,10 +24,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.filterToOne -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot @@ -37,7 +33,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.dx.mockito.inline.extended.ExtendedMockito import com.android.settings.R import com.android.settings.Utils -import com.android.settings.testutils.delay +import com.android.settingslib.spa.testutils.delay +import com.android.settingslib.spa.testutils.onDialogText import org.junit.After import org.junit.Before import org.junit.Rule @@ -141,18 +138,14 @@ class InstantAppDomainsPreferenceTest { composeTestRule.onRoot().performClick() composeTestRule.delay() - assertDialogHasText(context.getString(R.string.app_launch_supported_domain_urls_title)) - assertDialogHasText("abc") - assertDialogHasText("def") + composeTestRule.onDialogText( + context.getString(R.string.app_launch_supported_domain_urls_title) + ).assertIsDisplayed() + composeTestRule.onDialogText("abc").assertIsDisplayed() + composeTestRule.onDialogText("def").assertIsDisplayed() } - private fun assertDialogHasText(text: String) { - composeTestRule.onAllNodes(hasAnyAncestor(isDialog())) - .filterToOne(hasText(text)) - .assertIsDisplayed() - } - - private fun setContent(app:ApplicationInfo = INSTANT_APP) { + private fun setContent(app: ApplicationInfo = INSTANT_APP) { composeTestRule.setContent { CompositionLocalProvider(LocalContext provides context) { InstantAppDomainsPreference(app) diff --git a/tests/spa_unit/src/com/android/settings/testutils/ComposeContentTestRuleExt.kt b/tests/spa_unit/src/com/android/settings/testutils/ComposeContentTestRuleExt.kt deleted file mode 100644 index 82df9cff4dd..00000000000 --- a/tests/spa_unit/src/com/android/settings/testutils/ComposeContentTestRuleExt.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 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.testutils - -import androidx.compose.ui.test.ComposeTimeoutException -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.junit4.ComposeContentTestRule - -/** Blocks until the found a semantics node that match the given condition. */ -fun ComposeContentTestRule.waitUntilExists(matcher: SemanticsMatcher) = waitUntil { - onAllNodes(matcher).fetchSemanticsNodes().isNotEmpty() -} - -/** Blocks until the timeout is reached. */ -fun ComposeContentTestRule.delay(timeoutMillis: Long = 1_000) = try { - waitUntil(timeoutMillis) { false } -} catch (_: ComposeTimeoutException) { - // Expected -} diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt index 054b4150e8e..a544f533dbe 100644 --- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt +++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt @@ -51,7 +51,9 @@ import org.mockito.Mockito.mock class FakeFeatureFactory : FeatureFactory() { - val applicationFeatureProvider: ApplicationFeatureProvider = + private val mockMetricsFeatureProvider: MetricsFeatureProvider = + mock(MetricsFeatureProvider::class.java) + val mockApplicationFeatureProvider: ApplicationFeatureProvider = mock(ApplicationFeatureProvider::class.java) init { @@ -70,9 +72,7 @@ class FakeFeatureFactory : FeatureFactory() { TODO("Not yet implemented") } - override fun getMetricsFeatureProvider(): MetricsFeatureProvider { - TODO("Not yet implemented") - } + override fun getMetricsFeatureProvider(): MetricsFeatureProvider = mockMetricsFeatureProvider override fun getPowerUsageFeatureProvider(context: Context?): PowerUsageFeatureProvider { TODO("Not yet implemented") @@ -96,7 +96,7 @@ class FakeFeatureFactory : FeatureFactory() { TODO("Not yet implemented") } - override fun getApplicationFeatureProvider(context: Context?) = applicationFeatureProvider + override fun getApplicationFeatureProvider(context: Context?) = mockApplicationFeatureProvider override fun getLocaleFeatureProvider(): LocaleFeatureProvider { TODO("Not yet implemented") From 01df2b4ee29db1e13ef8371b6961e561b84f6da8 Mon Sep 17 00:00:00 2001 From: Alejandro Nijamkin Date: Wed, 9 Nov 2022 11:47:50 -0800 Subject: [PATCH 10/22] Adds settings item for quick affordances. This is in Display > Lock screen. It reads "Buttons" and the summary text below it is a comma delimited list of the names of the currently-selected quick affordances. Fix: 256662519 Test: Manual verification that the lock screen and wallet items are gone and the new item is visible and clicking it opens the Wallpaper & style settings screen Change-Id: If3746b5d0eb8c61edb9378cdb217ca248b999944 --- AndroidManifest.xml | 1 + res/values/strings.xml | 8 + res/xml/security_lockscreen_settings.xml | 5 + .../ControlsPrivacyPreferenceController.java | 5 + ...olsTrivialPrivacyPreferenceController.java | 4 + ...nQuickAffordancesPreferenceController.java | 71 ++++++++ .../display/CustomizableLockScreenUtils.java | 152 +++++++++++++++++ .../QRCodeScannerPreferenceController.java | 4 + .../WalletPrivacyPreferenceController.java | 4 + ...ckAffordancesPreferenceControllerTest.java | 153 ++++++++++++++++++ 10 files changed, 407 insertions(+) create mode 100644 src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceController.java create mode 100644 src/com/android/settings/display/CustomizableLockScreenUtils.java create mode 100644 tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 564d5c23c3d..c87835c5f72 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -118,6 +118,7 @@ + Show double-line clock when available Double-line clock + + Buttons + + + None + %1$s + %1$s, %2$s + diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml index 3bd84f81ae3..80e8fe69d2a 100644 --- a/res/xml/security_lockscreen_settings.xml +++ b/res/xml/security_lockscreen_settings.xml @@ -69,6 +69,11 @@ android:summary="@string/lockscreen_trivial_controls_summary" settings:controller="com.android.settings.display.ControlsTrivialPrivacyPreferenceController"/> + + { + // TODO(b/258471384): open the buttons destination within wallpaper picker. + final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER); + final String packageName = + mContext.getString(R.string.config_wallpaper_picker_package); + if (!TextUtils.isEmpty(packageName)) { + intent.setPackage(packageName); + } + mContext.startActivity(intent); + return true; + }); + refreshSummary(preference); + } + } + + @Override + public CharSequence getSummary() { + return CustomizableLockScreenUtils.getQuickAffordanceSummary(mContext); + } +} diff --git a/src/com/android/settings/display/CustomizableLockScreenUtils.java b/src/com/android/settings/display/CustomizableLockScreenUtils.java new file mode 100644 index 00000000000..14601a3655b --- /dev/null +++ b/src/com/android/settings/display/CustomizableLockScreenUtils.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.display; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.R; + +import java.util.ArrayList; +import java.util.List; + +/** Utilities for display settings related to customizable lock screen features. */ +public final class CustomizableLockScreenUtils { + + private static final String TAG = "CustomizableLockScreenUtils"; + private static final Uri BASE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority("com.android.systemui.keyguard.quickaffordance") + .build(); + @VisibleForTesting + static final Uri FLAGS_URI = BASE_URI.buildUpon() + .path("flags") + .build(); + @VisibleForTesting + static final Uri SELECTIONS_URI = BASE_URI.buildUpon() + .path("selections") + .build(); + @VisibleForTesting + static final String NAME = "name"; + @VisibleForTesting + static final String VALUE = "value"; + @VisibleForTesting + static final String ENABLED_FLAG = "is_feature_enabled"; + @VisibleForTesting + static final String AFFORDANCE_NAME = "affordance_name"; + + private CustomizableLockScreenUtils() {} + + /** + * Queries and returns whether the customizable lock screen quick affordances feature is enabled + * on the device. + * + *

This is a slow, blocking call that shouldn't be made on the main thread. + */ + public static boolean isFeatureEnabled(Context context) { + try (Cursor cursor = context.getContentResolver().query( + FLAGS_URI, + null, + null, + null)) { + if (cursor == null) { + Log.w(TAG, "Cursor was null!"); + return false; + } + + final int indexOfNameColumn = cursor.getColumnIndex(NAME); + final int indexOfValueColumn = cursor.getColumnIndex(VALUE); + if (indexOfNameColumn == -1 || indexOfValueColumn == -1) { + Log.w(TAG, "Cursor doesn't contain " + NAME + " or " + VALUE + "!"); + return false; + } + + while (cursor.moveToNext()) { + final String name = cursor.getString(indexOfNameColumn); + final int value = cursor.getInt(indexOfValueColumn); + if (TextUtils.equals(ENABLED_FLAG, name)) { + Log.d(TAG, ENABLED_FLAG + "=" + value); + return value == 1; + } + } + + Log.w(TAG, "Flag with name \"" + ENABLED_FLAG + "\" not found!"); + return false; + } catch (Exception e) { + Log.e(TAG, "Exception while querying quick affordance content provider", e); + return false; + } + } + + /** + * Queries and returns a summary text for the currently-selected lock screen quick affordances. + * + *

This is a slow, blocking call that shouldn't be made on the main thread. + */ + @Nullable + public static CharSequence getQuickAffordanceSummary(Context context) { + try (Cursor cursor = context.getContentResolver().query( + SELECTIONS_URI, + null, + null, + null)) { + if (cursor == null) { + Log.w(TAG, "Cursor was null!"); + return null; + } + + final int columnIndex = cursor.getColumnIndex(AFFORDANCE_NAME); + if (columnIndex == -1) { + Log.w(TAG, "Cursor doesn't contain \"" + AFFORDANCE_NAME + "\" column!"); + return null; + } + + final List affordanceNames = new ArrayList<>(cursor.getCount()); + while (cursor.moveToNext()) { + final String affordanceName = cursor.getString(columnIndex); + if (!TextUtils.isEmpty(affordanceName)) { + affordanceNames.add(affordanceName); + } + } + + // We don't display more than the first two items. + final int usableAffordanceNameCount = Math.min(2, affordanceNames.size()); + final List arguments = new ArrayList<>(usableAffordanceNameCount); + if (!affordanceNames.isEmpty()) { + arguments.add(affordanceNames.get(0)); + } + if (affordanceNames.size() > 1) { + arguments.add(affordanceNames.get(1)); + } + + return context.getResources().getQuantityString( + R.plurals.lockscreen_quick_affordances_summary, + usableAffordanceNameCount, + arguments.toArray()); + } catch (Exception e) { + Log.e(TAG, "Exception while querying quick affordance content provider", e); + return null; + } + } +} diff --git a/src/com/android/settings/display/QRCodeScannerPreferenceController.java b/src/com/android/settings/display/QRCodeScannerPreferenceController.java index 16e594a62d5..cb022a74fa8 100644 --- a/src/com/android/settings/display/QRCodeScannerPreferenceController.java +++ b/src/com/android/settings/display/QRCodeScannerPreferenceController.java @@ -87,6 +87,10 @@ public class QRCodeScannerPreferenceController extends TogglePreferenceControlle @Override public int getAvailabilityStatus() { + if (CustomizableLockScreenUtils.isFeatureEnabled(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + return isScannerActivityAvailable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/display/WalletPrivacyPreferenceController.java b/src/com/android/settings/display/WalletPrivacyPreferenceController.java index 92580f3d569..fe14a40a01a 100644 --- a/src/com/android/settings/display/WalletPrivacyPreferenceController.java +++ b/src/com/android/settings/display/WalletPrivacyPreferenceController.java @@ -62,6 +62,10 @@ public class WalletPrivacyPreferenceController extends TogglePreferenceControlle @Override public int getAvailabilityStatus() { + if (CustomizableLockScreenUtils.isFeatureEnabled(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + return isEnabled() && isSecure() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; } diff --git a/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java new file mode 100644 index 00000000000..8597d6490af --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.display; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.MatrixCursor; +import android.text.TextUtils; + +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.filters.SmallTest; + +import com.android.settings.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; + +@SmallTest +@RunWith(RobolectricTestRunner.class) +public class CustomizableLockScreenQuickAffordancesPreferenceControllerTest { + + private static final String KEY = "key"; + + @Mock private Context mContext; + @Mock private ContentResolver mContentResolver; + + private CustomizableLockScreenQuickAffordancesPreferenceController mUnderTest; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getContentResolver()).thenReturn(mContentResolver); + when(mContext.getResources()) + .thenReturn(ApplicationProvider.getApplicationContext().getResources()); + + mUnderTest = new CustomizableLockScreenQuickAffordancesPreferenceController(mContext, KEY); + } + + @Test + public void getAvailabilityStatus_whenEnabled() { + setEnabled(true); + + assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getAvailabilityStatus_whenNotEnabled() { + setEnabled(false); + + assertThat(mUnderTest.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void displayPreference_click() { + setSelectedAffordanceNames("one", "two"); + final PreferenceScreen screen = mock(PreferenceScreen.class); + final Preference preference = mock(Preference.class); + when(screen.findPreference(KEY)).thenReturn(preference); + + mUnderTest.displayPreference(screen); + + final ArgumentCaptor clickCaptor = + ArgumentCaptor.forClass(Preference.OnPreferenceClickListener.class); + verify(preference).setOnPreferenceClickListener(clickCaptor.capture()); + + clickCaptor.getValue().onPreferenceClick(preference); + + final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(preference).setOnPreferenceClickListener(clickCaptor.capture()); + verify(mContext).startActivity(intentCaptor.capture()); + assertThat(intentCaptor.getValue().getPackage()).isEqualTo( + mContext.getString(R.string.config_wallpaper_picker_package)); + assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SET_WALLPAPER); + } + + @Test + public void getSummary_whenNoneAreSelected() { + setSelectedAffordanceNames(); + + assertThat(mUnderTest.getSummary()).isNull(); + } + + @Test + public void getSummary_whenOneIsSelected() { + setSelectedAffordanceNames("one"); + + assertThat(TextUtils.equals(mUnderTest.getSummary(), "one")).isTrue(); + } + + @Test + public void getSummary_whenTwoAreSelected() { + setSelectedAffordanceNames("one", "two"); + + assertThat(TextUtils.equals(mUnderTest.getSummary(), "one, two")).isTrue(); + } + + private void setEnabled(boolean isEnabled) { + final MatrixCursor cursor = new MatrixCursor( + new String[] { + CustomizableLockScreenUtils.NAME, + CustomizableLockScreenUtils.VALUE + }); + cursor.addRow(new Object[] { CustomizableLockScreenUtils.ENABLED_FLAG, isEnabled ? 1 : 0 }); + when( + mContentResolver.query( + CustomizableLockScreenUtils.FLAGS_URI, null, null, null)) + .thenReturn(cursor); + } + + private void setSelectedAffordanceNames(String... affordanceNames) { + final MatrixCursor cursor = new MatrixCursor( + new String[] { CustomizableLockScreenUtils.AFFORDANCE_NAME }); + for (final String name : affordanceNames) { + cursor.addRow(new Object[] { name }); + } + + when( + mContentResolver.query( + CustomizableLockScreenUtils.SELECTIONS_URI, null, null, null)) + .thenReturn(cursor); + } +} From adca4691476bd75e496f6715d910e4a0e3b6d5db Mon Sep 17 00:00:00 2001 From: Florian Mayer Date: Tue, 22 Nov 2022 01:31:17 +0000 Subject: [PATCH 11/22] Remove periods from description strings This is for consistency with the rest of the Developer options Change-Id: I1450b67edcb2ca927e9b551400dba1e2efb2749d --- 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 f7d7e94fbd7..a2aad458da9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10486,8 +10486,8 @@ Reboot with MTE System will reboot and allow to experiment with Memory Tagging Extension (MTE). MTE may negatively impact system performance and stability. Will be reset on next subsequent reboot. - Try MTE for a single boot for app development. - MTE is enabled through Advanced memory protection. + Try MTE for a single boot for app development + MTE is enabled through Advanced memory protection Capturing system heap dump From f5e631dd7771e5e56d21a6b0266a416017ec116b Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Tue, 22 Nov 2022 03:20:52 +0000 Subject: [PATCH 12/22] Add biometric2 unit test owner Bug: 236072782 Test: Build pass Change-Id: Iea90eb418eb61087c44c037356a4171197f9f6c7 --- tests/unit/src/com/android/settings/biometrics2/OWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/unit/src/com/android/settings/biometrics2/OWNERS diff --git a/tests/unit/src/com/android/settings/biometrics2/OWNERS b/tests/unit/src/com/android/settings/biometrics2/OWNERS new file mode 100644 index 00000000000..a257ed861ad --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics2/OWNERS @@ -0,0 +1 @@ +include /src/com/android/settings/biometrics/OWNERS From a725bac68c9d1846cef096e4c5958b161787cd9c Mon Sep 17 00:00:00 2001 From: Zhenwei Chen Date: Tue, 22 Nov 2022 04:39:03 +0800 Subject: [PATCH 13/22] Clean up useless defender dialog code Test: Unit test passed Bug: 256523123 Change-Id: If3cbe4072c891f1af6b5aa4fb624e4e486c78ad6 Signed-off-by: Zhenwei Chen --- .../batterytip/BatteryTipDialogFragment.java | 24 ----------- .../actions/BatteryDefenderAction.java | 43 ------------------- .../BatteryTipDialogFragmentTest.java | 16 ------- 3 files changed, 83 deletions(-) delete mode 100644 src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index d4c00a44cd2..5fd3905649f 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -43,7 +43,6 @@ import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; -import java.text.NumberFormat; import java.util.List; /** @@ -142,29 +141,6 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme .setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this) .setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null) .create(); - case BatteryTip.TipType.BATTERY_DEFENDER: - mMetricsFeatureProvider.action(context, - SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, mMetricsKey); - final double chargeLimitLevel = 0.8f; - final String percentage = - NumberFormat.getPercentInstance().format(chargeLimitLevel); - final String message = context.getString( - R.string.battery_tip_limited_temporarily_dialog_msg, percentage); - final boolean isPluggedIn = isPluggedIn(); - final AlertDialog.Builder dialogBuilder = - new AlertDialog.Builder(context) - .setTitle(R.string.battery_tip_limited_temporarily_title) - .setMessage(message); - if (isPluggedIn) { - dialogBuilder - .setPositiveButton( - R.string.battery_tip_limited_temporarily_dialog_resume_charge, - this) - .setNegativeButton(R.string.okay, null); - } else { - dialogBuilder.setPositiveButton(R.string.okay, null); - } - return dialogBuilder.create(); default: throw new IllegalArgumentException("unknown type " + mBatteryTip.getType()); } diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java deleted file mode 100644 index 824b6bee5ca..00000000000 --- a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2020 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.fuelgauge.batterytip.actions; - -import android.content.Intent; - -import com.android.settings.SettingsActivity; -import com.android.settings.overlay.FeatureFactory; - -/** - * Action to open the Support Center article - */ -public class BatteryDefenderAction extends BatteryTipAction { - private SettingsActivity mSettingsActivity; - - public BatteryDefenderAction(SettingsActivity settingsActivity) { - super(settingsActivity.getApplicationContext()); - mSettingsActivity = settingsActivity; - } - - @Override - public void handlePositiveAction(int metricsKey) { - final Intent intent = FeatureFactory.getFactory(mContext) - .getPowerUsageFeatureProvider(mContext).getResumeChargeIntent(); - if (intent != null) { - mContext.sendBroadcast(intent); - } - } -} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java index db1159e1bcf..c5d66a60b45 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java @@ -244,20 +244,4 @@ public class BatteryTipDialogFragmentTest { assertThat(shadowDialog.getMessage()).isEqualTo( mContext.getText(R.string.battery_tip_dialog_summary_message)); } - - @Test - public void testOnCreateDialog_defenderTip_fireDialog() { - mDialogFragment = BatteryTipDialogFragment.newInstance(mDefenderTip, METRICS_KEY); - - FragmentController.setupFragment(mDialogFragment, FragmentActivity.class, - 0 /* containerViewId */, null /* bundle */); - - final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); - - assertThat(shadowDialog.getTitle()).isEqualTo( - mContext.getString(R.string.battery_tip_limited_temporarily_title)); - assertThat(shadowDialog.getMessage()).isEqualTo( - mContext.getString(R.string.battery_tip_limited_temporarily_dialog_msg, "80%")); - } } From 92d766300dfa64d1f819e4ee1b14ad81dcd0e3da Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 22 Nov 2022 17:29:29 +0800 Subject: [PATCH 14/22] Reduce flaky of SettingsSpaUnitTests Bug: 236346018 Test: Unit test Change-Id: I8069a9dcb80f0379f1113c3dbfa5784efcdc8601 --- .../spa/app/appinfo/AppAllServicesPreferenceTest.kt | 6 +++++- .../settings/spa/app/appinfo/AppLocalePreferenceTest.kt | 8 ++++++-- .../settings/spa/app/appinfo/AppSettingsPreferenceTest.kt | 2 ++ .../InteractAcrossProfilesDetailsPreferenceTest.kt | 6 +++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppAllServicesPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppAllServicesPreferenceTest.kt index 9846e3f7ff1..bd73d8bcce7 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppAllServicesPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppAllServicesPreferenceTest.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot @@ -38,6 +39,8 @@ import androidx.core.os.bundleOf import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R +import com.android.settingslib.spa.testutils.delay +import com.android.settingslib.spa.testutils.waitUntilExists import com.android.settingslib.spaprivileged.model.app.userHandle import com.android.settingslib.spaprivileged.model.app.userId import com.google.common.truth.Truth.assertThat @@ -140,7 +143,7 @@ class AppAllServicesPreferenceTest { setContent() - composeTestRule.onNodeWithText(SUMMARY).assertIsDisplayed() + composeTestRule.waitUntilExists(hasText(SUMMARY)) } @Test @@ -149,6 +152,7 @@ class AppAllServicesPreferenceTest { setContent() composeTestRule.onRoot().performClick() + composeTestRule.delay() val intentCaptor = ArgumentCaptor.forClass(Intent::class.java) verify(context).startActivityAsUser(intentCaptor.capture(), eq(APP.userHandle)) diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt index 60c4f79ad9e..39524df7c16 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot @@ -36,6 +37,8 @@ import com.android.settings.applications.AppInfoBase import com.android.settings.applications.AppLocaleUtil import com.android.settings.applications.appinfo.AppLocaleDetails import com.android.settings.localepicker.AppLocalePickerActivity +import com.android.settingslib.spa.testutils.delay +import com.android.settingslib.spa.testutils.waitUntilExists import com.android.settingslib.spaprivileged.model.app.userHandle import com.google.common.truth.Truth.assertThat import org.junit.After @@ -103,15 +106,16 @@ class AppLocalePreferenceTest { composeTestRule.onNodeWithText(context.getString(R.string.app_locale_preference_title)) .assertIsDisplayed() - composeTestRule.onNodeWithText(SUMMARY).assertIsDisplayed() + composeTestRule.waitUntilExists(hasText(SUMMARY)) } @Test - fun whenCanDisplayLocalUi_click_startsActivity() { + fun whenCanDisplayLocalUi_click_startActivity() { doNothing().`when`(context).startActivityAsUser(any(), any()) setContent() composeTestRule.onRoot().performClick() + composeTestRule.delay() val intentCaptor = ArgumentCaptor.forClass(Intent::class.java) verify(context).startActivityAsUser(intentCaptor.capture(), eq(APP.userHandle)) diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt index a1fb367d1df..35811e251c2 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppSettingsPreferenceTest.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R +import com.android.settingslib.spa.testutils.delay import com.android.settingslib.spaprivileged.model.app.userHandle import com.android.settingslib.spaprivileged.model.app.userId import com.google.common.truth.Truth.assertThat @@ -129,6 +130,7 @@ class AppSettingsPreferenceTest { setContent() composeTestRule.onRoot().performClick() + composeTestRule.delay() val intentCaptor = ArgumentCaptor.forClass(Intent::class.java) verify(context).startActivityAsUser(intentCaptor.capture(), eq(APP.userHandle)) diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt index aeccb078840..f4489c6f5e7 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot @@ -34,6 +35,8 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito import com.android.settings.R import com.android.settings.applications.appinfo.AppInfoDashboardFragment import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetails +import com.android.settingslib.spa.testutils.delay +import com.android.settingslib.spa.testutils.waitUntilExists import com.android.settingslib.spaprivileged.framework.common.crossProfileApps import org.junit.After import org.junit.Before @@ -110,7 +113,7 @@ class InteractAcrossProfilesDetailsPreferenceTest { setContent() - composeTestRule.onNodeWithText(SUMMARY).assertIsDisplayed() + composeTestRule.waitUntilExists(hasText(SUMMARY)) } @Test @@ -119,6 +122,7 @@ class InteractAcrossProfilesDetailsPreferenceTest { setContent() composeTestRule.onRoot().performClick() + composeTestRule.delay() ExtendedMockito.verify { AppInfoDashboardFragment.startAppInfoFragment( From 547cdbe3fafe8f88ee5a09cc53581433765fe57e Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 22 Nov 2022 17:36:05 +0800 Subject: [PATCH 15/22] Fix duplicated SettingsEnums.TRUSTED_CREDENTIALS The target page have nested fragments, remove the enum from inner fragment to fix this issue. Fix: 260055184 Test: Manually with Settings Change-Id: Iee51df18ab6810147857703678482a62f34228fe --- .../android/settings/TrustedCredentialsFragment.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/TrustedCredentialsFragment.java b/src/com/android/settings/TrustedCredentialsFragment.java index ca565a46c1e..c90a44d17a9 100644 --- a/src/com/android/settings/TrustedCredentialsFragment.java +++ b/src/com/android/settings/TrustedCredentialsFragment.java @@ -25,7 +25,6 @@ import android.annotation.UiThread; import android.app.Activity; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; -import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -68,7 +67,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.app.UnlaunchableAppActivity; import com.android.internal.widget.LockPatternUtils; import com.android.settings.TrustedCredentialsSettings.Tab; -import com.android.settings.core.InstrumentedFragment; +import com.android.settingslib.core.lifecycle.ObservableFragment; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; @@ -81,7 +80,7 @@ import java.util.function.IntConsumer; /** * Fragment to display trusted credentials settings for one tab. */ -public class TrustedCredentialsFragment extends InstrumentedFragment +public class TrustedCredentialsFragment extends ObservableFragment implements TrustedCredentialsDialogBuilder.DelegateInterface { public static final String ARG_POSITION = "tab"; @@ -176,11 +175,6 @@ public class TrustedCredentialsFragment extends InstrumentedFragment return mFragmentView; } - @Override - public int getMetricsCategory() { - return SettingsEnums.TRUSTED_CREDENTIALS; - } - private void createChildView( LayoutInflater inflater, ViewGroup parent, Bundle childState, int i) { boolean isWork = mGroupAdapter.getUserInfoByGroup(i).isManagedProfile(); From 8ed5b17724af18f96ff3147f6890710402d5a8a2 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 22 Nov 2022 18:31:02 +0800 Subject: [PATCH 16/22] Update page id for modify system settings page Modify system settings page is using the page id of display over other apps. Each page should have its own page id, so creating another one for modify system settings page. Bug: 260056090 Test: manual test Change-Id: I4e25734c551f166a0c080eb534d22aea881242d9 --- .../settings/applications/appinfo/WriteSettingsDetails.java | 2 +- .../applications/manageapplications/ManageApplications.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java index 4251346e9ba..d17f843a337 100644 --- a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java +++ b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java @@ -113,7 +113,7 @@ public class WriteSettingsDetails extends AppInfoWithHeader implements OnPrefere @Override public int getMetricsCategory() { - return SettingsEnums.SYSTEM_ALERT_WINDOW_APPS; + return SettingsEnums.MODIFY_SYSTEM_SETTINGS; } public static CharSequence getSummary(Context context, AppEntry entry) { diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index e1299541642..82d7a684de4 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -589,7 +589,7 @@ public class ManageApplications extends InstrumentedFragment case LIST_TYPE_OVERLAY: return SettingsEnums.SYSTEM_ALERT_WINDOW_APPS; case LIST_TYPE_WRITE_SETTINGS: - return SettingsEnums.SYSTEM_ALERT_WINDOW_APPS; + return SettingsEnums.MODIFY_SYSTEM_SETTINGS; case LIST_TYPE_MANAGE_SOURCES: return SettingsEnums.MANAGE_EXTERNAL_SOURCES; case LIST_TYPE_WIFI_ACCESS: From 0a4295d688091045070663950f841bd6c318b689 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 17/22] Revert "[Settings] configuration for hidding SIM related UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: I03d17beac0fb85a3d17acd7d0d581feb35e9582b Merged-In: I8d7ddd18861a696830da39f040dfb14b9ed46726 Merged-In: I45b7898da440c36045aec64a0a86fb804116cd9d Merged-In: Ie00bdce2fad429f2ed343e1d7aea4967bcaddf5a Change-Id: Idb765be594a55e9f26bf378656d6b18c8f3e37c0 --- res/values/config.xml | 4 ---- res/xml/my_device_info.xml | 3 --- .../PhoneNumberPreferenceController.java | 7 +----- .../imei/ImeiInfoPreferenceController.java | 7 +----- .../SimStatusPreferenceController.java | 10 -------- .../settings/network/SubscriptionUtil.java | 8 ------- .../ImeiInfoPreferenceControllerTest.java | 7 ------ .../SimStatusPreferenceControllerTest.java | 7 ------ .../network/SubscriptionUtilTest.java | 23 ------------------- 9 files changed, 2 insertions(+), 74 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 8ae73539574..c4b7bb931a8 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -626,8 +626,4 @@ @string/config_settingsintelligence_package_name android.uid.system:1000 - - - true - diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 08d3e6cc928..9165745f472 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -57,7 +57,6 @@ android:order="3" android:title="@string/status_number" android:summary="@string/summary_placeholder" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController" settings:enableCopying="true"/> @@ -99,7 +98,6 @@ android:title="@string/sim_status_title" settings:keywords="@string/keywords_sim_status" android:summary="@string/summary_placeholder" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:enableCopying="true"/> @@ -121,7 +119,6 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_imei_info" settings:enableCopying="true" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/> diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java index f91b98f249e..eb8add5dbe9 100644 --- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -29,7 +29,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; -import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.DeviceInfoUtils; import java.util.ArrayList; @@ -52,8 +51,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return SubscriptionUtil.isSimHardwareVisible(mContext) ? - AVAILABLE : UNSUPPORTED_ON_DEVICE; + return mTelephonyManager.isVoiceCapable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override @@ -81,9 +79,6 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { - return; - } final Preference preference = screen.findPreference(getPreferenceKey()); final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); mPreferenceList.add(preference); diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java index 9b7359b0c8d..e90477270e0 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java @@ -33,7 +33,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.deviceinfo.PhoneNumberSummaryPreference; -import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.Utils; import java.util.ArrayList; @@ -64,9 +63,6 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { - return; - } final Preference preference = screen.findPreference(getPreferenceKey()); final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); @@ -123,8 +119,7 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return SubscriptionUtil.isSimHardwareVisible(mContext) && - mContext.getSystemService(UserManager.class).isAdminUser() + return mContext.getSystemService(UserManager.class).isAdminUser() && !Utils.isWifiOnly(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java index f811d2a86d2..e392bd6cc90 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java @@ -29,7 +29,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; import java.util.ArrayList; @@ -60,18 +59,9 @@ public class SimStatusPreferenceController extends return KEY_SIM_STATUS; } - @Override - public boolean isAvailable() { - return SubscriptionUtil.isSimHardwareVisible(mContext) && - super.isAvailable(); - } - @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { - return; - } final Preference preference = screen.findPreference(getPreferenceKey()); if (!isAvailable() || preference == null || !preference.isVisible()) { return; diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index ccfcfb0a752..0bba86fafed 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -86,14 +86,6 @@ public class SubscriptionUtil { return subscriptions; } - /** - * Check if SIM hardware is visible to the end user. - */ - public static boolean isSimHardwareVisible(Context context) { - return context.getResources() - .getBoolean(R.bool.config_show_sim_info); - } - @VisibleForTesting static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) { if (slotInfo == null) { diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java index bae629ced42..55194add83d 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; -import android.content.res.Resources; import android.os.UserManager; import android.telephony.TelephonyManager; @@ -70,18 +69,12 @@ public class ImeiInfoPreferenceControllerTest { private PreferenceCategory mCategory; private Context mContext; - private Resources mResources; private ImeiInfoPreferenceController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - - mResources = spy(mContext.getResources()); - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); - doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); mController = spy(new ImeiInfoPreferenceController(mContext, "imei_info")); mController.setHost(mFragment); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java index 4ffaf7ae6ec..85a6fac765a 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.UserManager; -import android.content.res.Resources; import android.telephony.TelephonyManager; import androidx.fragment.app.Fragment; @@ -65,18 +64,12 @@ public class SimStatusPreferenceControllerTest { private PreferenceCategory mCategory; private Context mContext; - private Resources mResources; private SimStatusPreferenceController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - - mResources = spy(mContext.getResources()); - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); - doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); mController = spy(new SimStatusPreferenceController(mContext, mFragment)); doReturn(true).when(mController).isAvailable(); diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java index 63dca7e88eb..43a32b51fbc 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java @@ -25,14 +25,11 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; -import android.content.res.Resources; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; -import com.android.settings.R; - import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -61,8 +58,6 @@ public class SubscriptionUtilTest { private SubscriptionManager mSubMgr; @Mock private TelephonyManager mTelMgr; - @Mock - private Resources mResources; @Before @@ -448,22 +443,4 @@ public class SubscriptionUtilTest { public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() { assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse(); } - - @Test - public void isSimHardwareVisible_configAsInvisible_returnFalse() { - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)) - .thenReturn(false); - - assertThat(SubscriptionUtil.isSimHardwareVisible(mContext)).isFalse(); - } - - @Test - public void isSimHardwareVisible_configAsVisible_returnTrue() { - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)) - .thenReturn(true); - - assertTrue(SubscriptionUtil.isSimHardwareVisible(mContext)); - } } From 26aa2414a059a2e19a844816e3f47eb55ef073de Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 18/22] Revert "[Settings] configuration for hidding SIM notification UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: I07d9ddeb96ca590decf28126ce97fba4c1783304 Merged-In: I7a912a3393694155d29614d325796e08598985bf Merged-In: I0a7e0e9826a301f2aa0ca34f40b5570f0e384b4f Change-Id: Ib366c3fca7433e58d1925f27af11a794afb3ca00 --- src/com/android/settings/sim/SimDialogActivity.java | 6 ------ .../android/settings/sim/SimSelectNotification.java | 4 ---- .../sim/smartForwarding/SmartForwardingActivity.java | 10 +--------- .../settings/sim/SimSelectNotificationTest.java | 5 ----- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java index db190d9249b..732277b3d8a 100644 --- a/src/com/android/settings/sim/SimDialogActivity.java +++ b/src/com/android/settings/sim/SimDialogActivity.java @@ -35,7 +35,6 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import com.android.settings.R; -import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.telephony.SubscriptionActionDialogActivity; import java.util.List; @@ -66,11 +65,6 @@ public class SimDialogActivity extends FragmentActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!SubscriptionUtil.isSimHardwareVisible(this)) { - Log.d(TAG, "Not support on device without SIM."); - finish(); - return; - } getWindow().addSystemFlags( WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); showOrUpdateDialog(); diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java index c26e8f61841..5902b926020 100644 --- a/src/com/android/settings/sim/SimSelectNotification.java +++ b/src/com/android/settings/sim/SimSelectNotification.java @@ -77,10 +77,6 @@ public class SimSelectNotification extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - if (!SubscriptionUtil.isSimHardwareVisible(context)) { - Log.w(TAG, "Received unexpected intent with null action."); - return; - } String action = intent.getAction(); if (action == null) { diff --git a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java index 070e65a1d56..217801e5a17 100644 --- a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java +++ b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java @@ -38,7 +38,6 @@ import androidx.core.content.ContextCompat; import com.android.settings.R; import com.android.settings.core.SettingsBaseActivity; -import com.android.settings.network.SubscriptionUtil; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -49,7 +48,6 @@ import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.Executors; public class SmartForwardingActivity extends SettingsBaseActivity { - static final String LOG_TAG = SmartForwardingActivity.class.toString(); final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()); @@ -57,12 +55,6 @@ public class SmartForwardingActivity extends SettingsBaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!SubscriptionUtil.isSimHardwareVisible(this)) { - Log.d(LOG_TAG, "Not support on device without SIM."); - finish(); - return; - } - final Toolbar toolbar = findViewById(R.id.action_bar); toolbar.setVisibility(View.VISIBLE); setActionBar(toolbar); @@ -174,4 +166,4 @@ public class SmartForwardingActivity extends SettingsBaseActivity { .create(); mDialog.show(); } -} +} \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java index e4c8a63a0be..10e291cf2c0 100644 --- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java +++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java @@ -42,7 +42,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -138,7 +137,6 @@ public class SimSelectNotificationTest { when(mSubInfo.getDisplayName()).thenReturn(mFakeDisplayName); when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mResources.getText(R.string.enable_sending_mms_notification_title)) .thenReturn(mFakeNotificationTitle); when(mResources.getText(R.string.enable_mms_notification_channel_title)) @@ -238,9 +236,6 @@ public class SimSelectNotificationTest { @Test public void onReceivePrimarySubListChange_WithDismissExtra_shouldDismiss() { - doReturn(mExecutor).when(mActivity).getMainExecutor(); - SimDialogProhibitService.supportDismiss(mActivity); - Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED); intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE, EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA); From ead8a3572079aa5e38fe763726be15ded0875996 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 19/22] Revert "[Settings] configuration for hidding SIM lock UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: I870c0b53112db56b7bc80bfd585f6f7b3cf82737 Change-Id: Ie157c9d85b5cea9ded8c4b7928a10e7ae401ab09 --- res/xml/security_advanced_settings.xml | 2 -- src/com/android/settings/IccLockSettings.java | 5 ++-- .../security/SimLockPreferenceController.java | 5 ---- .../SimLockPreferenceControllerTest.java | 24 +------------------ 4 files changed, 3 insertions(+), 33 deletions(-) diff --git a/res/xml/security_advanced_settings.xml b/res/xml/security_advanced_settings.xml index b36fc73fdd2..6d43fe77451 100644 --- a/res/xml/security_advanced_settings.xml +++ b/res/xml/security_advanced_settings.xml @@ -64,7 +64,6 @@ android:order="50" android:key="sim_lock_settings" android:title="@string/sim_lock_settings_category" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:controller="com.android.settings.security.SimLockPreferenceController"> diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java index 8e54e3196f7..71eb0f20e30 100644 --- a/src/com/android/settings/IccLockSettings.java +++ b/src/com/android/settings/IccLockSettings.java @@ -174,9 +174,8 @@ public class IccLockSettings extends SettingsPreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Utils.isMonkeyRunning() || - !SubscriptionUtil.isSimHardwareVisible(getContext())) { - finishFragment(); + if (Utils.isMonkeyRunning()) { + finish(); return; } diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java index 8429a9f352c..7cd01732400 100644 --- a/src/com/android/settings/security/SimLockPreferenceController.java +++ b/src/com/android/settings/security/SimLockPreferenceController.java @@ -28,7 +28,6 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; -import com.android.settings.network.SubscriptionUtil; import java.util.List; @@ -51,10 +50,6 @@ public class SimLockPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { - return UNSUPPORTED_ON_DEVICE; - } - final List subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java index f38cc4948d4..ef5973c1d5b 100644 --- a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java @@ -22,11 +22,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; -import android.content.res.Resources; import android.os.PersistableBundle; import android.os.UserManager; import android.telephony.CarrierConfigManager; @@ -37,7 +35,6 @@ import android.telephony.TelephonyManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import org.junit.Before; @@ -69,7 +66,6 @@ public class SimLockPreferenceControllerTest { private SimLockPreferenceController mController; private Preference mPreference; private Context mContext; - private Resources mResources; @Before public void setUp() { @@ -80,28 +76,15 @@ public class SimLockPreferenceControllerTest { shadowApplication.setSystemService(Context.CARRIER_CONFIG_SERVICE, mCarrierManager); shadowApplication.setSystemService(Context.USER_SERVICE, mUserManager); shadowApplication.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager); - mContext = spy(RuntimeEnvironment.application); - - mResources = spy(mContext.getResources()); - when(mContext.getResources()).thenReturn(mResources); - + mContext = RuntimeEnvironment.application; mController = new SimLockPreferenceController(mContext, "key"); mPreference = new Preference(mContext); mPreference.setKey(mController.getPreferenceKey()); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); } - @Test - public void isAvailable_notShowSimUi_false() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(false); - - assertThat(mController.getAvailabilityStatus()) - .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); - } - @Test public void isAvailable_notAdmin_false() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(false); assertThat(mController.getAvailabilityStatus()) @@ -110,7 +93,6 @@ public class SimLockPreferenceControllerTest { @Test public void isAvailable_simIccNotReady_false() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(true); assertThat(mController.getAvailabilityStatus()) @@ -142,7 +124,6 @@ public class SimLockPreferenceControllerTest { @Test public void displayPreference_simReady_enablePreference() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); mController.displayPreference(mScreen); assertThat(mPreference.isEnabled()).isFalse(); @@ -159,14 +140,12 @@ public class SimLockPreferenceControllerTest { @Test public void getPreferenceKey_whenGivenValue_returnsGivenValue() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); mController = new SimLockPreferenceController(mContext, "key"); assertThat(mController.getPreferenceKey()).isEqualTo("key"); } private void setupMockIcc() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); final List subscriptionInfoList = new ArrayList<>(); SubscriptionInfo info = mock(SubscriptionInfo.class); subscriptionInfoList.add(info); @@ -177,7 +156,6 @@ public class SimLockPreferenceControllerTest { } private void setupMockSimReady() { - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); final List subscriptionInfoList = new ArrayList<>(); SubscriptionInfo info = mock(SubscriptionInfo.class); subscriptionInfoList.add(info); From 8e98f5a8522956bae5338a1ee68476ebe240856d Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 20/22] Revert "[Settings] configuration for hidding SIM settings UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: If1df99a79e51125d03f534cdfc9408b01c61024f Change-Id: I646d664b83d3db12cca81f53f7f5cd82a38e34d0 --- .../settings/network/MobileNetworkListFragment.java | 7 +------ .../network/telephony/MobileNetworkSettings.java | 7 +------ .../settings/network/telephony/MobileNetworkUtils.java | 7 ------- .../network/MobileNetworkListFragmentTest.java | 10 ---------- .../network/telephony/MobileNetworkSettingsTest.java | 8 -------- 5 files changed, 2 insertions(+), 37 deletions(-) diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java index ea7031ae132..7881690e106 100644 --- a/src/com/android/settings/network/MobileNetworkListFragment.java +++ b/src/com/android/settings/network/MobileNetworkListFragment.java @@ -60,10 +60,6 @@ public class MobileNetworkListFragment extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { final List controllers = new ArrayList<>(); - if (!SubscriptionUtil.isSimHardwareVisible(getContext())) { - finish(); - return controllers; - } NetworkProviderSimsCategoryController simCategoryPrefCtrl = new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM, @@ -92,8 +88,7 @@ public class MobileNetworkListFragment extends DashboardFragment { @Override protected boolean isPageSearchEnabled(Context context) { - return SubscriptionUtil.isSimHardwareVisible(context) && - context.getSystemService(UserManager.class).isAdminUser(); + return context.getSystemService(UserManager.class).isAdminUser(); } }; } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 05e58e96ed7..94b6aaf1bcc 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -120,10 +120,6 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { @Override protected List createPreferenceControllers(Context context) { - if (!SubscriptionUtil.isSimHardwareVisible(context)) { - finish(); - return Arrays.asList(); - } if (getArguments() == null) { Intent intent = getIntent(); if (intent != null) { @@ -402,8 +398,7 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { /** suppress full page if user is not admin */ @Override protected boolean isPageSearchEnabled(Context context) { - return SubscriptionUtil.isSimHardwareVisible(context) && - context.getSystemService(UserManager.class).isAdminUser(); + return context.getSystemService(UserManager.class).isAdminUser(); } }; diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java index d44eadace08..839a98cdb32 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -261,9 +261,6 @@ public class MobileNetworkUtils { * the user has enabled development mode. */ public static boolean showEuiccSettings(Context context) { - if (!SubscriptionUtil.isSimHardwareVisible(context)) { - return false; - } long timeForAccess = SystemClock.elapsedRealtime(); try { Boolean isShow = ((Future) ThreadUtils.postOnBackgroundThread(() -> { @@ -1013,10 +1010,6 @@ public class MobileNetworkUtils { } public static void launchMobileNetworkSettings(Context context, SubscriptionInfo info) { - if (!SubscriptionUtil.isSimHardwareVisible(context)) { - Log.e(TAG, "launchMobileNetworkSettings fail, device without such UI."); - return; - } final int subId = info.getSubscriptionId(); if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { Log.d(TAG, "launchMobileNetworkSettings fail, subId is invalid."); diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java index 2e04ea751f0..fd2b520929f 100644 --- a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java +++ b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java @@ -21,10 +21,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; -import android.content.res.Resources; import android.os.UserManager; -import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import org.junit.Before; @@ -40,8 +38,6 @@ public class MobileNetworkListFragmentTest { @Mock private Context mContext; @Mock - private Resources mResources; - @Mock private UserManager mUserManager; private MobileNetworkListFragment mFragment; @@ -59,9 +55,6 @@ public class MobileNetworkListFragmentTest { final BaseSearchIndexProvider provider = (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER; - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); - final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled", ReflectionHelpers.ClassParameter.from(Context.class, mContext)); final boolean isEnabled = (Boolean) obj; @@ -76,9 +69,6 @@ public class MobileNetworkListFragmentTest { final BaseSearchIndexProvider provider = (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER; - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); - final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled", ReflectionHelpers.ClassParameter.from(Context.class, mContext)); final boolean isEnabled = (Boolean) obj; diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java index 3e219a412ce..44611cec616 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.app.usage.NetworkStatsManager; import android.content.Context; -import android.content.res.Resources; import android.net.NetworkPolicyManager; import android.os.Bundle; import android.os.UserManager; @@ -38,7 +37,6 @@ import android.telephony.TelephonyManager; import androidx.fragment.app.FragmentActivity; -import com.android.settings.R; import com.android.settings.datausage.DataUsageSummaryPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; @@ -70,18 +68,12 @@ public class MobileNetworkSettingsTest { private FragmentActivity mActivity; private Context mContext; - private Resources mResources; private MobileNetworkSettings mFragment; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - - mResources = spy(mContext.getResources()); - when(mContext.getResources()).thenReturn(mResources); - when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true); - when(mActivity.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager); From 3b7d0d2e17ffb63c2804f34dd9914e30c07dd68b Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 21/22] Revert "[Settings] configuration for hidding SIM remove UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: Iea40b89733cc75a41f960fecb2ac24177a4cbd3d Change-Id: I5c52b841955f5be41ce861aca740147061fc7d3f --- res/xml/reset_dashboard_fragment.xml | 1 - src/com/android/settings/MainClear.java | 11 +---------- src/com/android/settings/ResetNetwork.java | 6 ------ .../settings/network/EraseEuiccDataController.java | 3 +-- .../src/com/android/settings/MainClearTest.java | 5 +---- 5 files changed, 3 insertions(+), 23 deletions(-) diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml index 25161a5a66d..9497c8fe7d7 100644 --- a/res/xml/reset_dashboard_fragment.xml +++ b/res/xml/reset_dashboard_fragment.xml @@ -37,7 +37,6 @@ diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index 1434d7216a9..2b0f01036ea 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -64,7 +64,6 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.core.InstrumentedFragment; import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; -import com.android.settings.network.SubscriptionUtil; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; import com.android.settingslib.RestrictedLockUtilsInternal; @@ -382,14 +381,6 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(this); } - /** - * Whether to show any UI which is SIM related. - */ - @VisibleForTesting - boolean showAnySubscriptionInfo(Context context) { - return (context != null) && SubscriptionUtil.isSimHardwareVisible(context); - } - /** * Whether to show strings indicating that the eUICC will be wiped. * @@ -399,7 +390,7 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis @VisibleForTesting boolean showWipeEuicc() { Context context = getContext(); - if (!showAnySubscriptionInfo(context) || !isEuiccEnabled(context)) { + if (!isEuiccEnabled(context)) { return false; } ContentResolver cr = context.getContentResolver(); diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index 7635041ee46..688e2abe71e 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -235,9 +235,6 @@ public class ResetNetwork extends InstrumentedFragment { } private List getActiveSubscriptionInfoList() { - if (!SubscriptionUtil.isSimHardwareVisible(getActivity())) { - return Collections.emptyList(); - } SubscriptionManager mgr = getActivity().getSystemService(SubscriptionManager.class); if (mgr == null) { Log.w(TAG, "No SubscriptionManager"); @@ -267,9 +264,6 @@ public class ResetNetwork extends InstrumentedFragment { } private boolean showEuiccSettings(Context context) { - if (!SubscriptionUtil.isSimHardwareVisible(context)) { - return false; - } EuiccManager euiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE); if (!euiccManager.isEnabled()) { diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java index 091b6d7748c..b1f964b2190 100644 --- a/src/com/android/settings/network/EraseEuiccDataController.java +++ b/src/com/android/settings/network/EraseEuiccDataController.java @@ -51,8 +51,7 @@ public class EraseEuiccDataController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return SubscriptionUtil.isSimHardwareVisible(mContext) && - mContext.getPackageManager().hasSystemFeature( + return mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_TELEPHONY_EUICC) ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java index 9795092a657..ec33fadfd02 100644 --- a/tests/robotests/src/com/android/settings/MainClearTest.java +++ b/tests/robotests/src/com/android/settings/MainClearTest.java @@ -102,10 +102,7 @@ public class MainClearTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mMainClear = spy(new MainClear() { - @Override - boolean showAnySubscriptionInfo(Context context) { return true; } - }); + mMainClear = spy(new MainClear()); mActivity = Robolectric.setupActivity(FragmentActivity.class); mShadowActivity = Shadows.shadowOf(mActivity); UserManager userManager = mActivity.getSystemService(UserManager.class); From a1c1bd0f81eac2474ec9ef7d47e8177686608e8d Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Tue, 22 Nov 2022 09:51:54 +0000 Subject: [PATCH 22/22] Revert "[Settings] configuration for hidding SIM provider UI" Revert submission 2299468-settings_without_siminfo Reason for revert: Fix build breakage Reverted Changes: I3d6ecec14:[Settings] configuration for hidding SIM settings ... I8f0c1d53c:[Settings] configuration for hidding SIM remove UI... I1b88f0f70:[Settings] configuration for hidding SIM notificat... Ibe22c3ba3:[Settings] configuration for hidding SIM provider ... Id5ea14ca8:[Settings] configuration for hidding SIM related U... I70be07dbc:[Settings] configuration for hidding SIM lock UI Log of breakage: https://android-build.googleplex.com/builds/submitted/9318826/full-eng/latest/view/logs/build_error.log Bug: 260055628 Merged-In: I1cb83787dc1ac1d61bb6bed6aa9c5e7a3ad6e69b Change-Id: If1951dde860bb49e3ea4cd5603ed92ef18bd1f0d --- res/xml/network_provider_internet.xml | 3 --- res/xml/network_provider_settings.xml | 1 - .../network/MobileNetworkSummaryController.java | 3 +-- .../network/NetworkProviderCallsSmsController.java | 3 +-- .../network/NetworkProviderCallsSmsFragment.java | 3 +-- .../settings/network/NetworkProviderSettings.java | 11 ----------- .../settings/network/NetworkProviderSettingsTest.java | 5 +---- 7 files changed, 4 insertions(+), 25 deletions(-) diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index c9c576e6b1b..07e797a07c1 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -37,7 +37,6 @@ android:icon="@drawable/ic_calls_sms" android:order="-20" android:summary="@string/summary_placeholder" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:allowDividerBelow="true" settings:keywords="@string/calls_and_sms" settings:useAdminDisabledSummary="true" /> @@ -50,7 +49,6 @@ android:order="-15" settings:keywords="@string/keywords_more_mobile_networks" settings:userRestriction="no_config_mobile_networks" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:allowDividerAbove="true" settings:useAdminDisabledSummary="true" /> @@ -68,7 +66,6 @@ android:persistent="false" android:order="19" settings:userRestriction="no_config_mobile_networks" - settings:isPreferenceVisible="@bool/config_show_sim_info" settings:useAdminDisabledSummary="true" />