Merge "Update search for mobile network settings"

This commit is contained in:
Lei Yu
2019-02-11 18:00:57 +00:00
committed by Android (Google) Code Review
20 changed files with 338 additions and 109 deletions

View File

@@ -77,7 +77,8 @@
<PreferenceCategory <PreferenceCategory
android:key="calling_category" android:key="calling_category"
android:title="@string/call_category"> android:title="@string/call_category"
settings:searchable="false">
<PreferenceScreen <PreferenceScreen
android:key="wifi_calling_key" android:key="wifi_calling_key"

View File

@@ -32,7 +32,6 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.ApnSettings; import com.android.settings.network.ApnSettings;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
@@ -43,12 +42,11 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
/** /**
* Preference controller for "Apn settings" * Preference controller for "Apn settings"
*/ */
public class ApnPreferenceController extends BasePreferenceController implements public class ApnPreferenceController extends TelephonyBasePreferenceController implements
LifecycleObserver, OnStart, OnStop { LifecycleObserver, OnStart, OnStop {
@VisibleForTesting @VisibleForTesting
CarrierConfigManager mCarrierConfigManager; CarrierConfigManager mCarrierConfigManager;
private int mSubId;
private Preference mPreference; private Preference mPreference;
private DpcApnEnforcedObserver mDpcApnEnforcedObserver; private DpcApnEnforcedObserver mDpcApnEnforcedObserver;
@@ -59,12 +57,12 @@ public class ApnPreferenceController extends BasePreferenceController implements
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId); final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
final boolean isCdmaApn = MobileNetworkUtils.isCdmaOptions(mContext, mSubId) final boolean isCdmaApn = MobileNetworkUtils.isCdmaOptions(mContext, subId)
&& carrierConfig != null && carrierConfig != null
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL); && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL);
final boolean isGsmApn = MobileNetworkUtils.isGsmOptions(mContext, mSubId) final boolean isGsmApn = MobileNetworkUtils.isGsmOptions(mContext, subId)
&& carrierConfig != null && carrierConfig != null
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL); && carrierConfig.getBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL);

View File

