From e402cb2744c0dd3c42ca80df13ec2f1d4e1f8814 Mon Sep 17 00:00:00 2001 From: tmfang Date: Fri, 22 Jun 2018 16:56:37 +0800 Subject: [PATCH] Support phone number in Settings slices - Let controller of phoner number extends BasePreferenceController, so it can be supported showing slice view by SettingsSliceProvider. Test: make RunSettingsRoboTests Bug: 74900516 Change-Id: Id98e6aac981025159a0530c6e0709ba0f2ebcd15 --- res/xml/my_device_info.xml | 5 ++- .../PhoneNumberPreferenceController.java | 41 ++++++++++++------- .../aboutphone/MyDeviceInfoFragment.java | 2 - .../PhoneNumberPreferenceControllerTest.java | 40 +++++++++++++----- 4 files changed, 61 insertions(+), 27 deletions(-) diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 535f61afa5d..c05d6ddb0e5 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -47,7 +47,10 @@ android:order="3" android:title="@string/status_number" android:summary="@string/summary_placeholder" - android:selectable="false"/> + android:selectable="false" + settings:allowDynamicSummaryInSlice="true" + settings:controller= + "com.android.settings.deviceinfo.PhoneNumberPreferenceController" /> mPreferenceList = new ArrayList<>(); - public PhoneNumberPreferenceController(Context context) { - super(context); - mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - mSubscriptionManager = (SubscriptionManager) context.getSystemService( - Context.TELEPHONY_SUBSCRIPTION_SERVICE); + public PhoneNumberPreferenceController(Context context, String key) { + super(context, key); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); + mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); } @Override - public String getPreferenceKey() { - return KEY_PHONE_NUMBER; + public int getAvailabilityStatus() { + return mTelephonyManager.isVoiceCapable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override - public boolean isAvailable() { - return mTelephonyManager.isVoiceCapable(); + public CharSequence getSummary() { + return getFirstPhoneNumber(); } @Override @@ -89,10 +86,26 @@ public class PhoneNumberPreferenceController extends AbstractPreferenceControlle } } + @Override + public boolean isSliceable() { + return true; + } + + private CharSequence getFirstPhoneNumber() { + final List subscriptionInfoList = + mSubscriptionManager.getActiveSubscriptionInfoList(); + if (subscriptionInfoList == null) { + return mContext.getText(R.string.device_info_default); + } + + // For now, We only return first result for slice view. + return getFormattedPhoneNumber(subscriptionInfoList.get(0)); + } + private CharSequence getPhoneNumber(int simSlot) { final SubscriptionInfo subscriptionInfo = getSubscriptionInfo(simSlot); if (subscriptionInfo == null) { - return mContext.getString(R.string.device_info_default); + return mContext.getText(R.string.device_info_default); } return getFormattedPhoneNumber(subscriptionInfo); diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java index 5503ea97677..37f80b736ea 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java +++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java @@ -41,7 +41,6 @@ import com.android.settings.deviceinfo.FccEquipmentIdPreferenceController; import com.android.settings.deviceinfo.FeedbackPreferenceController; import com.android.settings.deviceinfo.IpAddressPreferenceController; import com.android.settings.deviceinfo.ManualPreferenceController; -import com.android.settings.deviceinfo.PhoneNumberPreferenceController; import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController; import com.android.settings.deviceinfo.SafetyInfoPreferenceController; import com.android.settings.deviceinfo.UptimePreferenceController; @@ -110,7 +109,6 @@ public class MyDeviceInfoFragment extends DashboardFragment Lifecycle lifecycle) { final List controllers = new ArrayList<>(); controllers.add(new EmergencyInfoPreferenceController(context)); - controllers.add(new PhoneNumberPreferenceController(context)); controllers.add(new BrandedAccountPreferenceController(context)); DeviceNamePreferenceController deviceNamePreferenceController = new DeviceNamePreferenceController(context); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java index 4748135a461..82056a2d22b 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java @@ -16,8 +16,7 @@ package com.android.settings.deviceinfo; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; @@ -27,12 +26,14 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -41,7 +42,6 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) public class PhoneNumberPreferenceControllerTest { @@ -55,6 +55,8 @@ public class PhoneNumberPreferenceControllerTest { @Mock private SubscriptionInfo mSubscriptionInfo; @Mock + private SubscriptionManager mSubscriptionManager; + @Mock private PreferenceScreen mScreen; private Context mContext; @@ -63,9 +65,10 @@ public class PhoneNumberPreferenceControllerTest { @Before public void setup() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; - mController = spy(new PhoneNumberPreferenceController(mContext)); - ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); + mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); + mController = spy(new PhoneNumberPreferenceController(mContext, "phone_number")); final String prefKey = mController.getPreferenceKey(); when(mScreen.findPreference(prefKey)).thenReturn(mPreference); when(mScreen.getContext()).thenReturn(mContext); @@ -75,17 +78,19 @@ public class PhoneNumberPreferenceControllerTest { } @Test - public void isAvailable_shouldBeTrueIfCallCapable() { + public void getAvailabilityStatus_isVoiceCapable_shouldBeAVAILABLE() { when(mTelephonyManager.isVoiceCapable()).thenReturn(true); - assertTrue(mController.isAvailable()); + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); } @Test - public void isAvailable_shouldBeFalseIfNotCallCapable() { + public void getAvailabilityStatus_isNotVoiceCapable_shouldBeUNSUPPORTED_ON_DEVICE() { when(mTelephonyManager.isVoiceCapable()).thenReturn(false); - assertFalse(mController.isAvailable()); + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.UNSUPPORTED_ON_DEVICE); } @Test @@ -126,4 +131,19 @@ public class PhoneNumberPreferenceControllerTest { mContext.getString(R.string.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(mContext.getString(R.string.device_info_default)); + } + + @Test + public void isSliceable_shouldBeTrue() { + assertThat(mController.isSliceable()).isTrue(); + } }