Merge "[Settings] Refactor of Wifi Calling part" am: 61e003440b

Change-Id: I532654e3c3a5650ff36963b0e2172a66ec39baa5
This commit is contained in:
Bonian Chen
2020-04-09 05:22:20 +00:00
committed by Automerger Merge Worker
12 changed files with 349 additions and 288 deletions

View File

@@ -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<ResolveInfo> 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;
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<Boolean> isWifiOnTask = new FutureTask<>(new Callable<Boolean>() {
@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);
}
}

View File

@@ -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());
}
}