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(); + } +}