@@ -28,21 +28,17 @@ import android.telephony.SubscriptionManager;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.core.BasePreferenceController;
/** /**
* Preference controller for "Carrier Settings" * Preference controller for "Carrier Settings"
*/ */
public class CarrierPreferenceController extends BasePreferenceController { public class CarrierPreferenceController extends TelephonyBasePreferenceController {
@VisibleForTesting @VisibleForTesting
CarrierConfigManager mCarrierConfigManager; CarrierConfigManager mCarrierConfigManager;
private int mSubId;
public CarrierPreferenceController(Context context, String key) { public CarrierPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigManager = new CarrierConfigManager(context); mCarrierConfigManager = new CarrierConfigManager(context);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
public void init(int subId) { public void init(int subId) {
@@ -50,14 +46,14 @@ public class CarrierPreferenceController extends BasePreferenceController {
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId); final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
// Return available if it is in CDMA or GSM mode, and the flag is on // Return available if it is in CDMA or GSM mode, and the flag is on
return carrierConfig != null return carrierConfig != null
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL) && carrierConfig.getBoolean(CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL)
&& (MobileNetworkUtils.isCdmaOptions(mContext, mSubId) && (MobileNetworkUtils.isCdmaOptions(mContext, subId)
|| MobileNetworkUtils.isGsmOptions(mContext, mSubId)) || MobileNetworkUtils.isGsmOptions(mContext, subId))
? AVAILABLE ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE; : CONDITIONALLY_UNAVAILABLE;
} }

View File

@@ -29,18 +29,15 @@ import android.text.TextUtils;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants;
import com.android.settings.core.BasePreferenceController;
/** /**
* Preference controller for "Data service setup" * Preference controller for "Data service setup"
*/ */
public class DataServiceSetupPreferenceController extends BasePreferenceController { public class DataServiceSetupPreferenceController extends TelephonyBasePreferenceController {
private CarrierConfigManager mCarrierConfigManager; private CarrierConfigManager mCarrierConfigManager;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private PersistableBundle mCarrierConfig;
private String mSetupUrl; private String mSetupUrl;
private int mSubId;
public DataServiceSetupPreferenceController(Context context, String key) { public DataServiceSetupPreferenceController(Context context, String key) {
super(context, key); super(context, key);
@@ -48,16 +45,16 @@ public class DataServiceSetupPreferenceController extends BasePreferenceControll
mTelephonyManager = context.getSystemService(TelephonyManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class);
mSetupUrl = Settings.Global.getString(mContext.getContentResolver(), mSetupUrl = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL); Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
final boolean isLteOnCdma = mTelephonyManager.getLteOnCdmaMode() final boolean isLteOnCdma = mTelephonyManager.getLteOnCdmaMode()
== PhoneConstants.LTE_ON_CDMA_TRUE; == PhoneConstants.LTE_ON_CDMA_TRUE;
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
&& mCarrierConfig != null return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
&& !mCarrierConfig.getBoolean( && carrierConfig != null
&& !carrierConfig.getBoolean(
CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL) CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)
&& isLteOnCdma && !TextUtils.isEmpty(mSetupUrl) && isLteOnCdma && !TextUtils.isEmpty(mSetupUrl)
? AVAILABLE ? AVAILABLE
@@ -67,7 +64,6 @@ public class DataServiceSetupPreferenceController extends BasePreferenceControll
public void init(int subId) { public void init(int subId) {
mSubId = subId; mSubId = subId;
mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
mCarrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
} }
@Override @Override

View File

@@ -28,27 +28,24 @@ import android.text.format.Formatter;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.net.DataUsageController; import com.android.settingslib.net.DataUsageController;
/** /**
* Preference controller for "Data usage" * Preference controller for "Data usage"
*/ */
public class DataUsagePreferenceController extends BasePreferenceController { public class DataUsagePreferenceController extends TelephonyBasePreferenceController {
private NetworkTemplate mTemplate; private NetworkTemplate mTemplate;
private DataUsageController.DataUsageInfo mDataUsageInfo; private DataUsageController.DataUsageInfo mDataUsageInfo;
private Intent mIntent; private Intent mIntent;
private int mSubId;
public DataUsagePreferenceController(Context context, String key) { public DataUsagePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
? AVAILABLE ? AVAILABLE
: AVAILABLE_UNSEARCHABLE; : AVAILABLE_UNSEARCHABLE;
} }

View File

@@ -31,18 +31,16 @@ import androidx.preference.Preference;
import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
/** /**
* Preference controller for "Enabled network mode" * Preference controller for "Enabled network mode"
*/ */
public class EnabledNetworkModePreferenceController extends BasePreferenceController implements public class EnabledNetworkModePreferenceController extends
TelephonyBasePreferenceController implements
ListPreference.OnPreferenceChangeListener { ListPreference.OnPreferenceChangeListener {
private CarrierConfigManager mCarrierConfigManager; private CarrierConfigManager mCarrierConfigManager;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private PersistableBundle mPersistableBundle;
private int mSubId;
private boolean mIsGlobalCdma; private boolean mIsGlobalCdma;
@VisibleForTesting @VisibleForTesting
boolean mShow4GForLTE; boolean mShow4GForLTE;
@@ -50,26 +48,26 @@ public class EnabledNetworkModePreferenceController extends BasePreferenceContro
public EnabledNetworkModePreferenceController(Context context, String key) { public EnabledNetworkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
boolean visible; boolean visible;
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
visible = false; visible = false;
} else if (mPersistableBundle == null) { } else if (carrierConfig == null) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean( } else if (carrierConfig.getBoolean(
CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) { CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean( } else if (carrierConfig.getBoolean(
CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL) CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL)
&& !mTelephonyManager.getServiceState().getRoaming() && !mTelephonyManager.getServiceState().getRoaming()
&& mTelephonyManager.getServiceState().getDataRegState() && mTelephonyManager.getServiceState().getDataRegState()
== ServiceState.STATE_IN_SERVICE) { == ServiceState.STATE_IN_SERVICE) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) { } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
visible = false; visible = false;
} else { } else {
visible = true; visible = true;
@@ -104,15 +102,15 @@ public class EnabledNetworkModePreferenceController extends BasePreferenceContro
public void init(int subId) { public void init(int subId) {
mSubId = subId; mSubId = subId;
mPersistableBundle = mCarrierConfigManager.getConfigForSubId(mSubId); final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
final boolean isLteOnCdma = final boolean isLteOnCdma =
mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
mIsGlobalCdma = isLteOnCdma mIsGlobalCdma = isLteOnCdma
&& mPersistableBundle.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL); && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
mShow4GForLTE = mPersistableBundle != null mShow4GForLTE = carrierConfig != null
? mPersistableBundle.getBoolean( ? carrierConfig.getBoolean(
CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL) CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL)
: false; : false;
} }

View File

@@ -31,7 +31,6 @@ import androidx.preference.SwitchPreference;
import com.android.ims.ImsManager; import com.android.ims.ImsManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -42,8 +41,8 @@ import java.util.List;
/** /**
* Preference controller for "Enhanced 4G LTE" * Preference controller for "Enhanced 4G LTE"
*/ */
public class Enhanced4gLtePreferenceController extends TogglePreferenceController implements public class Enhanced4gLtePreferenceController extends TelephonyTogglePreferenceController
LifecycleObserver, OnStart, OnStop { implements LifecycleObserver, OnStart, OnStop {
private Preference mPreference; private Preference mPreference;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
@@ -53,24 +52,23 @@ public class Enhanced4gLtePreferenceController extends TogglePreferenceControlle
ImsManager mImsManager; ImsManager mImsManager;
private PhoneCallStateListener mPhoneStateListener; private PhoneCallStateListener mPhoneStateListener;
private final List<On4gLteUpdateListener> m4gLteListeners; private final List<On4gLteUpdateListener> m4gLteListeners;
private int mSubId;
public Enhanced4gLtePreferenceController(Context context, String key) { public Enhanced4gLtePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
m4gLteListeners = new ArrayList<>(); m4gLteListeners = new ArrayList<>();
mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper());
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
final boolean isVisible = mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
&& mImsManager != null && mCarrierConfig != null final boolean isVisible = subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
&& mImsManager != null && carrierConfig != null
&& mImsManager.isVolteEnabledByPlatform() && mImsManager.isVolteEnabledByPlatform()
&& mImsManager.isVolteProvisionedOnDevice() && mImsManager.isVolteProvisionedOnDevice()
&& MobileNetworkUtils.isImsServiceStateReady(mImsManager) && MobileNetworkUtils.isImsServiceStateReady(mImsManager)
&& !mCarrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL); && !carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL);
return isVisible return isVisible
? (is4gLtePrefEnabled() ? AVAILABLE : AVAILABLE_UNSEARCHABLE) ? (is4gLtePrefEnabled() ? AVAILABLE : AVAILABLE_UNSEARCHABLE)
: CONDITIONALLY_UNAVAILABLE; : CONDITIONALLY_UNAVAILABLE;

View File

@@ -18,31 +18,26 @@ package com.android.settings.network.telephony;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager; import android.telephony.euicc.EuiccManager;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.core.BasePreferenceController;
/** /**
* Preference controller for "Euicc preference" * Preference controller for "Euicc preference"
*/ */
public class EuiccPreferenceController extends BasePreferenceController { public class EuiccPreferenceController extends TelephonyBasePreferenceController {
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private int mSubId;
public EuiccPreferenceController(Context context, String key) { public EuiccPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mTelephonyManager = context.getSystemService(TelephonyManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return MobileNetworkUtils.showEuiccSettings(mContext) return MobileNetworkUtils.showEuiccSettings(mContext)
? AVAILABLE ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE; : CONDITIONALLY_UNAVAILABLE;

View File

@@ -40,7 +40,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
/** /**
* Preference controller for "Mobile data" * Preference controller for "Mobile data"
*/ */
public class MobileDataPreferenceController extends TogglePreferenceController public class MobileDataPreferenceController extends TelephonyTogglePreferenceController
implements LifecycleObserver, OnStart, OnStop { implements LifecycleObserver, OnStart, OnStop {
private static final String DIALOG_TAG = "MobileDataDialog"; private static final String DIALOG_TAG = "MobileDataDialog";
@@ -50,7 +50,6 @@ public class MobileDataPreferenceController extends TogglePreferenceController
private SubscriptionManager mSubscriptionManager; private SubscriptionManager mSubscriptionManager;
private DataContentObserver mDataContentObserver; private DataContentObserver mDataContentObserver;
private FragmentManager mFragmentManager; private FragmentManager mFragmentManager;
private int mSubId;
@VisibleForTesting @VisibleForTesting
int mDialogType; int mDialogType;
@VisibleForTesting @VisibleForTesting
@@ -58,15 +57,13 @@ public class MobileDataPreferenceController extends TogglePreferenceController
public MobileDataPreferenceController(Context context, String key) { public MobileDataPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mSubscriptionManager = context.getSystemService(SubscriptionManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper())); mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper()));
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
? AVAILABLE ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE; : CONDITIONALLY_UNAVAILABLE;
} }
@@ -74,7 +71,7 @@ public class MobileDataPreferenceController extends TogglePreferenceController
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey()); mPreference = screen.findPreference(getPreferenceKey());
} }
@Override @Override

View File

@@ -114,7 +114,7 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment {
@Override @Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID, mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID); MobileNetworkUtils.getSearchableSubscriptionId(context));
if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2) && if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2) &&
mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
@@ -250,11 +250,6 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment {
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override
protected boolean isPageSearchEnabled(Context context) {
return false;
}
@Override @Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) { boolean enabled) {

View File

@@ -44,6 +44,8 @@ import com.android.ims.ImsException;
import com.android.ims.ImsManager; import com.android.ims.ImsManager;
import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.ArrayUtils;
import com.android.settings.core.BasePreferenceController;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -403,4 +405,52 @@ public class MobileNetworkUtils {
} }
return false; return false;
} }
/**
* Return subId that supported by search. If there are more than one, return first one,
* otherwise return {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}
*/
public static int getSearchableSubscriptionId(Context context) {
final SubscriptionManager subscriptionManager = context.getSystemService(
SubscriptionManager.class);
final int subIds[] = subscriptionManager.getActiveSubscriptionIdList();
return subIds.length >= 1 ? subIds[0] : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
/**
* Return availability for a default subscription id. If subId already been set, use it to
* check, otherwise traverse all active subIds on device to check.
* @param context context
* @param defSubId Default subId get from telephony preference controller
* @param callback Callback to check availability for a specific subId
* @return Availability
*
* @see BasePreferenceController#getAvailabilityStatus()
*/
public static int getAvailability(Context context, int defSubId,
TelephonyAvailabilityCallback callback) {
final SubscriptionManager subscriptionManager = context.getSystemService(
SubscriptionManager.class);
if (defSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
// If subId has been set, return the corresponding status
return callback.getAvailabilityStatus(defSubId);
} else {
// Otherwise, search whether there is one subId in device that support this preference
final int[] subIds = subscriptionManager.getActiveSubscriptionIdList();
if (ArrayUtils.isEmpty(subIds)) {
return callback.getAvailabilityStatus(
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
} else {
for (final int subId : subIds) {
final int status = callback.getAvailabilityStatus(subId);
if (status == BasePreferenceController.AVAILABLE) {
return status;
}
}
return callback.getAvailabilityStatus(subIds[0]);
}
}
}
} }

View File

@@ -35,38 +35,37 @@ import com.android.settings.core.BasePreferenceController;
/** /**
* Preference controller for "Preferred network mode" * Preference controller for "Preferred network mode"
*/ */
public class PreferredNetworkModePreferenceController extends BasePreferenceController implements public class PreferredNetworkModePreferenceController extends TelephonyBasePreferenceController
ListPreference.OnPreferenceChangeListener { implements ListPreference.OnPreferenceChangeListener {
private CarrierConfigManager mCarrierConfigManager; private CarrierConfigManager mCarrierConfigManager;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private PersistableBundle mPersistableBundle; private PersistableBundle mPersistableBundle;
private int mSubId;
private boolean mIsGlobalCdma; private boolean mIsGlobalCdma;
public PreferredNetworkModePreferenceController(Context context, String key) { public PreferredNetworkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
boolean visible; boolean visible;
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
visible = false; visible = false;
} else if (mPersistableBundle == null) { } else if (carrierConfig == null) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean( } else if (carrierConfig.getBoolean(
CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) { CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean( } else if (carrierConfig.getBoolean(
CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL) CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL)
&& !mTelephonyManager.getServiceState().getRoaming() && !mTelephonyManager.getServiceState().getRoaming()
&& mTelephonyManager.getServiceState().getDataRegState() && mTelephonyManager.getServiceState().getDataRegState()
== ServiceState.STATE_IN_SERVICE) { == ServiceState.STATE_IN_SERVICE) {
visible = false; visible = false;
} else if (mPersistableBundle.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) { } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
visible = true; visible = true;
} else { } else {
visible = false; visible = false;
@@ -100,13 +99,13 @@ public class PreferredNetworkModePreferenceController extends BasePreferenceCont
public void init(int subId) { public void init(int subId) {
mSubId = subId; mSubId = subId;
mPersistableBundle = mCarrierConfigManager.getConfigForSubId(mSubId); final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
final boolean isLteOnCdma = final boolean isLteOnCdma =
mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
mIsGlobalCdma = isLteOnCdma mIsGlobalCdma = isLteOnCdma
&& mPersistableBundle.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL); && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
} }
private int getPreferredNetworkMode() { private int getPreferredNetworkMode() {

View File

@@ -42,7 +42,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
/** /**
* Preference controller for "Roaming" * Preference controller for "Roaming"
*/ */
public class RoamingPreferenceController extends TogglePreferenceController implements public class RoamingPreferenceController extends TelephonyTogglePreferenceController implements
LifecycleObserver, OnStart, OnStop { LifecycleObserver, OnStart, OnStop {
private static final String DIALOG_TAG = "MobileDataDialog"; private static final String DIALOG_TAG = "MobileDataDialog";
@@ -50,7 +50,6 @@ public class RoamingPreferenceController extends TogglePreferenceController impl
private RestrictedSwitchPreference mSwitchPreference; private RestrictedSwitchPreference mSwitchPreference;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private CarrierConfigManager mCarrierConfigManager; private CarrierConfigManager mCarrierConfigManager;
private int mSubId;
private DataContentObserver mDataContentObserver; private DataContentObserver mDataContentObserver;
@VisibleForTesting @VisibleForTesting
boolean mNeedDialog; boolean mNeedDialog;
@@ -59,10 +58,8 @@ public class RoamingPreferenceController extends TogglePreferenceController impl
public RoamingPreferenceController(Context context, String key) { public RoamingPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper())); mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper()));
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
@@ -78,12 +75,12 @@ public class RoamingPreferenceController extends TogglePreferenceController impl
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mSwitchPreference = (RestrictedSwitchPreference) screen.findPreference(getPreferenceKey()); mSwitchPreference = screen.findPreference(getPreferenceKey());
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
? AVAILABLE ? AVAILABLE
: AVAILABLE_UNSEARCHABLE; : AVAILABLE_UNSEARCHABLE;
} }

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) 2019 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;
/**
* Callback to decide whether preference is available based on subscription id
*/
public interface TelephonyAvailabilityCallback {
/**
* Return availability status for a specific subId
*
* @see TelephonyBasePreferenceController
* @see TelephonyTogglePreferenceController
*/
int getAvailabilityStatus(int subId);
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) 2019 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.SubscriptionManager;
import com.android.settings.core.BasePreferenceController;
/**
* {@link BasePreferenceController} that used by all preferences that requires subscription id.
*/
public abstract class TelephonyBasePreferenceController extends BasePreferenceController
implements TelephonyAvailabilityCallback {
protected int mSubId;
public TelephonyBasePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
@Override
public int getAvailabilityStatus() {
return MobileNetworkUtils.getAvailability(mContext, mSubId, this::getAvailabilityStatus);
}
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) 2019 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.SubscriptionManager;
import com.android.settings.core.TogglePreferenceController;
/**
* {@link TogglePreferenceController} that used by all preferences that requires subscription id.
*/
public abstract class TelephonyTogglePreferenceController extends TogglePreferenceController
implements TelephonyAvailabilityCallback {
protected int mSubId;
public TelephonyTogglePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
@Override
public int getAvailabilityStatus() {
return MobileNetworkUtils.getAvailability(mContext, mSubId, this::getAvailabilityStatus);
}
}

View File

@@ -42,7 +42,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
/** /**
* Preference controller for "Video Calling" * Preference controller for "Video Calling"
*/ */
public class VideoCallingPreferenceController extends TogglePreferenceController implements public class VideoCallingPreferenceController extends TelephonyTogglePreferenceController implements
LifecycleObserver, OnStart, OnStop, LifecycleObserver, OnStart, OnStop,
Enhanced4gLtePreferenceController.On4gLteUpdateListener { Enhanced4gLtePreferenceController.On4gLteUpdateListener {
@@ -54,21 +54,19 @@ public class VideoCallingPreferenceController extends TogglePreferenceController
ImsManager mImsManager; ImsManager mImsManager;
private PhoneCallStateListener mPhoneStateListener; private PhoneCallStateListener mPhoneStateListener;
private DataContentObserver mDataContentObserver; private DataContentObserver mDataContentObserver;
private int mSubId;
public VideoCallingPreferenceController(Context context, String key) { public VideoCallingPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper())); mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper()));
mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper());
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
&& MobileNetworkUtils.isWifiCallingEnabled(mContext, && MobileNetworkUtils.isWifiCallingEnabled(mContext,
SubscriptionManager.getPhoneId(mSubId)) SubscriptionManager.getPhoneId(subId))
&& isVideoCallEnabled() && isVideoCallEnabled()
? AVAILABLE ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE; : CONDITIONALLY_UNAVAILABLE;

