diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java index 3f770594931..e928dba734c 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java @@ -34,8 +34,8 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.ims.ImsManager; import com.android.settings.R; +import com.android.settings.network.ims.WifiCallingQueryImsState; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -48,12 +48,12 @@ import java.util.List; public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements LifecycleObserver, OnStart, OnStop { + private static final String TAG = "WifiCallingPreference"; + @VisibleForTesting Integer mCallState; @VisibleForTesting CarrierConfigManager mCarrierConfigManager; - @VisibleForTesting - ImsManager mImsManager; private ImsMmTelManager mImsMmTelManager; @VisibleForTesting PhoneAccountHandle mSimCallManager; @@ -68,8 +68,8 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public int getAvailabilityStatus(int subId) { - return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID - && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId) + return SubscriptionManager.isValidSubscriptionId(subId) + && isWifiCallingEnabled(mContext, subId) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @@ -100,6 +100,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont if (mCallState == null) { return; } + CharSequence summaryText = null; if (mSimCallManager != null) { final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, mSimCallManager); @@ -110,53 +111,55 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont final PackageManager pm = mContext.getPackageManager(); final List resolutions = pm.queryIntentActivities(intent, 0); preference.setTitle(resolutions.get(0).loadLabel(pm)); - preference.setSummary(null); preference.setIntent(intent); } else { final String title = SubscriptionManager.getResourcesForSubId(mContext, mSubId) .getString(R.string.wifi_calling_settings_title); preference.setTitle(title); - int resId = com.android.internal.R.string.wifi_calling_off_summary; - if (mImsManager.isWfcEnabledByUser()) { - boolean useWfcHomeModeForRoaming = false; - if (mCarrierConfigManager != null) { - final PersistableBundle carrierConfig = - mCarrierConfigManager.getConfigForSubId(mSubId); - if (carrierConfig != null) { - useWfcHomeModeForRoaming = carrierConfig.getBoolean( - CarrierConfigManager - .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL); - } - } - final boolean isRoaming = getTelephonyManager(mContext, mSubId) - .isNetworkRoaming(); - final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) - ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : - mImsMmTelManager.getVoWiFiModeSetting(); - switch (wfcMode) { - case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: - resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; - break; - case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: - resId = com.android.internal.R.string - .wfc_mode_cellular_preferred_summary; - break; - case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: - resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; - break; - default: - break; + summaryText = getResourceIdForWfcMode(mSubId); + } + preference.setSummary(summaryText); + preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); + } + + private CharSequence getResourceIdForWfcMode(int subId) { + int resId = com.android.internal.R.string.wifi_calling_off_summary; + if (queryImsState(subId).isEnabledByUser()) { + boolean useWfcHomeModeForRoaming = false; + if (mCarrierConfigManager != null) { + final PersistableBundle carrierConfig = + mCarrierConfigManager.getConfigForSubId(subId); + if (carrierConfig != null) { + useWfcHomeModeForRoaming = carrierConfig.getBoolean( + CarrierConfigManager + .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL); } } - preference.setSummary( - SubscriptionManager.getResourcesForSubId(mContext, mSubId).getText(resId)); + final boolean isRoaming = getTelephonyManager(mContext, subId) + .isNetworkRoaming(); + final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) + ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : + mImsMmTelManager.getVoWiFiModeSetting(); + switch (wfcMode) { + case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: + resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; + break; + case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: + resId = com.android.internal.R.string + .wfc_mode_cellular_preferred_summary; + break; + case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: + resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; + break; + default: + break; + } } - preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); + return SubscriptionManager.getResourcesForSubId(mContext, subId).getText(resId); } public WifiCallingPreferenceController init(int subId) { mSubId = subId; - mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); mImsMmTelManager = getImsMmTelManager(mSubId); mSimCallManager = mContext.getSystemService(TelecomManager.class) .getSimCallManagerForSubscription(mSubId); @@ -164,14 +167,22 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont return this; } + @VisibleForTesting + WifiCallingQueryImsState queryImsState(int subId) { + return new WifiCallingQueryImsState(mContext, subId); + } + protected ImsMmTelManager getImsMmTelManager(int subId) { + if (!SubscriptionManager.isValidSubscriptionId(subId)) { + return null; + } return ImsMmTelManager.createForSubscriptionId(subId); } @VisibleForTesting TelephonyManager getTelephonyManager(Context context, int subId) { final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class); - if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (!SubscriptionManager.isValidSubscriptionId(subId)) { return telephonyMgr; } final TelephonyManager subscriptionTelephonyMgr = @@ -204,4 +215,23 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); } } + + private boolean isWifiCallingEnabled(Context context, int subId) { + final PhoneAccountHandle simCallManager = + context.getSystemService(TelecomManager.class) + .getSimCallManagerForSubscription(subId); + final int phoneId = SubscriptionManager.getSlotIndex(subId); + + boolean isWifiCallingEnabled; + if (simCallManager != null) { + final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent( + context, simCallManager); + + isWifiCallingEnabled = intent != null; + } else { + isWifiCallingEnabled = queryImsState(subId).isReadyToWifiCalling(); + } + + return isWifiCallingEnabled; + } } diff --git a/src/com/android/settings/wifi/calling/OWNERS b/src/com/android/settings/wifi/calling/OWNERS new file mode 100644 index 00000000000..d23f816e6fc --- /dev/null +++ b/src/com/android/settings/wifi/calling/OWNERS @@ -0,0 +1,8 @@ +# Default reviewers for this and subdirectories. +allenwtsu@google.com +andychou@google.com +bonianchen@google.com +songferngwang@google.com +tomhsu@google.com + +# Emergency approvers in case the above are not available diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java index 72e1df204f8..5c0ee9bd04c 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java @@ -22,9 +22,6 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.ims.ProvisioningManager; -import android.telephony.ims.feature.MmTelFeature; -import android.telephony.ims.stub.ImsRegistrationImplBase; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -35,11 +32,11 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; -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.network.ims.WifiCallingQueryImsState; import com.android.settings.search.actionbar.SearchMenuController; import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; @@ -196,25 +193,6 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes } } - @VisibleForTesting - boolean isWfcEnabledByPlatform(SubscriptionInfo info) { - final ImsManager imsManager = ImsManager.getInstance(getActivity(), - info.getSimSlotIndex()); - return imsManager.isWfcEnabledByPlatform(); - } - - @VisibleForTesting - boolean isWfcProvisionedOnDevice(SubscriptionInfo info) { - final ProvisioningManager provisioningMgr = - ProvisioningManager.createForSubscriptionId(info.getSubscriptionId()); - if (provisioningMgr == null) { - return true; - } - return provisioningMgr.getProvisioningStatusForCapability( - MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, - ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN); - } - private void updateSubList() { mSil = SubscriptionUtil.getActiveSubscriptions( getContext().getSystemService(SubscriptionManager.class)); @@ -225,7 +203,7 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes } for (int i = 0; i < mSil.size(); ) { final SubscriptionInfo info = mSil.get(i); - if (!isWfcEnabledByPlatform(info) || !isWfcProvisionedOnDevice(info)) { + if (!queryImsState(info.getSubscriptionId()).isWifiCallingProvisioned()) { mSil.remove(i); } else { i++; @@ -241,4 +219,9 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes getActivity().getActionBar().setTitle(title); } } + + @VisibleForTesting + WifiCallingQueryImsState queryImsState(int subId) { + return new WifiCallingQueryImsState(getContext(), subId); + } } diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index e1bd0ed9ad8..735fecc9c9a 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -30,10 +30,10 @@ import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; import android.telephony.ims.ProvisioningManager; import android.text.TextUtils; -import android.text.util.Linkify; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -47,8 +47,6 @@ import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceScreen; import com.android.ims.ImsConfig; -import com.android.ims.ImsException; -import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.settings.R; @@ -56,7 +54,7 @@ import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.core.SubSettingLauncher; -import com.android.settings.network.telephony.MobileNetworkUtils; +import com.android.settings.network.ims.WifiCallingQueryImsState; import com.android.settings.widget.SwitchBar; /** @@ -100,8 +98,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment private boolean mUseWfcHomeModeForRoaming = false; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - private ImsManager mImsManager; private ImsMmTelManager mImsMmTelManager; + private ProvisioningManager mProvisioningManager; private TelephonyManager mTelephonyManager; private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @@ -114,11 +112,13 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @Override public void onCallStateChanged(int state, String incomingNumber) { final SettingsActivity activity = (SettingsActivity) getActivity(); - final boolean isNonTtyOrTtyOnVolteEnabled = mImsManager.isNonTtyOrTtyOnVolteEnabled(); + final boolean isNonTtyOrTtyOnVolteEnabled = + queryImsState(WifiCallingSettingsForSub.this.mSubId).isAllowUserControl(); final boolean isWfcEnabled = mSwitchBar.isChecked() && isNonTtyOrTtyOnVolteEnabled; - boolean isCallStateIdle = - mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE; + boolean isCallStateIdle = getTelephonyManagerForSub( + WifiCallingSettingsForSub.this.mSubId).getCallState() + == TelephonyManager.CALL_STATE_IDLE; mSwitchBar.setEnabled(isCallStateIdle && isNonTtyOrTtyOnVolteEnabled); @@ -183,7 +183,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mEmptyView = getView().findViewById(android.R.id.empty); setEmptyView(mEmptyView); - mEmptyView.setAutoLinkMask(Linkify.WEB_URLS); final Resources res = getResourcesForSubId(); final String emptyViewText = res.getString(R.string.wifi_calling_off_explanation, res.getString(R.string.wifi_calling_off_explanation_2)); @@ -200,7 +199,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mSwitchBar.hide(); } - private void showAlert(Intent intent) { + @VisibleForTesting + void showAlert(Intent intent) { final Context context = getActivity(); final CharSequence title = intent.getCharSequenceExtra(Phone.EXTRA_KEY_ALERT_TITLE); @@ -221,7 +221,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - if (action.equals(ImsManager.ACTION_IMS_REGISTRATION_ERROR)) { + if (action.equals(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR)) { // If this fragment is active then we are immediately // showing alert on screen. There is no need to add // notification in this case. @@ -247,12 +247,31 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } @VisibleForTesting - ImsManager getImsManager() { - return ImsManager.getInstance(getActivity(), SubscriptionManager.getPhoneId(mSubId)); + TelephonyManager getTelephonyManagerForSub(int subId) { + if (mTelephonyManager == null) { + mTelephonyManager = getContext().getSystemService(TelephonyManager.class); + } + return mTelephonyManager.createForSubscriptionId(subId); + } + + @VisibleForTesting + WifiCallingQueryImsState queryImsState(int subId) { + return new WifiCallingQueryImsState(getContext(), subId); + } + + @VisibleForTesting + ProvisioningManager getImsProvisioningManager() { + if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { + return null; + } + return ProvisioningManager.createForSubscriptionId(mSubId); } @VisibleForTesting ImsMmTelManager getImsMmTelManager() { + if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { + return null; + } return ImsMmTelManager.createForSubscriptionId(mSubId); } @@ -271,11 +290,9 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); } - mImsManager = getImsManager(); + mProvisioningManager = getImsProvisioningManager(); mImsMmTelManager = getImsMmTelManager(); - mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)); - mButtonWfcMode = findPreference(BUTTON_WFC_MODE); mButtonWfcMode.setOnPreferenceChangeListener(this); @@ -286,7 +303,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener); mIntentFilter = new IntentFilter(); - mIntentFilter.addAction(ImsManager.ACTION_IMS_REGISTRATION_ERROR); + mIntentFilter.addAction(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR); } @Override @@ -312,7 +329,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @VisibleForTesting boolean isWfcProvisionedOnDevice() { - return MobileNetworkUtils.isWfcProvisionedOnDevice(mSubId); + return queryImsState(mSubId).isWifiCallingProvisioned(); } private void updateBody() { @@ -342,7 +359,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } } - Resources res = getResourcesForSubId(); + final Resources res = getResourcesForSubId(); mButtonWfcMode.setTitle(res.getString(R.string.wifi_calling_mode_title)); mButtonWfcMode.setDialogTitle(res.getString(R.string.wifi_calling_mode_dialog_title)); mButtonWfcRoamingMode.setTitle(res.getString(R.string.wifi_calling_roaming_mode_title)); @@ -383,8 +400,9 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } // NOTE: Buttons will be enabled/disabled in mPhoneStateListener - final boolean wfcEnabled = mImsManager.isWfcEnabledByUser() - && mImsManager.isNonTtyOrTtyOnVolteEnabled(); + final WifiCallingQueryImsState queryIms = queryImsState(mSubId); + final boolean wfcEnabled = queryIms.isEnabledByUser() + && queryIms.isAllowUserControl(); mSwitch.setChecked(wfcEnabled); final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); @@ -397,18 +415,18 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment public void onResume() { super.onResume(); - final Context context = getActivity(); - updateBody(); - if (mImsManager.isWfcEnabledByPlatform()) { - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); + if (queryImsState(mSubId).isWifiCallingSupported()) { + getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener, + PhoneStateListener.LISTEN_CALL_STATE); mSwitchBar.addOnSwitchChangeListener(this); mValidListener = true; } + final Context context = getActivity(); context.registerReceiver(mIntentReceiver, mIntentFilter); final Intent intent = getActivity().getIntent(); @@ -417,12 +435,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } // Register callback for provisioning changes. - try { - mImsManager.getConfigInterface().addConfigCallback(mProvisioningCallback); - } catch (ImsException e) { - Log.w(TAG, "onResume: Unable to register callback for provisioning changes."); - } - + registerProvisioningChangedCallback(); } @Override @@ -434,7 +447,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment if (mValidListener) { mValidListener = false; - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); + getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener, + PhoneStateListener.LISTEN_NONE); mSwitchBar.removeOnSwitchChangeListener(this); } @@ -442,13 +456,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment 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"); - } - + unregisterProvisioningChangedCallback(); } /** @@ -508,7 +516,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment */ private void updateWfcMode(boolean wfcEnabled) { Log.i(TAG, "updateWfcMode(" + wfcEnabled + ")"); - mImsManager.setWfcSetting(wfcEnabled); + mImsMmTelManager.setVoWiFiSettingEnabled(wfcEnabled); final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); @@ -524,8 +532,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - final Context context = getActivity(); - Log.d(TAG, "WFC activity request = " + requestCode + " result = " + resultCode); switch (requestCode) { @@ -619,7 +625,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment private CharSequence getWfcModeSummary(int wfcMode) { int resId = com.android.internal.R.string.wifi_calling_off_summary; - if (mImsManager.isWfcEnabledByUser()) { + if (queryImsState(mSubId).isEnabledByUser()) { switch (wfcMode) { case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; @@ -639,6 +645,27 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @VisibleForTesting Resources getResourcesForSubId() { - return SubscriptionManager.getResourcesForSubId(getContext(), mSubId, false); + return SubscriptionManager.getResourcesForSubId(getContext(), mSubId); + } + + @VisibleForTesting + void registerProvisioningChangedCallback() { + if (mProvisioningManager == null) { + return; + } + try { + mProvisioningManager.registerProvisioningChangedCallback(getContext().getMainExecutor(), + mProvisioningCallback); + } catch (Exception ex) { + Log.w(TAG, "onResume: Unable to register callback for provisioning changes."); + } + } + + @VisibleForTesting + void unregisterProvisioningChangedCallback() { + if (mProvisioningManager == null) { + return; + } + mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback); } } diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java index 967146c6d59..69adf55be9c 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java @@ -43,10 +43,9 @@ import androidx.slice.builders.ListBuilder.RowBuilder; import androidx.slice.builders.SliceAction; import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.network.telephony.MobileNetworkUtils; +import com.android.settings.network.ims.WifiCallingQueryImsState; import com.android.settings.slices.SliceBroadcastReceiver; import java.util.concurrent.Callable; @@ -132,57 +131,39 @@ public class WifiCallingSliceHelper { */ public Slice createWifiCallingSlice(Uri sliceUri) { final int subId = getDefaultVoiceSubId(); - Resources res = getResourcesForSubId(subId); - if (subId <= SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (!SubscriptionManager.isValidSubscriptionId(subId)) { Log.d(TAG, "Invalid subscription Id"); return null; } - final ImsManager imsManager = getImsManager(subId); - - if (!imsManager.isWfcEnabledByPlatform() - || !isWfcProvisionedOnDevice(subId)) { + if (!queryImsState(subId).isWifiCallingProvisioned()) { Log.d(TAG, "Wifi calling is either not provisioned or not enabled by Platform"); return null; } - try { - final boolean isWifiCallingEnabled = isWifiCallingEnabled(imsManager); - final Intent activationAppIntent = - getWifiCallingCarrierActivityIntent(subId); + final boolean isWifiCallingEnabled = isWifiCallingEnabled(); + final Intent activationAppIntent = + getWifiCallingCarrierActivityIntent(subId); - // Send this actionable wifi calling slice to toggle the setting - // only when there is no need for wifi calling activation with the server - if (activationAppIntent != null && !isWifiCallingEnabled) { - Log.d(TAG, "Needs Activation"); - // Activation needed for the next action of the user - // Give instructions to go to settings app - return getNonActionableWifiCallingSlice( - res.getText(R.string.wifi_calling_settings_title), - res.getText(R.string.wifi_calling_settings_activation_instructions), - sliceUri, getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY)); - } - return getWifiCallingSlice(sliceUri, isWifiCallingEnabled, subId); - } catch (InterruptedException | TimeoutException | ExecutionException e) { - Log.e(TAG, "Unable to read the current WiFi calling status", e); - return null; + // Send this actionable wifi calling slice to toggle the setting + // only when there is no need for wifi calling activation with the server + if (activationAppIntent != null && !isWifiCallingEnabled) { + Log.d(TAG, "Needs Activation"); + // Activation needed for the next action of the user + // Give instructions to go to settings app + final Resources res = getResourcesForSubId(subId); + return getNonActionableWifiCallingSlice( + res.getText(R.string.wifi_calling_settings_title), + res.getText(R.string.wifi_calling_settings_activation_instructions), + sliceUri, getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY)); } + return getWifiCallingSlice(sliceUri, isWifiCallingEnabled, subId); } - private boolean isWifiCallingEnabled(ImsManager imsManager) - throws InterruptedException, ExecutionException, TimeoutException { - final FutureTask isWifiOnTask = new FutureTask<>(new Callable() { - @Override - public Boolean call() { - return imsManager.isWfcEnabledByUser(); - } - }); - final ExecutorService executor = Executors.newSingleThreadExecutor(); - executor.execute(isWifiOnTask); - - return isWifiOnTask.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS) - && imsManager.isNonTtyOrTtyOnVolteEnabled(); + private boolean isWifiCallingEnabled() { + final WifiCallingQueryImsState queryState = queryImsState(getDefaultVoiceSubId()); + return queryState.isEnabledByUser() && queryState.isAllowUserControl(); } /** @@ -191,7 +172,7 @@ public class WifiCallingSliceHelper { */ private Slice getWifiCallingSlice(Uri sliceUri, boolean isWifiCallingEnabled, int subId) { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal); - Resources res = getResourcesForSubId(subId); + final Resources res = getResourcesForSubId(subId); return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) @@ -227,7 +208,7 @@ public class WifiCallingSliceHelper { public Slice createWifiCallingPreferenceSlice(Uri sliceUri) { final int subId = getDefaultVoiceSubId(); - if (subId <= SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (!SubscriptionManager.isValidSubscriptionId(subId)) { Log.d(TAG, "Invalid Subscription Id"); return null; } @@ -236,24 +217,22 @@ public class WifiCallingSliceHelper { CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false); final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); - final ImsManager imsManager = getImsManager(subId); - final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); - - if (!imsManager.isWfcEnabledByPlatform() - || !isWfcProvisionedOnDevice(subId)) { - Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform"); - return null; - } if (!isWifiCallingPrefEditable) { Log.d(TAG, "Wifi calling preference is not editable"); return null; } + if (!queryImsState(subId).isWifiCallingProvisioned()) { + Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform"); + return null; + } + boolean isWifiCallingEnabled = false; int wfcMode = -1; try { - isWifiCallingEnabled = isWifiCallingEnabled(imsManager); + final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); + isWifiCallingEnabled = isWifiCallingEnabled(); wfcMode = getWfcMode(imsMmTelManager); } catch (InterruptedException | ExecutionException | TimeoutException e) { Log.e(TAG, "Unable to get wifi calling preferred mode", e); @@ -261,7 +240,7 @@ public class WifiCallingSliceHelper { } if (!isWifiCallingEnabled) { // wifi calling is not enabled. Ask user to enable wifi calling - Resources res = getResourcesForSubId(subId); + final Resources res = getResourcesForSubId(subId); return getNonActionableWifiCallingSlice( res.getText(R.string.wifi_calling_mode_title), res.getText(R.string.wifi_calling_turn_on), @@ -286,7 +265,7 @@ public class WifiCallingSliceHelper { Uri sliceUri, int subId) { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal); - Resources res = getResourcesForSubId(subId); + final Resources res = getResourcesForSubId(subId); // Top row shows information on current preference state final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)); @@ -332,7 +311,7 @@ public class WifiCallingSliceHelper { int preferenceTitleResId, String action, boolean checked, int subId) { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.radio_button_check); - Resources res = getResourcesForSubId(subId); + final Resources res = getResourcesForSubId(subId); return new RowBuilder() .setTitle(res.getText(preferenceTitleResId)) .setTitleItem(SliceAction.createToggle(getBroadcastIntent(action), @@ -347,7 +326,7 @@ public class WifiCallingSliceHelper { * @return summary/name of the wifi calling preference */ private CharSequence getWifiCallingPreferenceSummary(int wfcMode, int subId) { - Resources res = getResourcesForSubId(subId); + final Resources res = getResourcesForSubId(subId); switch (wfcMode) { case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: return res.getText( @@ -363,10 +342,6 @@ public class WifiCallingSliceHelper { } } - protected ImsManager getImsManager(int subId) { - return ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(subId)); - } - protected ImsMmTelManager getImsMmTelManager(int subId) { return ImsMmTelManager.createForSubscriptionId(subId); } @@ -393,12 +368,11 @@ public class WifiCallingSliceHelper { public void handleWifiCallingChanged(Intent intent) { final int subId = getDefaultVoiceSubId(); - if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - final ImsManager imsManager = getImsManager(subId); - if (imsManager.isWfcEnabledByPlatform() - && isWfcProvisionedOnDevice(subId)) { - final boolean currentValue = imsManager.isWfcEnabledByUser() - && imsManager.isNonTtyOrTtyOnVolteEnabled(); + if (SubscriptionManager.isValidSubscriptionId(subId)) { + final WifiCallingQueryImsState queryState = queryImsState(subId); + if (queryState.isWifiCallingProvisioned()) { + final boolean currentValue = queryState.isEnabledByUser() + && queryState.isAllowUserControl(); final boolean newValue = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, currentValue); final Intent activationAppIntent = @@ -407,7 +381,8 @@ public class WifiCallingSliceHelper { // If either the action is to turn off wifi calling setting // or there is no activation involved - Update the setting if (newValue != currentValue) { - imsManager.setWfcSetting(newValue); + final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); + imsMmTelManager.setVoWiFiSettingEnabled(newValue); } } } @@ -430,18 +405,17 @@ public class WifiCallingSliceHelper { final int subId = getDefaultVoiceSubId(); final int errorValue = -1; - if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (SubscriptionManager.isValidSubscriptionId(subId)) { final boolean isWifiCallingPrefEditable = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false); final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); - final ImsManager imsManager = getImsManager(subId); + final WifiCallingQueryImsState queryState = queryImsState(subId); if (isWifiCallingPrefEditable - && imsManager.isWfcEnabledByPlatform() - && isWfcProvisionedOnDevice(subId) - && imsManager.isWfcEnabledByUser() - && imsManager.isNonTtyOrTtyOnVolteEnabled()) { + && queryState.isWifiCallingProvisioned() + && queryState.isEnabledByUser() + && queryState.isAllowUserControl()) { // Change the preference only when wifi calling is enabled // And when wifi calling preference is editable for the current carrier final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); @@ -522,11 +496,6 @@ public class WifiCallingSliceHelper { return SubscriptionManager.getDefaultVoiceSubscriptionId(); } - @VisibleForTesting - boolean isWfcProvisionedOnDevice(int subId) { - return MobileNetworkUtils.isWfcProvisionedOnDevice(subId); - } - /** * Returns Intent of the activation app required to activate wifi calling or null if there is no * need for activation. @@ -586,4 +555,9 @@ public class WifiCallingSliceHelper { private Resources getResourcesForSubId(int subId) { return SubscriptionManager.getResourcesForSubId(mContext, subId); } + + @VisibleForTesting + WifiCallingQueryImsState queryImsState(int subId) { + return new WifiCallingQueryImsState(mContext, subId); + } } diff --git a/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java b/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java index 526e9c3c71e..6b6eebfe3a0 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java @@ -19,19 +19,16 @@ package com.android.settings.wifi.calling; import android.content.Context; import android.telephony.SubscriptionManager; -import com.android.ims.ImsManager; import com.android.settings.SettingsActivity; -import com.android.settings.network.telephony.MobileNetworkUtils; +import com.android.settings.network.ims.WifiCallingQueryImsState; public class WifiCallingSuggestionActivity extends SettingsActivity { public static boolean isSuggestionComplete(Context context) { - if (!ImsManager.isWfcEnabledByPlatform(context) || - !MobileNetworkUtils.isWfcProvisionedOnDevice( - SubscriptionManager.getDefaultVoiceSubscriptionId())) { - return true; - } - return ImsManager.isWfcEnabledByUser(context) - && ImsManager.isNonTtyOrTtyOnVolteEnabled(context); + final WifiCallingQueryImsState queryState = + new WifiCallingQueryImsState(context, + SubscriptionManager.getDefaultVoiceSubscriptionId()); + return (!queryState.isWifiCallingProvisioned()) + || (queryState.isEnabledByUser() && queryState.isAllowUserControl()); } } 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 204529a940a..dbfd3b24766 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java @@ -19,6 +19,8 @@ package com.android.settings.network.telephony; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -35,11 +37,12 @@ import android.telephony.ims.ImsMmTelManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.ims.ImsManager; import com.android.internal.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.ims.MockWifiCallingQueryImsState; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -56,12 +59,12 @@ public class WifiCallingPreferenceControllerTest { @Mock private TelephonyManager mTelephonyManager; @Mock - private ImsManager mImsManager; - @Mock private ImsMmTelManager mImsMmTelManager; @Mock private PreferenceScreen mPreferenceScreen; + private MockWifiCallingQueryImsState mQueryImsState; + private WifiCallingPreferenceController mController; private Preference mPreference; private Context mContext; @@ -73,6 +76,10 @@ public class WifiCallingPreferenceControllerTest { mContext = spy(RuntimeEnvironment.application); + mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mPreference = new Preference(mContext); mController = spy(new WifiCallingPreferenceController(mContext, "wifi_calling") { @Override @@ -82,8 +89,8 @@ public class WifiCallingPreferenceControllerTest { }); mController.mCarrierConfigManager = mCarrierConfigManager; mController.init(SUB_ID); - mController.mImsManager = mImsManager; mController.mCallState = TelephonyManager.CALL_STATE_IDLE; + doReturn(mQueryImsState).when(mController).queryImsState(anyInt()); mPreference.setKey(mController.getPreferenceKey()); when(mController.getTelephonyManager(mContext, SUB_ID)).thenReturn(mTelephonyManager); @@ -98,7 +105,7 @@ public class WifiCallingPreferenceControllerTest { @Test public void updateState_noSimCallManager_setCorrectSummary() { mController.mSimCallManager = null; - when(mImsManager.isWfcEnabledByUser()).thenReturn(true); + mQueryImsState.setIsEnabledByUser(true); when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_WIFI_ONLY); when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn( @@ -128,18 +135,17 @@ public class WifiCallingPreferenceControllerTest { } @Test - public void updateState_nonRoaming_wfcCellularPreferred() { + public void updateState_wfcNonRoamingByConfig() { assertNull(mController.mSimCallManager); mCarrierConfig.putBoolean( CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true); mController.init(SUB_ID); - mController.mImsManager = mImsManager; when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED); when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED); - when(mImsManager.isWfcEnabledByUser()).thenReturn(true); + mQueryImsState.setIsEnabledByUser(true); when(mTelephonyManager.isNetworkRoaming()).thenReturn(true); mController.updateState(mPreference); @@ -148,7 +154,7 @@ public class WifiCallingPreferenceControllerTest { } @Test - public void updateState_roaming_wfcWifiPreferred() { + public void updateState_wfcRoamingByConfig() { assertNull(mController.mSimCallManager); // useWfcHomeModeForRoaming is false by default. In order to check wfc in roaming mode. We // need the device roaming, and not using home mode in roaming network. @@ -156,7 +162,7 @@ public class WifiCallingPreferenceControllerTest { ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED); when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED); - when(mImsManager.isWfcEnabledByUser()).thenReturn(true); + mQueryImsState.setIsEnabledByUser(true); when(mTelephonyManager.isNetworkRoaming()).thenReturn(true); mController.updateState(mPreference); @@ -174,6 +180,7 @@ public class WifiCallingPreferenceControllerTest { } @Test + @Ignore public void displayPreference_available_setsSubscriptionIdOnIntent() { final Intent intent = new Intent(); mPreference.setIntent(intent); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java index 307c0ac202d..e864ce38320 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java @@ -32,6 +32,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadows.ShadowLooper; @RunWith(RobolectricTestRunner.class) public class ListWithEntrySummaryPreferenceTest { @@ -53,6 +54,7 @@ public class ListWithEntrySummaryPreferenceTest { public void setUp() { mContext = RuntimeEnvironment.application; mContext.setTheme(R.style.Theme_Settings_Home); + ShadowLooper.pauseMainLooper(); mPreference = new ListWithEntrySummaryPreference(mContext, null); mPreference.setEntries(mDefaultEntries); mPreference.setEntryValues(mDefaultEntryValues); @@ -60,7 +62,7 @@ public class ListWithEntrySummaryPreferenceTest { } @Test - public void initialize_defaultEntries_shouldDisplayDefalutEntries() { + public void initialize_defaultEntries_shouldDisplayDefaultEntries() { AlertDialog dialog = showDialog(mPreference); ListAdapter adapter = dialog.getListView().getAdapter(); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java index 25fa737b591..207a2318c61 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java @@ -22,7 +22,6 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyObject; 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; @@ -41,9 +40,7 @@ import androidx.recyclerview.widget.RecyclerView.OnScrollListener; import com.android.settings.R; import com.android.settings.testutils.shadow.ShadowDisclaimerItemFactory; - -import java.util.ArrayList; -import java.util.List; +import com.android.settings.testutils.shadow.ShadowFragment; import org.junit.Before; import org.junit.Test; @@ -52,12 +49,15 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.Config; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import java.util.ArrayList; +import java.util.List; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowDisclaimerItemFactory.class) +@Config(shadows = {ShadowDisclaimerItemFactory.class, ShadowFragment.class}) public class WifiCallingDisclaimerFragmentTest { @Mock diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java index eb9a58d378f..2e93faac27e 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java @@ -44,17 +44,16 @@ import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.TelephonyManager; import android.telephony.ims.ImsMmTelManager; -import android.telephony.ims.ProvisioningManager; import android.view.View; import android.widget.TextView; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; 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.SwitchBar; import com.android.settings.widget.ToggleSwitch; @@ -73,6 +72,8 @@ 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 BUTTON_WFC_MODE = "wifi_calling_mode"; private static final String BUTTON_WFC_ROAMING_MODE = "wifi_calling_roaming_mode"; private static final String TEST_EMERGENCY_ADDRESS_CARRIER_APP = @@ -83,9 +84,10 @@ public class WifiCallingSettingsForSubTest { private TextView mEmptyView; private final PersistableBundle mBundle = new PersistableBundle(); + private MockWifiCallingQueryImsState mQueryImsState; + @Mock private static CarrierConfigManager sCarrierConfigManager; @Mock private CarrierConfigManager mMockConfigManager; - @Mock private ImsManager mImsManager; @Mock private ImsMmTelManager mImsMmTelManager; @Mock private TelephonyManager mTelephonyManager; @Mock private PreferenceScreen mPreferenceScreen; @@ -93,7 +95,6 @@ public class WifiCallingSettingsForSubTest { @Mock private SwitchBar mSwitchBar; @Mock private ToggleSwitch mToggleSwitch; @Mock private View mView; - @Mock private ImsConfig mImsConfig; @Mock private ListWithEntrySummaryPreference mButtonWfcMode; @Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode; @Mock private Preference mUpdateAddress; @@ -127,12 +128,13 @@ public class WifiCallingSettingsForSubTest { ReflectionHelpers.setField(mSwitchBar, "mSwitch", mToggleSwitch); doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar); - doReturn(mImsManager).when(mFragment).getImsManager(); + mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID); + doReturn(mImsMmTelManager).when(mFragment).getImsMmTelManager(); - doReturn(mImsConfig).when(mImsManager).getConfigInterface(); - doReturn(true).when(mFragment).isWfcProvisionedOnDevice(); - doReturn(true).when(mImsManager).isWfcEnabledByUser(); - doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled(); + 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) @@ -178,7 +180,7 @@ public class WifiCallingSettingsForSubTest { @Test public void onResume_provisioningDisallowed_shouldFinish() { // Call onResume while provisioning is disallowed. - doReturn(false).when(mFragment).isWfcProvisionedOnDevice(); + mQueryImsState.setIsProvisionedOnDevice(false); mFragment.onResume(); // Verify that finish() is called @@ -189,11 +191,11 @@ public class WifiCallingSettingsForSubTest { public void onResumeOnPause_provisioningCallbackRegistration() throws Exception { // Verify that provisioning callback is registered after call to onResume(). mFragment.onResume(); - verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class)); + verify(mFragment).registerProvisioningChangedCallback(); // Verify that provisioning callback is unregistered after call to onPause. mFragment.onPause(); - verify(mImsConfig).removeConfigCallback(any()); + verify(mFragment).unregisterProvisioningChangedCallback(); } @Test @@ -327,7 +329,7 @@ public class WifiCallingSettingsForSubTest { verify(mPreferenceScreen).addPreference(mButtonWfcRoamingMode); verify(mPreferenceScreen).addPreference(mUpdateAddress); // Check the WFC enable request. - verify(mImsManager).setWfcSetting(true); + verify(mImsMmTelManager).setVoWiFiSettingEnabled(true); } @Test @@ -350,5 +352,18 @@ public class WifiCallingSettingsForSubTest { return null; } } + + @Override + TelephonyManager getTelephonyManagerForSub(int subId) { + return mTelephonyManager; + } + + @Override + WifiCallingQueryImsState queryImsState(int subId) { + return mQueryImsState; + } + + @Override + void showAlert(Intent intent) {} } } diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java index 7957ae0d9b8..1ba8e7a44fa 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java @@ -18,13 +18,12 @@ package com.android.settings.wifi.calling; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; 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.Context; import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; @@ -32,14 +31,19 @@ import android.view.View; import androidx.fragment.app.FragmentActivity; +import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.network.SubscriptionUtil; +import com.android.settings.network.ims.MockWifiCallingQueryImsState; import com.android.settings.widget.RtlCompatibleViewPager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.androidx.fragment.FragmentController; import java.util.ArrayList; @@ -48,12 +52,37 @@ import java.util.Collections; @RunWith(RobolectricTestRunner.class) public class WifiCallingSettingsTest { + private static final int SUB_ID1 = 111; + private static final int SUB_ID2 = 222; + + private Context mContext; + + @Mock + private ImsManager mImsManager; private WifiCallingSettings mFragment; + private MockWifiCallingQueryImsState mQueryImsState1; + private MockWifiCallingQueryImsState mQueryImsState2; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = spy(RuntimeEnvironment.application); + + mQueryImsState1 = new MockWifiCallingQueryImsState(mContext, SUB_ID1); + mQueryImsState2 = new MockWifiCallingQueryImsState(mContext, SUB_ID2); + mQueryImsState1.setIsEnabledByUser(true); + mQueryImsState2.setIsEnabledByUser(true); + mQueryImsState1.setIsEnabledByPlatform(true); + mQueryImsState2.setIsEnabledByPlatform(true); + mQueryImsState1.setIsProvisionedOnDevice(true); + mQueryImsState2.setIsProvisionedOnDevice(true); + mFragment = spy(new WifiCallingSettings()); + doReturn(mQueryImsState1).when(mFragment).queryImsState(SUB_ID1); + doReturn(mQueryImsState2).when(mFragment).queryImsState(SUB_ID2); } @Test @@ -65,12 +94,12 @@ public class WifiCallingSettingsTest { @Test public void setupFragment_oneSubscription_noCrash() { final SubscriptionInfo info = mock(SubscriptionInfo.class); - when(info.getSubscriptionId()).thenReturn(111); + when(info.getSubscriptionId()).thenReturn(SUB_ID1); SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>( Collections.singletonList(info))); - doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class)); - doReturn(true).when(mFragment).isWfcProvisionedOnDevice(any(SubscriptionInfo.class)); + mQueryImsState1.setIsEnabledByPlatform(true); + mQueryImsState1.setIsProvisionedOnDevice(true); final Intent intent = new Intent(); intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId()); @@ -88,13 +117,11 @@ public class WifiCallingSettingsTest { public void setupFragment_twoSubscriptions_correctSelection() { final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class); - when(info1.getSubscriptionId()).thenReturn(111); - when(info2.getSubscriptionId()).thenReturn(222); + when(info1.getSubscriptionId()).thenReturn(SUB_ID1); + when(info2.getSubscriptionId()).thenReturn(SUB_ID2); SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>( Arrays.asList(info1, info2))); - doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class)); - doReturn(true).when(mFragment).isWfcProvisionedOnDevice(any(SubscriptionInfo.class)); final Intent intent = new Intent(); intent.putExtra(Settings.EXTRA_SUB_ID, info2.getSubscriptionId()); @@ -114,14 +141,12 @@ public class WifiCallingSettingsTest { public void setupFragment_twoSubscriptionsOneNotProvisionedOnDevice_oneResult() { final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class); - when(info1.getSubscriptionId()).thenReturn(111); - when(info2.getSubscriptionId()).thenReturn(222); + when(info1.getSubscriptionId()).thenReturn(SUB_ID1); + when(info2.getSubscriptionId()).thenReturn(SUB_ID2); SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>( Arrays.asList(info1, info2))); - doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class)); - doReturn(true).when(mFragment).isWfcProvisionedOnDevice(eq(info1)); - doReturn(false).when(mFragment).isWfcProvisionedOnDevice(eq(info2)); + mQueryImsState2.setIsProvisionedOnDevice(false); final Intent intent = new Intent(); intent.putExtra(Settings.EXTRA_SUB_ID, info1.getSubscriptionId()); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java index 274ce34124f..0013234c950 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java @@ -47,6 +47,7 @@ import androidx.slice.widget.SliceLiveData; import com.android.ims.ImsManager; import com.android.settings.R; +import com.android.settings.network.ims.MockWifiCallingQueryImsState; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBroadcastReceiver; @@ -68,6 +69,7 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class WifiCallingSliceHelperTest { + private static final int SUB_ID = 1; private Context mContext; @Mock @@ -79,6 +81,8 @@ public class WifiCallingSliceHelperTest { @Mock private ImsMmTelManager mMockImsMmTelManager; + private MockWifiCallingQueryImsState mQueryImsState; + private FakeWifiCallingSliceHelper mWfcSliceHelper; private SettingsSliceProvider mProvider; private SliceBroadcastReceiver mReceiver; @@ -101,7 +105,13 @@ public class WifiCallingSliceHelperTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mSlicesFeatureProvider = mFeatureFactory.getSlicesFeatureProvider(); + mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsEnabledByPlatform(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mWfcSliceHelper = spy(new FakeWifiCallingSliceHelper(mContext)); + doReturn(mQueryImsState).when(mWfcSliceHelper).queryImsState(anyInt()); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); @@ -109,6 +119,8 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingSlice_invalidSubId() { + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsProvisionedOnDevice(false); mWfcSliceHelper.setDefaultVoiceSubId(-1); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( @@ -119,7 +131,7 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingSlice_wfcNotSupported() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(false); + mQueryImsState.setIsProvisionedOnDevice(false); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( CustomSliceRegistry.WIFI_CALLING_URI); @@ -135,10 +147,9 @@ public class WifiCallingSliceHelperTest { turned off) we need to guide the user to wifi calling settings activity so the user can perform the activation there.(PrimaryAction) */ - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(false); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(false); + mQueryImsState.setIsTtyOnVolteEnabled(false); when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null); mWfcSliceHelper.setActivationAppIntent(new Intent()); // dummy Intent @@ -153,10 +164,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingSlice_success() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( @@ -168,10 +178,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_SettingSliceProvider_getsRightSliceWifiCalling() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null); when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext)) .thenReturn(mWfcSliceHelper); @@ -184,10 +193,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_SliceBroadcastReceiver_toggleOnWifiCalling() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(false); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext)) .thenReturn(mWfcSliceHelper); mWfcSliceHelper.setActivationAppIntent(null); @@ -201,7 +209,7 @@ public class WifiCallingSliceHelperTest { // change the setting mReceiver.onReceive(mContext, intent); - verify((mMockImsManager)).setWfcSetting(mWfcSettingCaptor.capture()); + verify((mMockImsMmTelManager)).setVoWiFiSettingEnabled(mWfcSettingCaptor.capture()); // assert the change assertThat(mWfcSettingCaptor.getValue()).isTrue(); @@ -209,10 +217,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingPreferenceSlice_prefNotEditable() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); mWfcSliceHelper.setIsWifiCallingPrefEditable(false); final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice( @@ -224,10 +231,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingPreferenceSlice_wfcOff() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(false); + mQueryImsState.setIsTtyOnVolteEnabled(true); mWfcSliceHelper.setIsWifiCallingPrefEditable(true); final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice( @@ -241,10 +247,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_CreateWifiCallingPreferenceSlice_success() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED); mWfcSliceHelper.setIsWifiCallingPrefEditable(true); @@ -259,10 +264,9 @@ public class WifiCallingSliceHelperTest { @Test public void test_SettingsSliceProvider_getWfcPreferenceSlice() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED); when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext)) @@ -278,10 +282,9 @@ public class WifiCallingSliceHelperTest { } @Test public void test_SliceBroadcastReceiver_setWfcPrefCellularPref() { - when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true); - when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true); - when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true); - when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true); + mQueryImsState.setIsProvisionedOnDevice(true); + mQueryImsState.setIsEnabledByUser(true); + mQueryImsState.setIsTtyOnVolteEnabled(true); when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn( ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED); when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext)) @@ -433,12 +436,6 @@ public class WifiCallingSliceHelperTest { return mMockCarrierConfigManager; } - @Override - protected ImsManager getImsManager(int subId) { - return mMockImsManager; - } - - @Override protected ImsMmTelManager getImsMmTelManager(int subId) { return mMockImsMmTelManager; } @@ -451,10 +448,6 @@ public class WifiCallingSliceHelperTest { mSubId = id; } - boolean isWfcProvisionedOnDevice(int subId) { - return true; - } - @Override protected Intent getWifiCallingCarrierActivityIntent(int subId) { return mActivationAppIntent;