diff --git a/res/values/strings.xml b/res/values/strings.xml index 675bfcd43ad..ad0550f47f9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6441,9 +6441,7 @@ SIM status - SIM status (sim slot 1) - - SIM status (sim slot 2) + SIM status (sim slot %1$d) Call back from default SIM diff --git a/res/xml/device_info_settings_v2.xml b/res/xml/device_info_settings_v2.xml index 77ead2c5f16..9a48e96b4be 100644 --- a/res/xml/device_info_settings_v2.xml +++ b/res/xml/device_info_settings_v2.xml @@ -29,21 +29,13 @@ android:title="@string/status_number" android:summary="@string/summary_placeholder"/> - + - - - - 1; - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - mPreference = screen.findPreference(getPreferenceKey()); - if (mPreference == null) { - return; - } - - mPreference.setTitle(getPreferenceTitle()); - mPreference.setSummary(getCarrierName()); - } - - @Override - public boolean handlePreferenceTreeClick(Preference preference) { - if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { - return false; - } - - SimStatusDialogFragment.show(mFragment, getSimSlot(), getPreferenceTitle()); - return true; - } - - /** - * @return The preference title for the displayed preference. - */ - protected abstract String getPreferenceTitle(); - - /** - * @return The sim slot to retrieve sim status information about. - */ - protected abstract int getSimSlot(); - - private CharSequence getCarrierName() { - final List subscriptionInfoList = - mSubscriptionManager.getActiveSubscriptionInfoList(); - if (subscriptionInfoList != null) { - for (SubscriptionInfo info : subscriptionInfoList) { - if (info.getSimSlotIndex() == getSimSlot()) { - return info.getCarrierName(); - } - } - } - return mContext.getText(R.string.device_info_not_available); - } -} diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceController.java deleted file mode 100644 index ce73a294247..00000000000 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceController.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.simstatus; - -import android.app.Fragment; -import android.content.Context; - -import com.android.settings.R; - -public class SimStatusDualSimPreferenceController extends AbstractSimStatusPreferenceController { - - private static final int SIM_SLOT = 1; - private static final String SIM_STATUS_DUAL_SIM_KEY = "sim_status_sim_2"; - - public SimStatusDualSimPreferenceController(Context context, Fragment fragment) { - super(context, fragment); - } - - @Override - public boolean isAvailable() { - return super.isAvailable() && mIsMultiSim; - } - - @Override - protected String getPreferenceTitle() { - return mContext.getResources().getString(R.string.sim_status_title_sim_slot_2); - } - - @Override - protected int getSimSlot() { - return SIM_SLOT; - } - - @Override - public String getPreferenceKey() { - return SIM_STATUS_DUAL_SIM_KEY; - } -} diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2.java index ee16eac5bf3..55493dc3ba0 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2.java @@ -18,32 +18,107 @@ package com.android.settings.deviceinfo.simstatus; import android.app.Fragment; 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 com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; -public class SimStatusPreferenceControllerV2 extends AbstractSimStatusPreferenceController { +import java.util.ArrayList; +import java.util.List; - public static final int SIM_SLOT = 0; +public class SimStatusPreferenceControllerV2 extends + AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin { - private static final String KEY_SIM_1_STATUS = "sim_status_sim_1"; + private static final String KEY_SIM_STATUS = "sim_status"; + + private final TelephonyManager mTelephonyManager; + private final SubscriptionManager mSubscriptionManager; + private final Fragment mFragment; + private final List mPreferenceList = new ArrayList<>(); public SimStatusPreferenceControllerV2(Context context, Fragment fragment) { - super(context, fragment); - } + super(context); - @Override - protected String getPreferenceTitle() { - return mIsMultiSim ? mContext.getResources().getString(R.string.sim_status_title_sim_slot_1) - : mContext.getResources().getString(R.string.sim_status_title); - } - - @Override - protected int getSimSlot() { - return SIM_SLOT; + mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + mSubscriptionManager = (SubscriptionManager) context.getSystemService( + Context.TELEPHONY_SUBSCRIPTION_SERVICE); + mFragment = fragment; } @Override public String getPreferenceKey() { - return KEY_SIM_1_STATUS; + return KEY_SIM_STATUS; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + final Preference preference = screen.findPreference(getPreferenceKey()); + if (!isAvailable() || preference == null || !preference.isVisible()) { + return; + } + + mPreferenceList.add(preference); + + final int simStatusOrder = 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(simStatusOrder + simSlotNumber); + multiSimPreference.setKey(KEY_SIM_STATUS + 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 /* sim slot */)); + simStatusPreference.setSummary(getCarrierName(simSlotNumber /* sim slot */)); + } + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + final int simSlot = mPreferenceList.indexOf(preference); + if (simSlot == -1) { + return false; + } + + SimStatusDialogFragment.show(mFragment, simSlot, getPreferenceTitle(simSlot)); + return true; + } + + private String getPreferenceTitle(int simSlot) { + return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString( + R.string.sim_status_title_sim_slot, simSlot + 1) : mContext.getString( + R.string.sim_status_title); + } + + private CharSequence getCarrierName(int simSlot) { + final List subscriptionInfoList = + mSubscriptionManager.getActiveSubscriptionInfoList(); + if (subscriptionInfoList != null) { + for (SubscriptionInfo info : subscriptionInfoList) { + if (info.getSimSlotIndex() == simSlot) { + return info.getCarrierName(); + } + } + } + return mContext.getText(R.string.device_info_not_available); + } + + @VisibleForTesting + Preference createNewPreference(Context context) { + return new Preference(context); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/AbstractSimStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/AbstractSimStatusPreferenceControllerTest.java deleted file mode 100644 index ee749d085d3..00000000000 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/AbstractSimStatusPreferenceControllerTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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.simstatus; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.Context; -import android.os.UserManager; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; - -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.Answers; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; - -@RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) -public class AbstractSimStatusPreferenceControllerTest { - - @Mock - private Preference mPreference; - @Mock - private PreferenceScreen mScreen; - @Mock - private UserManager mUserManager; - @Mock - private Fragment mFragment; - - private Context mContext; - private AbstractSimStatusPreferenceControllerImpl mController; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); - doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); - mController = new AbstractSimStatusPreferenceControllerImpl(mContext, mFragment); - when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); - when(mPreference.getKey()).thenReturn(mController.getPreferenceKey()); - } - - @Test - public void displayPreference_shouldSetTitleAndSummary() { - mController.displayPreference(mScreen); - - verify(mPreference).setTitle(mController.getPreferenceTitle()); - verify(mPreference).setSummary(anyString()); - } - - @Test - public void handlePreferenceTreeClick_shouldStartDialogFragment() { - when(mFragment.getChildFragmentManager()).thenReturn( - mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)); - when(mPreference.getTitle()).thenReturn("foo"); - mController.displayPreference(mScreen); - - mController.handlePreferenceTreeClick(mPreference); - - verify(mFragment).getChildFragmentManager(); - } - - public class AbstractSimStatusPreferenceControllerImpl extends - AbstractSimStatusPreferenceController { - - public AbstractSimStatusPreferenceControllerImpl(Context context, Fragment fragment) { - super(context, fragment); - } - - @Override - public String getPreferenceKey() { - return "foo"; - } - - @Override - protected String getPreferenceTitle() { - return "bar"; - } - - @Override - protected int getSimSlot() { - return 0; - } - } -} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceControllerTest.java deleted file mode 100644 index 0845bfa95e9..00000000000 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDualSimPreferenceControllerTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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.simstatus; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -import android.app.Fragment; -import android.content.Context; -import android.net.ConnectivityManager; -import android.os.UserManager; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; -import android.telephony.TelephonyManager; - -import com.android.settings.TestConfig; -import com.android.settings.testutils.SettingsRobolectricTestRunner; - -import com.google.common.truth.Truth; - -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) -public class SimStatusDualSimPreferenceControllerTest { - - @Mock - private Preference mPreference; - @Mock - private PreferenceScreen mScreen; - @Mock - private TelephonyManager mTelephonyManager; - @Mock - private UserManager mUserManager; - @Mock - private ConnectivityManager mConnectivityManager; - @Mock - private Fragment mFragment; - - private Context mContext; - private SimStatusDualSimPreferenceController mController; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); - doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); - doReturn(mConnectivityManager).when(mContext).getSystemService(ConnectivityManager.class); - when(mUserManager.isAdminUser()).thenReturn(true); - when(mConnectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn( - true); - mController = new SimStatusDualSimPreferenceController(mContext, mFragment); - ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); - when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); - when(mPreference.getKey()).thenReturn(mController.getPreferenceKey()); - } - - @Test - public void isAvailable_multiSim_shouldBeTrue() { - ReflectionHelpers.setField(mController, "mIsMultiSim", true); - - Truth.assertThat(mController.isAvailable()).isTrue(); - } - - @Test - public void isAvailable_notMultiSim_shouldBeFalse() { - ReflectionHelpers.setField(mController, "mIsMultiSim", false); - - Truth.assertThat(mController.isAvailable()).isFalse(); - } -} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2Test.java index 3282c3c85f7..53324b579a2 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2Test.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerV2Test.java @@ -16,13 +16,16 @@ package com.android.settings.deviceinfo.simstatus; -import static com.google.common.truth.Truth.assertThat; - +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Fragment; +import android.app.FragmentManager; import android.content.Context; import android.os.UserManager; import android.support.v7.preference.Preference; @@ -31,11 +34,13 @@ import android.telephony.TelephonyManager; import com.android.settings.R; import com.android.settings.TestConfig; +import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceControllerV2; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @@ -49,6 +54,8 @@ public class SimStatusPreferenceControllerV2Test { @Mock private Preference mPreference; @Mock + private Preference mSecondSimPreference; + @Mock private PreferenceScreen mScreen; @Mock private TelephonyManager mTelephonyManager; @@ -65,25 +72,60 @@ public class SimStatusPreferenceControllerV2Test { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); - mController = new SimStatusPreferenceControllerV2(mContext, mFragment); + mController = spy(new SimStatusPreferenceControllerV2(mContext, mFragment)); + doReturn(true).when(mController).isAvailable(); + when(mScreen.getContext()).thenReturn(mContext); + doReturn(mSecondSimPreference).when(mController).createNewPreference(mContext); ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); - when(mPreference.getKey()).thenReturn(mController.getPreferenceKey()); + final String prefKey = mController.getPreferenceKey(); + when(mPreference.getKey()).thenReturn(prefKey); + when(mPreference.isVisible()).thenReturn(true); } @Test - public void getPreferenceTitle_noMultiSim_shouldReturnSingleSimString() { - ReflectionHelpers.setField(mController, "mIsMultiSim", false); + public void displayPreference_multiSim_shouldAddSecondPreference() { + when(mTelephonyManager.getPhoneCount()).thenReturn(2); - assertThat(mController.getPreferenceTitle()).isEqualTo(mContext.getResources().getString( - R.string.sim_status_title)); + mController.displayPreference(mScreen); + + verify(mScreen).addPreference(mSecondSimPreference); } @Test - public void getPreferenceTitle_multiSim_shouldReturnMultiSimString() { - ReflectionHelpers.setField(mController, "mIsMultiSim", true); + public void updateState_singleSim_shouldSetSingleSimTitleAndSummary() { + when(mTelephonyManager.getPhoneCount()).thenReturn(1); + mController.displayPreference(mScreen); - assertThat(mController.getPreferenceTitle()).isEqualTo(mContext.getResources().getString( - R.string.sim_status_title_sim_slot_1)); + mController.updateState(mPreference); + + verify(mPreference).setTitle(mContext.getString(R.string.sim_status_title)); + verify(mPreference).setSummary(anyString()); + } + + @Test + public void updateState_multiSim_shouldSetMultiSimTitleAndSummary() { + when(mTelephonyManager.getPhoneCount()).thenReturn(2); + mController.displayPreference(mScreen); + + mController.updateState(mPreference); + + verify(mPreference).setTitle( + mContext.getString(R.string.sim_status_title_sim_slot, 1 /* sim slot */)); + verify(mSecondSimPreference).setTitle( + mContext.getString(R.string.sim_status_title_sim_slot, 2 /* sim slot */)); + verify(mPreference).setSummary(anyString()); + verify(mSecondSimPreference).setSummary(anyString()); + } + + @Test + public void handlePreferenceTreeClick_shouldStartDialogFragment() { + when(mFragment.getChildFragmentManager()).thenReturn( + mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)); + mController.displayPreference(mScreen); + + mController.handlePreferenceTreeClick(mPreference); + + verify(mFragment).getChildFragmentManager(); } }