[Provider Model] Implement Wi-Fi callings in Calls & SMS
NetworkProviderWifiCallingPreferenceController is a catrgory of WFC. It will add NetworkProviderWifiCallingGroup for SIMs which is WFC enabled dynamically. Implement the current WFC logic: WifiCallingPreferenceController, for Provider Model Diff with WifiCallingPreferenceController https://diff.googleplex.com/#key=nzCL6Ybrkr19 Screenshot of Provider Model: https://screenshot.googleplex.com/BCXxdo4iNh6M3tH.png Screenshot of current WifiCallingPreferenceController: https://screenshot.googleplex.com/BsBE3A5YRs6arw9.png Doc: https://docs.google.com/presentation/d/1azrZVS54pxM2lt9LkZHtFh_6W3fyDw_kTTPVQ_mJCi4/edit#slide=id.g9c7123c172_0_448 Bug: 172053880 Test: manual & atest -c NetworkProviderWifiCallingPreferenceControllerTest & atest -c NetworkProviderWifiCallingForSubTest Change-Id: I6f4b4a257bc5e94be3090445ccabbcb261a03730
This commit is contained in:
@@ -0,0 +1,276 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.network.telephony;
|
||||||
|
|
||||||
|
import static androidx.lifecycle.Lifecycle.Event;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.os.PersistableBundle;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.telecom.PhoneAccountHandle;
|
||||||
|
import android.telecom.TelecomManager;
|
||||||
|
import android.telephony.CarrierConfigManager;
|
||||||
|
import android.telephony.SubscriptionInfo;
|
||||||
|
import android.telephony.SubscriptionManager;
|
||||||
|
import android.telephony.TelephonyManager;
|
||||||
|
import android.util.ArrayMap;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.lifecycle.LifecycleObserver;
|
||||||
|
import androidx.lifecycle.OnLifecycleEvent;
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.PreferenceGroup;
|
||||||
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.network.SubscriptionUtil;
|
||||||
|
import com.android.settings.network.SubscriptionsChangeListener;
|
||||||
|
import com.android.settings.network.ims.WifiCallingQueryImsState;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied the logic of WiFi calling from {@link WifiCallingPreferenceController}.
|
||||||
|
*/
|
||||||
|
public class NetworkProviderWifiCallingGroup extends
|
||||||
|
AbstractPreferenceController implements LifecycleObserver,
|
||||||
|
SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
|
||||||
|
|
||||||
|
private static final String TAG = "NetworkProviderWifiCallingGroup";
|
||||||
|
private static final int PREF_START_ORDER = 10;
|
||||||
|
private static final String KEY_PREFERENCE_WIFICALLING_GROUP = "provider_model_wfc_group";
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
protected CarrierConfigManager mCarrierConfigManager;
|
||||||
|
private SubscriptionManager mSubscriptionManager;
|
||||||
|
|
||||||
|
private String mPreferenceGroupKey;
|
||||||
|
private PreferenceGroup mPreferenceGroup;
|
||||||
|
private Map<Integer, TelephonyManager> mTelephonyManagerList = new HashMap<>();
|
||||||
|
private Map<Integer, PhoneAccountHandle> mSimCallManagerList = new HashMap<>();
|
||||||
|
private Map<Integer, Preference> mWifiCallingForSubPreferences;
|
||||||
|
private Set<Integer> mSubIdList = new ArraySet<>();
|
||||||
|
|
||||||
|
|
||||||
|
public NetworkProviderWifiCallingGroup(Context context, Lifecycle lifecycle,
|
||||||
|
String preferenceGroupKey) {
|
||||||
|
super(context);
|
||||||
|
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
|
||||||
|
mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
|
||||||
|
|
||||||
|
mPreferenceGroupKey = preferenceGroupKey;
|
||||||
|
mWifiCallingForSubPreferences = new ArrayMap<>();
|
||||||
|
lifecycle.addObserver(this);
|
||||||
|
setSubscriptionInfoList(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSubscriptionInfoList(Context context){
|
||||||
|
final List<SubscriptionInfo> subscriptions = SubscriptionUtil.getActiveSubscriptions(
|
||||||
|
mSubscriptionManager);
|
||||||
|
for (SubscriptionInfo info : subscriptions) {
|
||||||
|
final int subId = info.getSubscriptionId();
|
||||||
|
mSubIdList.add(subId);
|
||||||
|
setTelephonyManagerForSubscriptionId(context, subId);
|
||||||
|
setPhoneAccountHandleForSubscriptionId(context, subId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTelephonyManagerForSubscriptionId(Context context, int subId) {
|
||||||
|
TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class)
|
||||||
|
.createForSubscriptionId(subId);
|
||||||
|
mTelephonyManagerList.put(subId, telephonyManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPhoneAccountHandleForSubscriptionId(Context context, int subId) {
|
||||||
|
PhoneAccountHandle phoneAccountHandle = context.getSystemService(TelecomManager.class)
|
||||||
|
.getSimCallManagerForSubscription(subId);
|
||||||
|
mSimCallManagerList.put(subId, phoneAccountHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TelephonyManager getTelephonyManagerForSubscriptionId(int subId){
|
||||||
|
return mTelephonyManagerList.get(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
protected PhoneAccountHandle getPhoneAccountHandleForSubscriptionId(int subId){
|
||||||
|
return mSimCallManagerList.get(subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
protected WifiCallingQueryImsState queryImsState(int subId) {
|
||||||
|
return new WifiCallingQueryImsState(mContext, subId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnLifecycleEvent(Event.ON_RESUME)
|
||||||
|
public void onResume() {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return mSubIdList.size() >= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void displayPreference(PreferenceScreen screen) {
|
||||||
|
mPreferenceGroup = screen.findPreference(mPreferenceGroupKey);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(Preference preference) {
|
||||||
|
super.updateState(preference);
|
||||||
|
// Do nothing in this case since preference is invisible
|
||||||
|
if (preference == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void update() {
|
||||||
|
if (mPreferenceGroup == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setSubscriptionInfoList(mContext);
|
||||||
|
|
||||||
|
if (!isAvailable()) {
|
||||||
|
for (Preference pref : mWifiCallingForSubPreferences.values()) {
|
||||||
|
mPreferenceGroup.removePreference(pref);
|
||||||
|
}
|
||||||
|
mWifiCallingForSubPreferences.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<Integer, Preference> toRemovePreferences = mWifiCallingForSubPreferences;
|
||||||
|
mWifiCallingForSubPreferences = new ArrayMap<>();
|
||||||
|
final List<SubscriptionInfo> subscriptions = SubscriptionUtil.getActiveSubscriptions(
|
||||||
|
mSubscriptionManager);
|
||||||
|
setSubscriptionInfoForPreference(subscriptions, toRemovePreferences);
|
||||||
|
|
||||||
|
for (Preference pref : toRemovePreferences.values()) {
|
||||||
|
mPreferenceGroup.removePreference(pref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSubscriptionInfoForPreference(List<SubscriptionInfo> subscriptions,
|
||||||
|
Map<Integer, Preference> toRemovePreferences) {
|
||||||
|
int order = PREF_START_ORDER;
|
||||||
|
for (SubscriptionInfo info : subscriptions) {
|
||||||
|
final int subId = info.getSubscriptionId();
|
||||||
|
|
||||||
|
if (!shouldShowWifiCallingForSub(subId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Preference pref = toRemovePreferences.remove(subId);
|
||||||
|
if (pref == null) {
|
||||||
|
pref = new Preference(mPreferenceGroup.getContext());
|
||||||
|
mPreferenceGroup.addPreference(pref);
|
||||||
|
}
|
||||||
|
|
||||||
|
CharSequence title = info.getDisplayName();
|
||||||
|
if (getPhoneAccountHandleForSubscriptionId(subId) != null) {
|
||||||
|
final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
|
||||||
|
getPhoneAccountHandleForSubscriptionId(subId));
|
||||||
|
if (intent != null) {
|
||||||
|
final PackageManager pm = mContext.getPackageManager();
|
||||||
|
final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0);
|
||||||
|
title = resolutions.get(0).loadLabel(pm);
|
||||||
|
pref.setIntent(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pref.setTitle(title);
|
||||||
|
pref.setOnPreferenceClickListener(clickedPref -> {
|
||||||
|
final Intent intent = new Intent(
|
||||||
|
mContext,
|
||||||
|
com.android.settings.Settings.WifiCallingSettingsActivity.class);
|
||||||
|
intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId());
|
||||||
|
mContext.startActivity(intent);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
pref.setEnabled(getTelephonyManagerForSubscriptionId(subId).getCallState()
|
||||||
|
== TelephonyManager.CALL_STATE_IDLE);
|
||||||
|
pref.setOrder(order++);
|
||||||
|
pref.setSummary(R.string.calls_sms_wfc_summary);
|
||||||
|
|
||||||
|
mWifiCallingForSubPreferences.put(subId, pref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do nothing in this case since preference will not be impacted.
|
||||||
|
@Override
|
||||||
|
public void onAirplaneModeChanged(boolean airplaneModeEnabled) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSubscriptionsChanged() {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To indicate that should show the Wi-Fi calling preference or not.
|
||||||
|
*
|
||||||
|
* It will check these 3 conditions:
|
||||||
|
* 1. Check the subscription is valid or not.
|
||||||
|
* 2. Check whether Wi-Fi Calling can be perform or not on this subscription.
|
||||||
|
* 3. Check the carrier's config (carrier_wfc_ims_available_bool). If true, the carrier
|
||||||
|
* supports the Wi-Fi calling, otherwise false.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
protected boolean shouldShowWifiCallingForSub(int subId) {
|
||||||
|
if (SubscriptionManager.isValidSubscriptionId(subId)
|
||||||
|
&& MobileNetworkUtils.isWifiCallingEnabled(
|
||||||
|
mContext, subId, queryImsState(subId),
|
||||||
|
getPhoneAccountHandleForSubscriptionId(subId))
|
||||||
|
&& isWifiCallingAvailableForCarrier(subId)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isWifiCallingAvailableForCarrier(int subId) {
|
||||||
|
boolean isWifiCallingAvailableForCarrier = false;
|
||||||
|
if (mCarrierConfigManager != null) {
|
||||||
|
final PersistableBundle carrierConfig =
|
||||||
|
mCarrierConfigManager.getConfigForSubId(subId);
|
||||||
|
if (carrierConfig != null) {
|
||||||
|
isWifiCallingAvailableForCarrier = carrierConfig.getBoolean(
|
||||||
|
CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isWifiCallingAvailableForCarrier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreferenceKey() {
|
||||||
|
return KEY_PREFERENCE_WIFICALLING_GROUP;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.network.telephony;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.telephony.CarrierConfigManager;
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.core.BasePreferenceController;
|
||||||
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preference controller for "Wifi Calling"
|
||||||
|
*/
|
||||||
|
public class NetworkProviderWifiCallingPreferenceController extends
|
||||||
|
BasePreferenceController implements LifecycleObserver{
|
||||||
|
|
||||||
|
private static final String TAG = "NetworkProviderWfcController";
|
||||||
|
private static final String PREFERENCE_CATEGORY_KEY = "provider_model_calling_category";
|
||||||
|
|
||||||
|
private NetworkProviderWifiCallingGroup mNetworkProviderWifiCallingGroup;
|
||||||
|
private PreferenceCategory mPreferenceCategory;
|
||||||
|
private PreferenceScreen mPreferenceScreen;
|
||||||
|
|
||||||
|
public NetworkProviderWifiCallingPreferenceController(Context context, String key) {
|
||||||
|
super(context, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(Lifecycle lifecycle) {
|
||||||
|
mNetworkProviderWifiCallingGroup = createWifiCallingControllerForSub(lifecycle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
protected NetworkProviderWifiCallingGroup createWifiCallingControllerForSub(
|
||||||
|
Lifecycle lifecycle) {
|
||||||
|
return new NetworkProviderWifiCallingGroup(mContext, lifecycle, PREFERENCE_CATEGORY_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAvailabilityStatus() {
|
||||||
|
if (mNetworkProviderWifiCallingGroup == null
|
||||||
|
|| !mNetworkProviderWifiCallingGroup.isAvailable()) {
|
||||||
|
return UNSUPPORTED_ON_DEVICE;
|
||||||
|
} else {
|
||||||
|
return AVAILABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void displayPreference(PreferenceScreen screen) {
|
||||||
|
super.displayPreference(screen);
|
||||||
|
mPreferenceScreen = screen;
|
||||||
|
mPreferenceCategory = screen.findPreference(PREFERENCE_CATEGORY_KEY);
|
||||||
|
mPreferenceCategory.setVisible(isAvailable());
|
||||||
|
mNetworkProviderWifiCallingGroup.displayPreference(screen);
|
||||||
|
}
|
||||||
|
}
|
@@ -47,6 +47,7 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* Preference controller for "Wifi Calling"
|
* Preference controller for "Wifi Calling"
|
||||||
*/
|
*/
|
||||||
|
//TODO: Remove the class once Provider Model is always enabled in the future.
|
||||||
public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements
|
public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements
|
||||||
LifecycleObserver, OnStart, OnStop {
|
LifecycleObserver, OnStart, OnStop {
|
||||||
|
|
||||||
|
@@ -0,0 +1,210 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.settings.network.telephony;
|
||||||
|
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.nullable;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.PersistableBundle;
|
||||||
|
import android.telecom.PhoneAccountHandle;
|
||||||
|
import android.telecom.TelecomManager;
|
||||||
|
import android.telephony.CarrierConfigManager;
|
||||||
|
import android.telephony.SubscriptionInfo;
|
||||||
|
import android.telephony.SubscriptionManager;
|
||||||
|
import android.telephony.TelephonyManager;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
|
|
||||||
|
import com.android.settings.network.ims.MockWfcQueryImsState;
|
||||||
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
|
import androidx.preference.PreferenceScreen;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class NetworkProviderWifiCallingGroupTest {
|
||||||
|
|
||||||
|
private static final int SUB_ID = 1;
|
||||||
|
private static final String KEY_PREFERENCE_WFC_CATEGORY = "provider_model_calling_category";
|
||||||
|
private static final String PACKAGE_NAME = "com.android.settings";
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private CarrierConfigManager mCarrierConfigManager;
|
||||||
|
@Mock
|
||||||
|
private Lifecycle mLifecycle;
|
||||||
|
@Mock
|
||||||
|
private PreferenceCategory mPreferenceCategory;
|
||||||
|
@Mock
|
||||||
|
private PackageManager mPackageManager;
|
||||||
|
@Mock
|
||||||
|
private ResolveInfo mResolveInfo;
|
||||||
|
@Mock
|
||||||
|
private SubscriptionManager mSubscriptionManager;
|
||||||
|
@Mock
|
||||||
|
private SubscriptionInfo mSubscriptionInfo;
|
||||||
|
@Mock
|
||||||
|
private TelecomManager mTelecomManager;
|
||||||
|
@Mock
|
||||||
|
private TelephonyManager mTelephonyManager;
|
||||||
|
|
||||||
|
private ComponentName mComponentName;
|
||||||
|
private Context mContext;
|
||||||
|
private MockWfcQueryImsState mMockQueryWfcState;
|
||||||
|
private NetworkProviderWifiCallingGroup mNetworkProviderWifiCallingGroup;
|
||||||
|
private PersistableBundle mCarrierConfig;
|
||||||
|
private PhoneAccountHandle mPhoneAccountHandle;
|
||||||
|
private PreferenceManager mPreferenceManager;
|
||||||
|
private PreferenceScreen mPreferenceScreen;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
|
when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
|
||||||
|
mCarrierConfigManager);
|
||||||
|
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
|
||||||
|
when(mContext.getSystemService(TelecomManager.class)).thenReturn(mTelecomManager);
|
||||||
|
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||||
|
when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
|
||||||
|
when(mContext.getPackageManager()).thenReturn(mPackageManager);
|
||||||
|
|
||||||
|
when(mSubscriptionInfo.getSubscriptionId()).thenReturn(SUB_ID);
|
||||||
|
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
|
||||||
|
Arrays.asList(mSubscriptionInfo));
|
||||||
|
|
||||||
|
mCarrierConfig = new PersistableBundle();
|
||||||
|
doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
|
||||||
|
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL, true);
|
||||||
|
when(mTelecomManager.getSimCallManagerForSubscription(SUB_ID))
|
||||||
|
.thenReturn(mPhoneAccountHandle);
|
||||||
|
mMockQueryWfcState = new MockWfcQueryImsState(mContext, SUB_ID);
|
||||||
|
|
||||||
|
if (Looper.myLooper() == null) {
|
||||||
|
Looper.prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
mPreferenceManager = new PreferenceManager(mContext);
|
||||||
|
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||||
|
when(mPreferenceCategory.getKey()).thenReturn(KEY_PREFERENCE_WFC_CATEGORY);
|
||||||
|
when(mPreferenceCategory.getPreferenceCount()).thenReturn(1);
|
||||||
|
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||||
|
|
||||||
|
mNetworkProviderWifiCallingGroup = spy(new NetworkProviderWifiCallingGroup(
|
||||||
|
mContext, mLifecycle, KEY_PREFERENCE_WFC_CATEGORY));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldShowWifiCallingForSub_invalidSubId_returnFalse() {
|
||||||
|
when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldShowWifiCallingForSub_carrierConfigIsUnavailable_returnFalse() {
|
||||||
|
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL, false);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void
|
||||||
|
shouldShowWifiCallingForSub_wifiCallingDisabledWithWifiCallingNotReady_returnFalse() {
|
||||||
|
FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL, true);
|
||||||
|
setWifiCallingEnabled(false);
|
||||||
|
doReturn(mMockQueryWfcState).when(mNetworkProviderWifiCallingGroup).queryImsState(SUB_ID);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldShowWifiCallingForSub_wifiCallingEnabledWithWifiCallingIsReady_returnTrue() {
|
||||||
|
FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL, true);
|
||||||
|
setWifiCallingEnabled(true);
|
||||||
|
doReturn(mMockQueryWfcState).when(mNetworkProviderWifiCallingGroup).queryImsState(SUB_ID);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void
|
||||||
|
shouldShowWifiCallingForSub_wifiCallingDisabledWithNoActivityHandleIntent_returnFalse() {
|
||||||
|
FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL, true);
|
||||||
|
buildPhoneAccountConfigureIntent(false);
|
||||||
|
doReturn(mMockQueryWfcState).when(mNetworkProviderWifiCallingGroup).queryImsState(SUB_ID);
|
||||||
|
doReturn(mPhoneAccountHandle).when(mNetworkProviderWifiCallingGroup)
|
||||||
|
.getPhoneAccountHandleForSubscriptionId(SUB_ID);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void
|
||||||
|
shouldShowWifiCallingForSub_wifiCallingEnabledWithActivityHandleIntent_returnTrue() {
|
||||||
|
FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL, true);
|
||||||
|
buildPhoneAccountConfigureIntent(true);
|
||||||
|
doReturn(mMockQueryWfcState).when(mNetworkProviderWifiCallingGroup).queryImsState(SUB_ID);
|
||||||
|
doReturn(mPhoneAccountHandle).when(mNetworkProviderWifiCallingGroup)
|
||||||
|
.getPhoneAccountHandleForSubscriptionId(SUB_ID);
|
||||||
|
|
||||||
|
assertThat(mNetworkProviderWifiCallingGroup.shouldShowWifiCallingForSub(SUB_ID))
|
||||||
|
.isEqualTo(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setWifiCallingEnabled(boolean enabled) {
|
||||||
|
mMockQueryWfcState.setIsEnabledByUser(enabled);
|
||||||
|
mMockQueryWfcState.setServiceStateReady(enabled);
|
||||||
|
mMockQueryWfcState.setIsEnabledByPlatform(enabled);
|
||||||
|
mMockQueryWfcState.setIsProvisionedOnDevice(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildPhoneAccountConfigureIntent(boolean hasActivityHandleIntent) {
|
||||||
|
mComponentName = new ComponentName(PACKAGE_NAME, "testClass");
|
||||||
|
mPhoneAccountHandle = new PhoneAccountHandle(mComponentName, "");
|
||||||
|
when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
|
||||||
|
.thenReturn(
|
||||||
|
hasActivityHandleIntent ? Arrays.asList(mResolveInfo) : new ArrayList<>());
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.network.telephony;
|
||||||
|
|
||||||
|
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Looper;
|
||||||
|
|
||||||
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
|
import androidx.preference.PreferenceScreen;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class NetworkProviderWifiCallingPreferenceControllerTest {
|
||||||
|
|
||||||
|
private static final String KEY_PREFERENCE_WFC_CATEGORY = "provider_model_calling_category";
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private NetworkProviderWifiCallingGroup mWifiCallingForSubController;
|
||||||
|
@Mock
|
||||||
|
private PreferenceCategory mPreferenceCategory;
|
||||||
|
@Mock
|
||||||
|
private Lifecycle mLifecycle;
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private NetworkProviderWifiCallingPreferenceController mCategoryController;
|
||||||
|
|
||||||
|
private PreferenceManager mPreferenceManager;
|
||||||
|
private PreferenceScreen mPreferenceScreen;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
|
mCategoryController = new NetworkProviderWifiCallingPreferenceController(
|
||||||
|
mContext, KEY_PREFERENCE_WFC_CATEGORY) {
|
||||||
|
@Override
|
||||||
|
protected NetworkProviderWifiCallingGroup createWifiCallingControllerForSub(
|
||||||
|
Lifecycle lifecycle) {
|
||||||
|
return mWifiCallingForSubController;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Looper.myLooper() == null) {
|
||||||
|
Looper.prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
mPreferenceManager = new PreferenceManager(mContext);
|
||||||
|
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
|
||||||
|
when(mPreferenceCategory.getKey()).thenReturn(KEY_PREFERENCE_WFC_CATEGORY);
|
||||||
|
when(mPreferenceCategory.getPreferenceCount()).thenReturn(1);
|
||||||
|
mPreferenceScreen.addPreference(mPreferenceCategory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAvailabilityStatus_returnUnavailable() {
|
||||||
|
mWifiCallingForSubController = null;
|
||||||
|
|
||||||
|
assertThat(mCategoryController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void displayPreference_isVisible() {
|
||||||
|
when(mWifiCallingForSubController.isAvailable()).thenReturn(true);
|
||||||
|
mCategoryController.init(mLifecycle);
|
||||||
|
mCategoryController.displayPreference(mPreferenceScreen);
|
||||||
|
|
||||||
|
assertEquals(mPreferenceCategory.isVisible(), true);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user