View File

@@ -33,7 +33,6 @@ import androidx.preference.PreferenceScreen;
import com.android.ims.ImsConfig; import com.android.ims.ImsConfig;
import com.android.ims.ImsManager; import com.android.ims.ImsManager;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -43,7 +42,7 @@ import java.util.List;
/** /**
* Preference controller for "Wifi Calling" * Preference controller for "Wifi Calling"
*/ */
public class WifiCallingPreferenceController extends BasePreferenceController implements public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements
LifecycleObserver, OnStart, OnStop { LifecycleObserver, OnStart, OnStop {
@VisibleForTesting @VisibleForTesting
@@ -56,19 +55,17 @@ public class WifiCallingPreferenceController extends BasePreferenceController im
PhoneAccountHandle mSimCallManager; PhoneAccountHandle mSimCallManager;
private PhoneCallStateListener mPhoneStateListener; private PhoneCallStateListener mPhoneStateListener;
private Preference mPreference; private Preference mPreference;
private int mSubId;
public WifiCallingPreferenceController(Context context, String key) { public WifiCallingPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mTelephonyManager = context.getSystemService(TelephonyManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class);
mSimCallManager = context.getSystemService(TelecomManager.class).getSimCallManager(); mSimCallManager = context.getSystemService(TelecomManager.class).getSimCallManager();
mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper());
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus(int subId) {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
&& MobileNetworkUtils.isWifiCallingEnabled(mContext, && MobileNetworkUtils.isWifiCallingEnabled(mContext,
SubscriptionManager.getPhoneId(mSubId)) SubscriptionManager.getPhoneId(mSubId))
? AVAILABLE ? AVAILABLE

View File

@@ -41,7 +41,6 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneConstants;
import com.android.settings.R;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -184,4 +183,19 @@ public class MobileNetworkUtilsTest {
assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue(); assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
} }
@Test
public void getSearchableSubscriptionId_oneActive_returnValid() {
when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[]{SUB_ID_1});
assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext)).isEqualTo(SUB_ID_1);
}
@Test
public void getSearchableSubscriptionId_nonActive_returnInvalid() {
when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[0]);
assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext))
.isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
}
} }

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) 2019 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.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.telephony.SubscriptionManager;
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;
@RunWith(RobolectricTestRunner.class)
public class TelephonyBasePreferenceControllerTest {
private static final int VALID_SUB_ID = 1;
@Mock
private SubscriptionManager mSubscriptionManager;
private TestPreferenceController mPreferenceController;
private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(SubscriptionManager.class))
.thenReturn(mSubscriptionManager);
when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[]{});
mPreferenceController = new TestPreferenceController(mContext, "prefKey");
}
@Test
public void isAvailable_validSubIdSet_returnTrue() {
mPreferenceController.init(VALID_SUB_ID);
assertThat(mPreferenceController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noIdSetHoweverHasDefaultOne_returnTrue() {
when(mSubscriptionManager.getActiveSubscriptionIdList())
.thenReturn(new int[]{VALID_SUB_ID});
assertThat(mPreferenceController.isAvailable()).isTrue();
}
@Test
public void isAvailable_noDefaultAndNoSet_returnFalse() {
assertThat(mPreferenceController.isAvailable()).isFalse();
}
/**
* Test preference controller for {@link TelephonyBasePreferenceController}
*/
public class TestPreferenceController extends TelephonyBasePreferenceController {
public TestPreferenceController(Context context, String prefKey) {
super(context, prefKey);
}
public void init(int subId) {
mSubId = subId;
}
@Override
public int getAvailabilityStatus(int subId) {
return subId == VALID_SUB_ID ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
}
}