diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java index 574b7dd9799..946f7416fed 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java @@ -22,6 +22,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Looper; import android.os.PersistableBundle; +import android.provider.Settings; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; import android.telephony.CarrierConfigManager; @@ -96,6 +97,10 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); + Intent intent = mPreference.getIntent(); + if (intent != null) { + intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); + } if (!isAvailable()) { // Set category as invisible final Preference preferenceCateogry = screen.findPreference(KEY_PREFERENCE_CATEGORY); diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java index bc2441619b0..1644b39825c 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java @@ -17,7 +17,9 @@ package com.android.settings.wifi.calling; import android.app.settings.SettingsEnums; +import android.content.Intent; import android.os.Bundle; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.util.Log; @@ -25,6 +27,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -33,6 +36,7 @@ import com.android.ims.ImsManager; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; +import com.android.settings.network.SubscriptionUtil; import com.android.settings.search.actionbar.SearchMenuController; import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; @@ -88,10 +92,30 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes mPagerAdapter = new WifiCallingViewPagerAdapter(getChildFragmentManager(), mViewPager); mViewPager.setAdapter(mPagerAdapter); mViewPager.addOnPageChangeListener(new InternalViewPagerListener()); - + maybeSetViewForSubId(); return view; } + private void maybeSetViewForSubId() { + if (mSil == null) { + return; + } + Intent intent = getActivity().getIntent(); + if (intent == null) { + return; + } + int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + if (SubscriptionManager.isValidSubscriptionId(subId)) { + for (SubscriptionInfo subInfo : mSil) { + if (subId == subInfo.getSubscriptionId()) { + mViewPager.setCurrentItem(mSil.indexOf(subInfo)); + break; + } + } + } + } + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -122,7 +146,8 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes return R.string.help_uri_wifi_calling; } - private final class WifiCallingViewPagerAdapter extends FragmentPagerAdapter { + @VisibleForTesting + final class WifiCallingViewPagerAdapter extends FragmentPagerAdapter { private final RtlCompatibleViewPager mViewPager; public WifiCallingViewPagerAdapter(FragmentManager fragmentManager, @@ -168,17 +193,22 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes } } + @VisibleForTesting + boolean isWfcEnabledByPlatform(SubscriptionInfo info) { + ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); + return imsManager.isWfcEnabledByPlatform(); + } + private void updateSubList() { - mSil = SubscriptionManager.from(getActivity()).getActiveSubscriptionInfoList(true); + mSil = SubscriptionUtil.getActiveSubscriptions( + getContext().getSystemService(SubscriptionManager.class)); // Only config Wfc if it's enabled by platform. if (mSil == null) { return; } for (int i = 0; i < mSil.size(); ) { - ImsManager imsManager = ImsManager.getInstance(getActivity(), - mSil.get(i).getSimSlotIndex()); - if (!imsManager.isWfcEnabledByPlatform()) { + if (!isWfcEnabledByPlatform(mSil.get(i))) { mSil.remove(i); } else { i++; diff --git a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java index 9eb62f6ee9a..1a0126e4fd6 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java @@ -24,7 +24,9 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.Intent; import android.os.PersistableBundle; +import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -88,6 +90,8 @@ public class WifiCallingPreferenceControllerTest { when(mPreferenceScreen.findPreference( WifiCallingPreferenceController.KEY_PREFERENCE_CATEGORY)).thenReturn( mPreferenceCategory); + when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn( + mPreference); } @Test @@ -158,6 +162,15 @@ public class WifiCallingPreferenceControllerTest { assertThat(mPreferenceCategory.isVisible()).isFalse(); } + @Test + public void displayPreference_available_setsSubscriptionIdOnIntent() { + Intent intent = new Intent(); + mPreference.setIntent(intent); + mController.displayPreference(mPreferenceScreen); + assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isEqualTo(SUB_ID); + } + @Test public void getAvailabilityStatus_noWiFiCalling_shouldReturnUnsupported() { mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java new file mode 100644 index 00000000000..a87ac322952 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2019 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.wifi.calling; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Intent; +import android.provider.Settings; +import android.telephony.SubscriptionInfo; +import android.view.View; + +import androidx.fragment.app.FragmentActivity; + +import com.android.settings.R; +import com.android.settings.network.SubscriptionUtil; +import com.android.settings.widget.RtlCompatibleViewPager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.shadows.androidx.fragment.FragmentController; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +@RunWith(RobolectricTestRunner.class) +public class WifiCallingSettingsTest { + + private WifiCallingSettings mFragment; + + @Before + public void setUp() { + mFragment = spy(new WifiCallingSettings()); + } + + @Test + public void setupFragment_noSubscriptions_noCrash() { + FragmentController.setupFragment(mFragment, FragmentActivity.class, 0 /* containerViewId*/, + null /* bundle */); + } + + @Test + public void setupFragment_oneSubscription_noCrash() { + SubscriptionInfo info = mock(SubscriptionInfo.class); + when(info.getSubscriptionId()).thenReturn(111); + + SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>( + Collections.singletonList(info))); + doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class)); + + Intent intent = new Intent(); + intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId()); + FragmentController.of(mFragment, intent).create(0 /* containerViewId*/, + null /* bundle */).start().resume().visible().get(); + + View view = mFragment.getView(); + RtlCompatibleViewPager pager = view.findViewById(R.id.view_pager); + WifiCallingSettings.WifiCallingViewPagerAdapter adapter = + (WifiCallingSettings.WifiCallingViewPagerAdapter) pager.getAdapter(); + assertThat(adapter.getCount()).isEqualTo(1); + } + + @Test + public void setupFragment_twoSubscriptions_correctSelection() { + SubscriptionInfo info1 = mock(SubscriptionInfo.class); + SubscriptionInfo info2 = mock(SubscriptionInfo.class); + when(info1.getSubscriptionId()).thenReturn(111); + when(info2.getSubscriptionId()).thenReturn(222); + + SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>( + Arrays.asList(info1, info2))); + doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class)); + + Intent intent = new Intent(); + intent.putExtra(Settings.EXTRA_SUB_ID, info2.getSubscriptionId()); + FragmentController.of(mFragment, intent).create(0 /* containerViewId*/, + null /* bundle */).start().resume().visible().get(); + + View view = mFragment.getView(); + RtlCompatibleViewPager pager = view.findViewById(R.id.view_pager); + assertThat(pager.getCurrentItem()).isEqualTo(1); + + WifiCallingSettings.WifiCallingViewPagerAdapter adapter = + (WifiCallingSettings.WifiCallingViewPagerAdapter) pager.getAdapter(); + assertThat(adapter.getCount()).isEqualTo(2); + } +}