From ab459dc19461a1198cde7bc2cf991d90a987dd49 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 30 Jan 2020 22:34:15 +0800 Subject: [PATCH] [Settings] Avoid rename inactive subscription from NullPointerException 1. Init instance before accessing it 2. Re-enable test case Bug: 147321836 Test: m RunSettingsRoboTests -j ROBOTEST_FILTER=RenameMobileNetworkDialogFragmentTest Change-Id: I2375043f16b5a25372af5c9f413fb8384850316c Merged-In: Ifc245bec739b4c81d2cee04b091bcdb54d567d4a --- .../RenameMobileNetworkDialogFragment.java | 28 +++++++++---- ...RenameMobileNetworkDialogFragmentTest.java | 41 ++++++++++++------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java index 38db43eeb28..fa5deab2bb9 100644 --- a/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java +++ b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java @@ -39,15 +39,17 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import com.android.settings.R; -import com.android.settings.core.instrumentation.InstrumentedDialogFragment; -import com.android.settingslib.DeviceInfoUtils; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settingslib.DeviceInfoUtils; + +import java.util.List; + /** * A dialog allowing the display name of a mobile network subscription to be changed */ @@ -115,9 +117,9 @@ public class RenameMobileNetworkDialogFragment extends InstrumentedDialogFragmen .setPositiveButton(R.string.mobile_network_sim_name_rename, (dialog, which) -> { mSubscriptionManager.setDisplayName(mNameView.getText().toString(), mSubId, SubscriptionManager.NAME_SOURCE_USER_INPUT); - mSubscriptionManager.setIconTint( - mColors[mColorSpinner.getSelectedItemPosition()].getColor(), - mSubId); + final Color color = (mColorSpinner == null) ? mColors[0] + : mColors[mColorSpinner.getSelectedItemPosition()]; + mSubscriptionManager.setIconTint(color.getColor(), mSubId); }) .setNegativeButton(android.R.string.cancel, null); return builder.create(); @@ -126,7 +128,17 @@ public class RenameMobileNetworkDialogFragment extends InstrumentedDialogFragmen @VisibleForTesting protected void populateView(View view) { mNameView = view.findViewById(R.id.name_edittext); - final SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(mSubId); + SubscriptionInfo info = null; + final List infoList = mSubscriptionManager + .getAvailableSubscriptionInfoList(); + if (infoList != null) { + for (SubscriptionInfo subInfo : infoList) { + if (subInfo.getSubscriptionId() == mSubId) { + info = subInfo; + break; + } + } + } if (info == null) { Log.w(TAG, "got null SubscriptionInfo for mSubId:" + mSubId); return; diff --git a/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java index 0d94928f564..b40698662d7 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java @@ -23,12 +23,12 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.telephony.ServiceState; @@ -55,7 +55,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowTelephonyManager; + +import java.util.ArrayList; +import java.util.List; @RunWith(RobolectricTestRunner.class) @Config(shadows = ShadowAlertDialogCompat.class) @@ -64,6 +70,8 @@ public class RenameMobileNetworkDialogFragmentTest { @Mock private TelephonyManager mTelephonyMgr; @Mock + private ServiceState mServiceState; + @Mock private SubscriptionManager mSubscriptionMgr; @Mock private SubscriptionInfo mSubscriptionInfo; @@ -71,23 +79,35 @@ public class RenameMobileNetworkDialogFragmentTest { private FragmentActivity mActivity; private RenameMobileNetworkDialogFragment mFragment; private int mSubscriptionId = 1234; + private List mSubscriptionInfoList; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).setup().get()); + + Context context = spy(RuntimeEnvironment.application); + + final ShadowTelephonyManager stm = Shadow.extract(context.getSystemService( + TelephonyManager.class)); + stm.setTelephonyManagerForSubscriptionId(mSubscriptionId, mTelephonyMgr); + when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr); + + when(mTelephonyMgr.getServiceState()).thenReturn(mServiceState); + when(mServiceState.getOperatorAlphaLong()).thenReturn("fake carrier name"); when(mSubscriptionInfo.getSubscriptionId()).thenReturn(mSubscriptionId); when(mSubscriptionInfo.getDisplayName()).thenReturn("test"); + when(mSubscriptionMgr.setDisplayName(any(), anyInt(), anyInt())).thenReturn(0); + + mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).setup().get()); mFragment = spy(RenameMobileNetworkDialogFragment.newInstance(mSubscriptionId)); - doReturn(mTelephonyMgr).when(mFragment).getTelephonyManager(any()); doReturn(mSubscriptionMgr).when(mFragment).getSubscriptionManager(any()); - final ServiceState serviceState = mock(ServiceState.class); - when(serviceState.getOperatorAlphaLong()).thenReturn("fake carrier name"); - when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr); - when(mTelephonyMgr.getServiceState()).thenReturn(serviceState); + mSubscriptionInfoList = new ArrayList(); + mSubscriptionInfoList.add(mSubscriptionInfo); + when(mSubscriptionMgr.getAvailableSubscriptionInfoList()).thenReturn( + mSubscriptionInfoList); } @Test @@ -100,8 +120,6 @@ public class RenameMobileNetworkDialogFragmentTest { @Test public void dialog_cancelButtonClicked_setDisplayNameAndIconTintNotCalled() { - when(mSubscriptionMgr.getActiveSubscriptionInfo(mSubscriptionId)).thenReturn( - mSubscriptionInfo); final AlertDialog dialog = startDialog(); final EditText nameView = mFragment.getNameView(); nameView.setText("test2"); @@ -115,9 +133,6 @@ public class RenameMobileNetworkDialogFragmentTest { @Test public void dialog_saveButtonClicked_setDisplayNameAndIconTint() { - when(mSubscriptionMgr.getActiveSubscriptionInfo(mSubscriptionId)).thenReturn( - mSubscriptionInfo); - final AlertDialog dialog = startDialog(); final EditText nameView = mFragment.getNameView(); nameView.setText("test2"); @@ -140,8 +155,6 @@ public class RenameMobileNetworkDialogFragmentTest { public void populateView_infoIsOpportunistic_hideNumberLabel() { final View view = LayoutInflater.from(mActivity).inflate( R.layout.dialog_mobile_network_rename, null); - when(mSubscriptionMgr.getActiveSubscriptionInfo(mSubscriptionId)).thenReturn( - mSubscriptionInfo); when(mSubscriptionInfo.isOpportunistic()).thenReturn(true); startDialog();