diff --git a/res/values/strings.xml b/res/values/strings.xml index ad0550f47f9..de75fc7dbd7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2675,6 +2675,10 @@ MDN Phone number + + MDN (sim slot %1$d) + + Phone number (sim slot %1$d) MDN on SIM diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java index 63253da9db9..42cac986bc8 100644 --- a/src/com/android/settings/DeviceInfoSettings.java +++ b/src/com/android/settings/DeviceInfoSettings.java @@ -36,6 +36,7 @@ import com.android.settings.deviceinfo.FirmwareVersionPreferenceController; import com.android.settings.deviceinfo.IpAddressPreferenceController; import com.android.settings.deviceinfo.KernelVersionPreferenceController; 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.SecurityPatchPreferenceController; @@ -128,7 +129,7 @@ public class DeviceInfoSettings extends DashboardFragment implements Indexable { final List controllers = new ArrayList<>(); // Device name - // Phone number + controllers.add(new PhoneNumberPreferenceController(context)); controllers.add(new SimStatusPreferenceControllerV2(context, fragment)); diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java new file mode 100644 index 00000000000..5edac0fa5a9 --- /dev/null +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -0,0 +1,128 @@ +/* + * 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 android.content.Context; +import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.text.TextUtils; + +import com.android.settings.R; +import com.android.settingslib.DeviceInfoUtils; +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.ArrayList; +import java.util.List; + +public class PhoneNumberPreferenceController extends AbstractPreferenceController { + + private final static String KEY_PHONE_NUMBER = "phone_number"; + + private final TelephonyManager mTelephonyManager; + private final SubscriptionManager mSubscriptionManager; + private final List mPreferenceList = new ArrayList<>(); + + public PhoneNumberPreferenceController(Context context) { + super(context); + mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + mSubscriptionManager = (SubscriptionManager) context.getSystemService( + Context.TELEPHONY_SUBSCRIPTION_SERVICE); + } + + @Override + public String getPreferenceKey() { + return KEY_PHONE_NUMBER; + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + final Preference preference = screen.findPreference(getPreferenceKey()); + mPreferenceList.add(preference); + + final int phonePreferenceOrder = preference.getOrder(); + // Add additional preferences for each sim in the device + for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount(); + simSlotNumber++) { + final Preference multiSimPreference = createNewPreference(screen.getContext()); + multiSimPreference.setOrder(phonePreferenceOrder + simSlotNumber); + multiSimPreference.setKey(KEY_PHONE_NUMBER + simSlotNumber); + screen.addPreference(multiSimPreference); + mPreferenceList.add(multiSimPreference); + } + } + + @Override + public void updateState(Preference preference) { + for (int simSlotNumber = 0; simSlotNumber < mPreferenceList.size(); simSlotNumber++) { + final Preference simStatusPreference = mPreferenceList.get(simSlotNumber); + simStatusPreference.setTitle(getPreferenceTitle(simSlotNumber)); + simStatusPreference.setSummary(getPhoneNumber(simSlotNumber)); + } + } + + private CharSequence getPhoneNumber(int simSlot) { + final SubscriptionInfo subscriptionInfo = getSubscriptionInfo(simSlot); + if (subscriptionInfo == null) { + return mContext.getString(R.string.device_info_default); + } + + return getFormattedPhoneNumber(subscriptionInfo); + } + + private CharSequence getPreferenceTitle(int simSlot) { + return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString( + R.string.status_number_sim_slot, simSlot + 1) : mContext.getString( + R.string.status_number); + } + + @VisibleForTesting + SubscriptionInfo getSubscriptionInfo(int simSlot) { + final List subscriptionInfoList = + mSubscriptionManager.getActiveSubscriptionInfoList(); + if (subscriptionInfoList != null) { + for (SubscriptionInfo info : subscriptionInfoList) { + if (info.getSimSlotIndex() == simSlot) { + return info; + } + } + } + return null; + } + + @VisibleForTesting + CharSequence getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) { + final String phoneNumber = DeviceInfoUtils.getFormattedPhoneNumber(mContext, + subscriptionInfo); + return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default) + : phoneNumber; + } + + @VisibleForTesting + Preference createNewPreference(Context context) { + return new Preference(context); + } +} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java new file mode 100644 index 00000000000..37c814ab5cd --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java @@ -0,0 +1,114 @@ +/* + * 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 org.mockito.ArgumentMatchers.anyInt; +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.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.telephony.SubscriptionInfo; +import android.telephony.TelephonyManager; + +import com.android.settings.R; +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O) +public class PhoneNumberPreferenceControllerTest { + + @Mock + private Preference mPreference; + @Mock + private Preference mSecondPreference; + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private SubscriptionInfo mSubscriptionInfo; + @Mock + private PreferenceScreen mScreen; + + private Context mContext; + private PhoneNumberPreferenceController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mController = spy(new PhoneNumberPreferenceController(mContext)); + ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); + final String prefKey = mController.getPreferenceKey(); + when(mScreen.findPreference(prefKey)).thenReturn(mPreference); + when(mScreen.getContext()).thenReturn(mContext); + doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt()); + doReturn(mSecondPreference).when(mController).createNewPreference(mContext); + when(mPreference.isVisible()).thenReturn(true); + } + + @Test + public void displayPreference_multiSim_shouldAddSecondPreference() { + when(mTelephonyManager.getPhoneCount()).thenReturn(2); + + mController.displayPreference(mScreen); + + verify(mScreen).addPreference(mSecondPreference); + } + + @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(mContext.getString(R.string.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( + mContext.getString(R.string.status_number_sim_slot, 1 /* sim slot */)); + verify(mPreference).setSummary(phoneNumber); + verify(mSecondPreference).setTitle( + mContext.getString(R.string.status_number_sim_slot, 2 /* sim slot */)); + verify(mSecondPreference).setSummary(phoneNumber); + } +}