Merge "Close Wi-Fi Calling screen if provisioning status changes to disallow"

This commit is contained in:
Brad Ebinger
2019-02-14 21:01:05 +00:00
committed by Gerrit Code Review
2 changed files with 167 additions and 5 deletions

View File

@@ -33,6 +33,7 @@ import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.ims.ProvisioningManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -42,7 +43,9 @@ import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import com.android.ims.ImsConfig; import com.android.ims.ImsConfig;
import com.android.ims.ImsException;
import com.android.ims.ImsManager; import com.android.ims.ImsManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone;
import com.android.settings.R; import com.android.settings.R;
@@ -150,6 +153,19 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
} }
}; };
private final ProvisioningManager.Callback mProvisioningCallback =
new ProvisioningManager.Callback() {
@Override
public void onProvisioningIntChanged(int item, int value) {
if (item == ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED
|| item == ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) {
// The provisioning policy might have changed. Update the body to make sure
// this change takes effect if needed.
updateBody();
}
}
};
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
@@ -219,6 +235,11 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
return 0; return 0;
} }
@VisibleForTesting
ImsManager getImsManager() {
return ImsManager.getInstance(getActivity(), SubscriptionManager.getPhoneId(mSubId));
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -234,8 +255,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
} }
mImsManager = ImsManager.getInstance( mImsManager = getImsManager();
getActivity(), SubscriptionManager.getPhoneId(mSubId));
mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE); mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
mButtonWfcMode.setOnPreferenceChangeListener(this); mButtonWfcMode.setOnPreferenceChangeListener(this);
@@ -272,6 +292,13 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
} }
private void updateBody() { private void updateBody() {
if (!mImsManager.isWfcProvisionedOnDevice()) {
// This screen is not allowed to be shown due to provisioning policy and should
// therefore be closed.
finish();
return;
}
CarrierConfigManager configManager = (CarrierConfigManager) CarrierConfigManager configManager = (CarrierConfigManager)
getSystemService(Context.CARRIER_CONFIG_SERVICE); getSystemService(Context.CARRIER_CONFIG_SERVICE);
boolean isWifiOnlySupported = true; boolean isWifiOnlySupported = true;
@@ -333,6 +360,14 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) { if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) {
showAlert(intent); showAlert(intent);
} }
// Register callback for provisioning changes.
try {
mImsManager.getConfigInterface().addConfigCallback(mProvisioningCallback);
} catch (ImsException e) {
Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
}
} }
@Override @Override
@@ -351,6 +386,15 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
} }
context.unregisterReceiver(mIntentReceiver); context.unregisterReceiver(mIntentReceiver);
// Remove callback for provisioning changes.
try {
mImsManager.getConfigInterface().removeConfigCallback(
mProvisioningCallback.getBinder());
} catch (ImsException e) {
Log.w(TAG, "onPause: Unable to remove callback for provisioning changes");
}
} }
/** /**

View File

@@ -18,17 +18,135 @@ package com.android.settings.wifi.calling;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
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.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.ims.ProvisioningManager;
import android.view.View;
import android.widget.TextView;
import androidx.preference.ListPreference;
import androidx.preference.PreferenceScreen;
import com.android.ims.ImsConfig;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.widget.SwitchBar;
import com.android.settings.widget.ToggleSwitch;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; 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) @RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = SettingsShadowResources.SettingsShadowTheme.class)
public class WifiCallingSettingsForSubTest { public class WifiCallingSettingsForSubTest {
private TestFragment mFragment;
private Context mContext;
private TextView mEmptyView;
@Mock private ImsManager mImsManager;
@Mock private PreferenceScreen mPreferenceScreen;
@Mock private SettingsActivity mActivity;
@Mock private SwitchBar mSwitchBar;
@Mock private ToggleSwitch mToggleSwitch;
@Mock private View mView;
@Mock private ImsConfig mImsConfig;
@Before
public void setUp() throws NoSuchFieldException, ImsException {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest();
mContext = RuntimeEnvironment.application;
doReturn(mContext.getTheme()).when(mActivity).getTheme();
mFragment = spy(new TestFragment());
doReturn(mActivity).when(mFragment).getActivity();
doReturn(mock(Intent.class)).when(mActivity).getIntent();
doReturn(mContext.getResources()).when(mFragment).getResources();
doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
final Bundle bundle = new Bundle();
when(mFragment.getArguments()).thenReturn(bundle);
doNothing().when(mFragment).addPreferencesFromResource(anyInt());
doReturn(mock(ListPreference.class)).when(mFragment).findPreference(any());
doNothing().when(mFragment).finish();
doReturn(mView).when(mFragment).getView();
mEmptyView = new TextView(mContext);
doReturn(mEmptyView).when(mView).findViewById(android.R.id.empty);
ReflectionHelpers.setField(mSwitchBar, "mSwitch", mToggleSwitch);
doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar);
doReturn(mImsManager).when(mFragment).getImsManager();
doReturn(mImsConfig).when(mImsManager).getConfigInterface();
doReturn(true).when(mImsManager).isWfcProvisionedOnDevice();
mFragment.onAttach(mContext);
mFragment.onCreate(null);
mFragment.onActivityCreated(null);
}
@Test @Test
public void getHelpResource_shouldReturn0() { public void getHelpResource_shouldReturn0() {
assertThat(new WifiCallingSettingsForSub().getHelpResource()) assertThat(mFragment.getHelpResource()).isEqualTo(0);
.isEqualTo(0); }
@Test
public void onResume_provisioningAllowed_shouldNotFinish() throws ImsException {
// 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.
doReturn(false).when(mImsManager).isWfcProvisionedOnDevice();
mFragment.onResume();
// Verify that finish() is called
verify(mFragment).finish();
}
@Test
public void onResumeOnPause_provisioningCallbackRegistration() throws ImsException {
// Verify that provisioning callback is registered after call to onResume().
mFragment.onResume();
verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));
// Verify that provisioning callback is unregistered after call to onPause.
mFragment.onPause();
verify(mImsConfig).removeConfigCallback(any());
}
protected static class TestFragment extends WifiCallingSettingsForSub {
@Override
protected Object getSystemService(final String name) {
return null;
}
} }
} }