From 1fcdafbcda19532de06ba2e549a21b75358560d2 Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Tue, 13 Jul 2021 17:06:22 +0800 Subject: [PATCH] Fix the problem that the SIM status and IMEI after the "Build number". - Adding the SIM status and IMEI items of SIM2 to the PreferenceScreen can not put these items in the correct categories. We have to put these items directly into the correct categories. Fix: 193384705 Test: robotest and see the UI Merged-In: I2de7ee72fc1315eeef01288b386f8756ca366e33 Change-Id: I9472ecd604afe2f2e2eaf08c92ec11e439e8fc1d --- res/xml/my_device_info.xml | 4 + .../PhoneNumberPreferenceController.java | 7 +- .../imei/ImeiInfoPreferenceController.java | 6 +- .../SimStatusPreferenceController.java | 5 +- .../PhoneNumberPreferenceControllerTest.java | 7 +- .../ImeiInfoPreferenceControllerTest.java | 7 +- .../SimStatusPreferenceControllerTest.java | 7 +- .../PhoneNumberPreferenceControllerTest.java | 201 ++++++++++++++++++ 8 files changed, 237 insertions(+), 7 deletions(-) create mode 100644 tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index a415abfa9d3..818069b57a2 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -29,6 +29,8 @@ settings:isPreferenceVisible="false"/> @@ -88,6 +90,8 @@ diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java index abf58d80454..404a5f5ed7d 100644 --- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -29,6 +29,7 @@ import android.widget.Toast; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -40,7 +41,8 @@ import java.util.List; public class PhoneNumberPreferenceController extends BasePreferenceController { - private final static String KEY_PHONE_NUMBER = "phone_number"; + private static final String KEY_PHONE_NUMBER = "phone_number"; + private static final String KEY_PREFERENCE_CATEGORY = "basic_info_category"; private final TelephonyManager mTelephonyManager; private final SubscriptionManager mSubscriptionManager; @@ -66,6 +68,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final Preference preference = screen.findPreference(getPreferenceKey()); + final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); mPreferenceList.add(preference); final int phonePreferenceOrder = preference.getOrder(); @@ -76,7 +79,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { multiSimPreference.setOrder(phonePreferenceOrder + simSlotNumber); multiSimPreference.setKey(KEY_PHONE_NUMBER + simSlotNumber); multiSimPreference.setSelectable(false); - screen.addPreference(multiSimPreference); + category.addPreference(multiSimPreference); mPreferenceList.add(multiSimPreference); } } diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java index 967eea6155d..407e4e5c30e 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java @@ -27,6 +27,7 @@ import android.telephony.TelephonyManager; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -42,6 +43,8 @@ import java.util.List; */ public class ImeiInfoPreferenceController extends BasePreferenceController { + private static final String KEY_PREFERENCE_CATEGORY = "device_detail_category"; + private final boolean mIsMultiSim; private final TelephonyManager mTelephonyManager; private final List mPreferenceList = new ArrayList<>(); @@ -61,6 +64,7 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final Preference preference = screen.findPreference(getPreferenceKey()); + final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); mPreferenceList.add(preference); updatePreference(preference, 0 /* simSlot */); @@ -72,7 +76,7 @@ public class ImeiInfoPreferenceController extends BasePreferenceController { final Preference multiSimPreference = createNewPreference(screen.getContext()); multiSimPreference.setOrder(imeiPreferenceOrder + simSlotNumber); multiSimPreference.setKey(getPreferenceKey() + simSlotNumber); - screen.addPreference(multiSimPreference); + category.addPreference(multiSimPreference); mPreferenceList.add(multiSimPreference); updatePreference(multiSimPreference, simSlotNumber); } diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java index 02c191679d1..4204ec14f9e 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java @@ -24,6 +24,7 @@ import android.telephony.TelephonyManager; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -37,6 +38,7 @@ public class SimStatusPreferenceController extends AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin { private static final String KEY_SIM_STATUS = "sim_status"; + private static final String KEY_PREFERENCE_CATEGORY = "device_detail_category"; private final TelephonyManager mTelephonyManager; private final SubscriptionManager mSubscriptionManager; @@ -64,6 +66,7 @@ public class SimStatusPreferenceController extends if (!isAvailable() || preference == null || !preference.isVisible()) { return; } + final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY); mPreferenceList.add(preference); @@ -74,7 +77,7 @@ public class SimStatusPreferenceController extends final Preference multiSimPreference = createNewPreference(screen.getContext()); multiSimPreference.setOrder(simStatusOrder + simSlotNumber); multiSimPreference.setKey(KEY_SIM_STATUS + simSlotNumber); - screen.addPreference(multiSimPreference); + category.addPreference(multiSimPreference); mPreferenceList.add(multiSimPreference); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java index 9bb2d3f4bea..4781cd9bd4f 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java @@ -33,6 +33,7 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -64,6 +65,8 @@ public class PhoneNumberPreferenceControllerTest { private SubscriptionManager mSubscriptionManager; @Mock private PreferenceScreen mScreen; + @Mock + private PreferenceCategory mCategory; private Context mContext; private PhoneNumberPreferenceController mController; @@ -78,6 +81,8 @@ public class PhoneNumberPreferenceControllerTest { final String prefKey = mController.getPreferenceKey(); when(mScreen.findPreference(prefKey)).thenReturn(mPreference); when(mScreen.getContext()).thenReturn(mContext); + final String categoryKey = "basic_info_category"; + when(mScreen.findPreference(categoryKey)).thenReturn(mCategory); doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt()); doReturn(mSecondPreference).when(mController).createNewPreference(mContext); when(mPreference.isVisible()).thenReturn(true); @@ -105,7 +110,7 @@ public class PhoneNumberPreferenceControllerTest { mController.displayPreference(mScreen); - verify(mScreen).addPreference(mSecondPreference); + verify(mCategory).addPreference(mSecondPreference); } @Test 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 997c35e19e5..673f6c6463f 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java @@ -39,6 +39,7 @@ import android.telephony.TelephonyManager; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -68,6 +69,8 @@ public class ImeiInfoPreferenceControllerTest { private UserManager mUserManager; @Mock private Fragment mFragment; + @Mock + private PreferenceCategory mCategory; private Context mContext; private ImeiInfoPreferenceController mController; @@ -82,6 +85,8 @@ public class ImeiInfoPreferenceControllerTest { doReturn(AVAILABLE).when(mController).getAvailabilityStatus(); when(mScreen.getContext()).thenReturn(mContext); doReturn(mSecondSimPreference).when(mController).createNewPreference(mContext); + final String categoryKey = "device_detail_category"; + when(mScreen.findPreference(categoryKey)).thenReturn(mCategory); ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); final String prefKey = mController.getPreferenceKey(); @@ -97,7 +102,7 @@ public class ImeiInfoPreferenceControllerTest { mController.displayPreference(mScreen); - verify(mScreen).addPreference(mSecondSimPreference); + verify(mCategory).addPreference(mSecondSimPreference); } @Test 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 059ad425ed2..85a6fac765a 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java @@ -30,6 +30,7 @@ import android.telephony.TelephonyManager; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -59,6 +60,8 @@ public class SimStatusPreferenceControllerTest { private UserManager mUserManager; @Mock private Fragment mFragment; + @Mock + private PreferenceCategory mCategory; private Context mContext; private SimStatusPreferenceController mController; @@ -71,6 +74,8 @@ public class SimStatusPreferenceControllerTest { mController = spy(new SimStatusPreferenceController(mContext, mFragment)); doReturn(true).when(mController).isAvailable(); when(mScreen.getContext()).thenReturn(mContext); + final String categoryKey = "device_detail_category"; + when(mScreen.findPreference(categoryKey)).thenReturn(mCategory); doReturn(mSecondSimPreference).when(mController).createNewPreference(mContext); ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); @@ -85,7 +90,7 @@ public class SimStatusPreferenceControllerTest { mController.displayPreference(mScreen); - verify(mScreen).addPreference(mSecondSimPreference); + verify(mCategory).addPreference(mSecondSimPreference); } @Test diff --git a/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java new file mode 100644 index 00000000000..f363c35bddf --- /dev/null +++ b/tests/unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2017 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.deviceinfo; + +import static android.content.Context.CLIPBOARD_SERVICE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.os.Looper; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; + +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.annotation.UiThreadTest; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.testutils.ResourcesUtils; + +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 java.util.ArrayList; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +public class PhoneNumberPreferenceControllerTest { + + private Preference mPreference; + @Mock + private Preference mSecondPreference; + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private SubscriptionInfo mSubscriptionInfo; + @Mock + private SubscriptionManager mSubscriptionManager; + private PreferenceScreen mScreen; + private PreferenceCategory mCategory; + + private Context mContext; + private PhoneNumberPreferenceController mController; + private ClipboardManager mClipboardManager; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + mClipboardManager = (ClipboardManager) spy(mContext.getSystemService(CLIPBOARD_SERVICE)); + doReturn(mClipboardManager).when(mContext).getSystemService(CLIPBOARD_SERVICE); + when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); + mController = spy(new PhoneNumberPreferenceController(mContext, "phone_number")); + + if (Looper.myLooper() == null) { + Looper.prepare(); + } + final PreferenceManager preferenceManager = new PreferenceManager(mContext); + mScreen = preferenceManager.createPreferenceScreen(mContext); + mPreference = spy(new Preference(mContext)); + mPreference.setKey(mController.getPreferenceKey()); + mPreference.setVisible(true); + mScreen.addPreference(mPreference); + final String categoryKey = "basic_info_category"; + mCategory = new PreferenceCategory(mContext); + mCategory.setKey(categoryKey); + mScreen.addPreference(mCategory); + + doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt()); + doReturn(mSecondPreference).when(mController).createNewPreference(mContext); + } + + @Test + public void getAvailabilityStatus_isVoiceCapable_shouldBeAVAILABLE() { + when(mTelephonyManager.isVoiceCapable()).thenReturn(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_isNotVoiceCapable_shouldBeUNSUPPORTED_ON_DEVICE() { + when(mTelephonyManager.isVoiceCapable()).thenReturn(false); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void displayPreference_multiSim_shouldAddSecondPreference() { + when(mTelephonyManager.getPhoneCount()).thenReturn(2); + + final Preference sim1Preference = new Preference(mContext); + mCategory.addItemFromInflater(sim1Preference); + mController.displayPreference(mScreen); + + assertThat(mCategory.getPreferenceCount()).isEqualTo(2); + } + + @Test + public void updateState_singleSim_shouldUpdateTitleAndPhoneNumber() { + final String phoneNumber = "1111111111"; + doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); + when(mTelephonyManager.getPhoneCount()).thenReturn(1); + mController.displayPreference(mScreen); + + mController.updateState(mPreference); + + verify(mPreference).setTitle(ResourcesUtils.getResourcesString(mContext, "status_number")); + verify(mPreference).setSummary(phoneNumber); + } + + @Test + public void updateState_multiSim_shouldUpdateTitleAndPhoneNumberOfMultiplePreferences() { + final String phoneNumber = "1111111111"; + doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); + when(mTelephonyManager.getPhoneCount()).thenReturn(2); + mController.displayPreference(mScreen); + + mController.updateState(mPreference); + + verify(mPreference).setTitle(ResourcesUtils.getResourcesString( + mContext, "status_number_sim_slot", 1 /* sim slot */)); + verify(mPreference).setSummary(phoneNumber); + verify(mSecondPreference).setTitle(ResourcesUtils.getResourcesString( + mContext, "status_number_sim_slot", 2 /* sim slot */)); + verify(mSecondPreference).setSummary(phoneNumber); + } + + @Test + public void getSummary_cannotGetActiveSubscriptionInfo_shouldShowUnknown() { + when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null); + + CharSequence primaryNumber = mController.getSummary(); + + assertThat(primaryNumber).isNotNull(); + assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString( + mContext, "device_info_default")); + } + + @Test + public void getSummary_getEmptySubscriptionInfo_shouldShowUnknown() { + List infos = new ArrayList<>(); + when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(infos); + + CharSequence primaryNumber = mController.getSummary(); + + assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString( + mContext, "device_info_default")); + } + + @Test + @UiThreadTest + public void copy_shouldCopyPhoneNumberToClipboard() { + final List list = new ArrayList<>(); + list.add(mSubscriptionInfo); + when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(list); + final String phoneNumber = "1111111111"; + doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); + ArgumentCaptor captor = ArgumentCaptor.forClass(ClipData.class); + doNothing().when(mClipboardManager).setPrimaryClip(captor.capture()); + + mController.copy(); + + final CharSequence data = captor.getValue().getItemAt(0).getText(); + assertThat(phoneNumber.contentEquals(data)).isTrue(); + } +}