| /* |
| * Copyright (C) 2018 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 junit.framework.Assert.assertEquals; |
| |
| import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import static org.mockito.Matchers.any; |
| import static org.mockito.Matchers.anyInt; |
| import static org.mockito.Matchers.eq; |
| import static org.mockito.Mockito.doNothing; |
| 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.times; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import android.app.Activity; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.os.Bundle; |
| import android.os.PersistableBundle; |
| import android.telephony.CarrierConfigManager; |
| import android.telephony.TelephonyManager; |
| import android.telephony.ims.ImsMmTelManager; |
| import android.view.View; |
| import android.widget.TextView; |
| |
| import androidx.preference.Preference; |
| import androidx.preference.PreferenceScreen; |
| |
| import com.android.settings.R; |
| import com.android.settings.SettingsActivity; |
| import com.android.settings.network.ims.MockWifiCallingQueryImsState; |
| import com.android.settings.network.ims.WifiCallingQueryImsState; |
| import com.android.settings.testutils.shadow.ShadowFragment; |
| import com.android.settings.widget.SettingsMainSwitchBar; |
| import com.android.settings.widget.SettingsMainSwitchPreference; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.mockito.ArgumentCaptor; |
| import org.mockito.Mock; |
| import org.mockito.MockitoAnnotations; |
| import org.robolectric.RobolectricTestRunner; |
| import org.robolectric.RuntimeEnvironment; |
| import org.robolectric.annotation.Config; |
| import org.robolectric.util.ReflectionHelpers; |
| |
| @Config(shadows = ShadowFragment.class) |
| @RunWith(RobolectricTestRunner.class) |
| public class WifiCallingSettingsForSubTest { |
| private static final int SUB_ID = 2; |
| |
| private static final String SWITCH_BAR = "wifi_calling_switch_bar"; |
| private static final String BUTTON_WFC_MODE = "wifi_calling_mode"; |
| private static final String BUTTON_WFC_ROAMING_MODE = "wifi_calling_roaming_mode"; |
| private static final String PREFERENCE_NO_OPTIONS_DESC = "no_options_description"; |
| private static final String TEST_EMERGENCY_ADDRESS_CARRIER_APP = |
| "com.android.settings/.wifi.calling.TestEmergencyAddressCarrierApp"; |
| |
| private TestFragment mFragment; |
| private Context mContext; |
| private final PersistableBundle mBundle = new PersistableBundle(); |
| |
| private MockWifiCallingQueryImsState mQueryImsState; |
| private SettingsMainSwitchBar mSwitchBar; |
| |
| @Mock |
| private static CarrierConfigManager sCarrierConfigManager; |
| @Mock |
| private CarrierConfigManager mMockConfigManager; |
| @Mock |
| private ImsMmTelManager mImsMmTelManager; |
| @Mock |
| private TelephonyManager mTelephonyManager; |
| @Mock |
| private PreferenceScreen mPreferenceScreen; |
| @Mock |
| private SettingsActivity mActivity; |
| @Mock |
| private View mView; |
| @Mock |
| private SettingsMainSwitchPreference mSwitchBarPreference; |
| @Mock |
| private LinkifyDescriptionPreference mDescriptionView; |
| @Mock |
| private ListWithEntrySummaryPreference mButtonWfcMode; |
| @Mock |
| private ListWithEntrySummaryPreference mButtonWfcRoamingMode; |
| @Mock |
| private Preference mUpdateAddress; |
| |
| @Before |
| public void setUp() throws Exception { |
| MockitoAnnotations.initMocks(this); |
| |
| mContext = RuntimeEnvironment.application; |
| doReturn(mContext.getTheme()).when(mActivity).getTheme(); |
| |
| mFragment = spy(new TestFragment()); |
| mFragment.setSwitchBar(mSwitchBarPreference); |
| doReturn(mActivity).when(mFragment).getActivity(); |
| doReturn(mContext).when(mFragment).getContext(); |
| doReturn(mock(Intent.class)).when(mActivity).getIntent(); |
| doReturn(mContext.getResources()).when(mFragment).getResources(); |
| doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); |
| doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt()); |
| final Bundle bundle = new Bundle(); |
| when(mFragment.getArguments()).thenReturn(bundle); |
| doNothing().when(mFragment).addPreferencesFromResource(anyInt()); |
| doNothing().when(mFragment).finish(); |
| doReturn(mView).when(mFragment).getView(); |
| |
| mSwitchBar = new SettingsMainSwitchBar(mContext); |
| doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar); |
| |
| mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID); |
| |
| doReturn(mImsMmTelManager).when(mFragment).getImsMmTelManager(); |
| mQueryImsState.setIsProvisionedOnDevice(true); |
| mQueryImsState.setIsEnabledByPlatform(true); |
| mQueryImsState.setIsEnabledByUser(true); |
| mQueryImsState.setIsTtyOnVolteEnabled(true); |
| doReturn(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED) |
| .when(mImsMmTelManager).getVoWiFiModeSetting(); |
| doReturn(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED) |
| .when(mImsMmTelManager).getVoWiFiRoamingModeSetting(); |
| |
| doReturn(mBundle).when(sCarrierConfigManager).getConfigForSubId(anyInt()); |
| setDefaultCarrierConfigValues(); |
| |
| doReturn(sCarrierConfigManager).when(mActivity).getSystemService( |
| CarrierConfigManager.class); |
| doReturn(mContext.getResources()).when(mFragment).getResourcesForSubId(); |
| doNothing().when(mFragment).startActivityForResult(any(Intent.class), anyInt()); |
| |
| mFragment.onAttach(mContext); |
| mFragment.onCreate(null); |
| mFragment.onActivityCreated(null); |
| } |
| |
| private void setDefaultCarrierConfigValues() { |
| mBundle.putBoolean( |
| CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, false); |
| mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, true); |
| mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, true); |
| mBundle.putString( |
| CarrierConfigManager.KEY_WFC_EMERGENCY_ADDRESS_CARRIER_APP_STRING, |
| TEST_EMERGENCY_ADDRESS_CARRIER_APP); |
| } |
| |
| @Test |
| public void getHelpResource_shouldReturn0() { |
| assertThat(mFragment.getHelpResource()).isEqualTo(0); |
| } |
| |
| @Test |
| public void onResume_provisioningAllowed_shouldNotFinish() { |
| // Call onResume while provisioning is allowed. |
| mFragment.onResume(); |
| |
| // Verify that finish() is not called. |
| verify(mFragment, never()).finish(); |
| } |
| |
| @Test |
| public void onResume_provisioningDisallowed_shouldFinish() { |
| // Call onResume while provisioning is disallowed. |
| mQueryImsState.setIsProvisionedOnDevice(false); |
| mFragment.onResume(); |
| |
| // Verify that finish() is called |
| verify(mFragment).finish(); |
| } |
| |
| @Test |
| public void onResumeOnPause_provisioningCallbackRegistration() throws Exception { |
| // Verify that provisioning callback is registered after call to onResume(). |
| mFragment.onResume(); |
| verify(mFragment).registerProvisioningChangedCallback(); |
| |
| // Verify that provisioning callback is unregistered after call to onPause. |
| mFragment.onPause(); |
| verify(mFragment).unregisterProvisioningChangedCallback(); |
| } |
| |
| @Test |
| public void onResume_useWfcHomeModeConfigFalseAndEditable_shouldShowWfcRoaming() { |
| // Call onResume to update the WFC roaming preference. |
| mFragment.onResume(); |
| |
| // Check that WFC roaming preference is shown. |
| verify(mButtonWfcRoamingMode, times(1)).setVisible(true); |
| } |
| |
| @Test |
| public void onResume_useWfcHomeModeConfigTrueAndEditable_shouldHideWfcRoaming() { |
| mBundle.putBoolean( |
| CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true); |
| mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, true); |
| |
| // Call onResume to update the WFC roaming preference. |
| mFragment.onResume(); |
| |
| // Check that WFC roaming preference is hidden. |
| verify(mButtonWfcRoamingMode, times(1)).setVisible(false); |
| } |
| |
| @Test |
| public void onResume_useWfcHomeModeConfigFalseAndNotEditable_shouldHideWfcRoaming() { |
| mBundle.putBoolean( |
| CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, false); |
| mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false); |
| |
| // Call onResume to update the WFC roaming preference. |
| mFragment.onResume(); |
| |
| // Check that WFC roaming preference is hidden. |
| verify(mButtonWfcRoamingMode, times(1)).setVisible(false); |
| } |
| |
| @Test |
| public void onResume_useWfcHomeModeConfigTrueAndNotEditable_shouldHideWfcRoaming() { |
| mBundle.putBoolean( |
| CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true); |
| mBundle.putBoolean(CarrierConfigManager.KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false); |
| |
| // Call onResume to update the WFC roaming preference. |
| mFragment.onResume(); |
| |
| // Check that WFC roaming preference is hidden. |
| verify(mButtonWfcRoamingMode, times(1)).setVisible(false); |
| } |
| |
| @Test |
| public void onPreferenceChange_useWfcHomeModeConfigFalse_shouldNotSetWfcRoaming() { |
| // Call onResume to update carrier config values. |
| mFragment.onResume(); |
| |
| // Set the WFC home mode. |
| mFragment.onPreferenceChange(mButtonWfcMode, |
| String.valueOf(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| |
| // Check that only WFC home mode is set. |
| verify(mImsMmTelManager, times(1)).setVoWiFiModeSetting( |
| eq(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| verify(mImsMmTelManager, never()).setVoWiFiRoamingModeSetting( |
| eq(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| } |
| |
| @Test |
| public void onPreferenceChange_useWfcHomeModeConfigTrue_shouldSetWfcRoaming() { |
| mBundle.putBoolean( |
| CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true); |
| |
| // Call onResume to update carrier config values. |
| mFragment.onResume(); |
| |
| // Set the WFC home mode. |
| mFragment.onPreferenceChange(mButtonWfcMode, |
| String.valueOf(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| |
| // Check that both WFC home mode and roaming mode are set. |
| verify(mImsMmTelManager, times(1)).setVoWiFiModeSetting( |
| eq(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| verify(mImsMmTelManager, times(1)).setVoWiFiRoamingModeSetting( |
| eq(ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); |
| } |
| |
| @Test |
| public void onSwitchChanged_enableSetting_shouldLaunchWfcDisclaimerFragment() { |
| final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); |
| |
| mFragment.onSwitchChanged(null, true); |
| |
| // Check the WFC disclaimer fragment is launched. |
| verify(mFragment).startActivityForResult(intentCaptor.capture(), |
| eq(WifiCallingSettingsForSub.REQUEST_CHECK_WFC_DISCLAIMER)); |
| final Intent intent = intentCaptor.getValue(); |
| assertThat(intent.getStringExtra(EXTRA_SHOW_FRAGMENT)) |
| .isEqualTo(WifiCallingDisclaimerFragment.class.getName()); |
| } |
| |
| @Test |
| public void onActivityResult_finishWfcDisclaimerFragment_shouldLaunchCarrierActivity() { |
| final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); |
| |
| // Emulate the WfcDisclaimerActivity finish. |
| mFragment.onActivityResult(WifiCallingSettingsForSub.REQUEST_CHECK_WFC_DISCLAIMER, |
| Activity.RESULT_OK, null); |
| |
| // Check the WFC emergency address activity is launched. |
| verify(mFragment).startActivityForResult(intentCaptor.capture(), |
| eq(WifiCallingSettingsForSub.REQUEST_CHECK_WFC_EMERGENCY_ADDRESS)); |
| final Intent intent = intentCaptor.getValue(); |
| assertEquals(intent.getComponent(), ComponentName.unflattenFromString( |
| TEST_EMERGENCY_ADDRESS_CARRIER_APP)); |
| } |
| |
| @Test |
| public void onActivityResult_finishCarrierActivity_shouldShowWfcPreference() { |
| ReflectionHelpers.setField(mFragment, "mButtonWfcMode", mButtonWfcMode); |
| ReflectionHelpers.setField(mFragment, "mButtonWfcRoamingMode", mButtonWfcRoamingMode); |
| ReflectionHelpers.setField(mFragment, "mUpdateAddress", mUpdateAddress); |
| |
| mFragment.onActivityResult(WifiCallingSettingsForSub.REQUEST_CHECK_WFC_EMERGENCY_ADDRESS, |
| Activity.RESULT_OK, null); |
| |
| // Check the WFC preferences is added. |
| verify(mButtonWfcMode).setVisible(true); |
| verify(mButtonWfcRoamingMode).setVisible(true); |
| verify(mUpdateAddress).setVisible(true); |
| // Check the WFC enable request. |
| verify(mImsMmTelManager).setVoWiFiSettingEnabled(true); |
| } |
| |
| @Test |
| public void onSwitchChanged_disableSetting_shouldNotLaunchWfcDisclaimerFragment() { |
| mFragment.onSwitchChanged(null, false); |
| |
| // Check the WFC disclaimer fragment is not launched. |
| verify(mFragment, never()).startActivityForResult(any(Intent.class), anyInt()); |
| } |
| |
| protected class TestFragment extends WifiCallingSettingsForSub { |
| private SettingsMainSwitchPreference mSwitchPref; |
| |
| protected void setSwitchBar(SettingsMainSwitchPreference switchPref) { |
| mSwitchPref = switchPref; |
| } |
| |
| @Override |
| public <T extends Preference> T findPreference(CharSequence key) { |
| if (SWITCH_BAR.equals(key)) { |
| return (T) mSwitchPref; |
| } |
| if (BUTTON_WFC_MODE.equals(key)) { |
| return (T) mButtonWfcMode; |
| } |
| if (BUTTON_WFC_ROAMING_MODE.equals(key)) { |
| return (T) mButtonWfcRoamingMode; |
| } |
| if (PREFERENCE_NO_OPTIONS_DESC.equals(key)) { |
| return (T) mDescriptionView; |
| } |
| return (T) mock(ListWithEntrySummaryPreference.class); |
| } |
| |
| @Override |
| protected Object getSystemService(final String name) { |
| switch (name) { |
| case Context.TELEPHONY_SERVICE: |
| return mTelephonyManager; |
| case Context.CARRIER_CONFIG_SERVICE: |
| return sCarrierConfigManager; |
| default: |
| return null; |
| } |
| } |
| |
| @Override |
| TelephonyManager getTelephonyManagerForSub(int subId) { |
| return mTelephonyManager; |
| } |
| |
| @Override |
| WifiCallingQueryImsState queryImsState(int subId) { |
| return mQueryImsState; |
| } |
| |
| @Override |
| void showAlert(Intent intent) { |
| } |
| } |
| } |