Honor DISALLOW_CELLULAR_2G User Restriction in Enable2gPreferenceController

When 2g is disallowed by a device admin the 2g toggle in the preference
screen will implement the following behaviors as a result of being
changed to a RestrictedSwitchPreference:
1. become disabled (greyed out)
2. show a summary message explaining that the preference was disabled by
   an admin
3 show a pop up when a user tries to click on the preference informing
  them that the setting is unusable because it was disabled by an admin.

Additionally, the toggle will show as unchecked (off) when admins
disable 2g.

When 2g is re-enabled by a device admin, the preference screen will go back
to its previous state.

Test: atest Enable2gPreferenceControllerTest
Bug: b/248250240
Change-Id: I7af901f2d9f62ebfe884e01724d8eff845c2968e
This commit is contained in:
Gil Cukierman
2022-09-23 15:55:18 +00:00
parent 90dcc7c5c1
commit a2ddff3865
3 changed files with 139 additions and 48 deletions

View File

@@ -26,11 +26,13 @@ import android.text.TextUtils;
import android.util.Log;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.network.CarrierConfigCache;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
@@ -50,29 +52,31 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class Enable2gPreferenceController extends TelephonyTogglePreferenceController {
private static final String LOG_TAG = "Enable2gPreferenceController";
private static final long BITMASK_2G = TelephonyManager.NETWORK_TYPE_BITMASK_GSM
| TelephonyManager.NETWORK_TYPE_BITMASK_GPRS
| TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
| TelephonyManager.NETWORK_TYPE_BITMASK_CDMA
| TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
private static final long BITMASK_2G = TelephonyManager.NETWORK_TYPE_BITMASK_GSM
| TelephonyManager.NETWORK_TYPE_BITMASK_GPRS
| TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
| TelephonyManager.NETWORK_TYPE_BITMASK_CDMA
| TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private CarrierConfigCache mCarrierConfigCache;
private SubscriptionManager mSubscriptionManager;
private TelephonyManager mTelephonyManager;
private RestrictedSwitchPreference mRestrictedPreference;
/**
* Class constructor of "Enable 2G" toggle.
*
* @param context of settings
* @param key assigned within UI entry of XML file
* @param key assigned within UI entry of XML file
*/
public Enable2gPreferenceController(Context context, String key) {
super(context, key);
mCarrierConfigCache = CarrierConfigCache.getInstance(context);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
mRestrictedPreference = null;
}
/**
@@ -84,10 +88,53 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
public Enable2gPreferenceController init(int subId) {
mSubId = subId;
mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
.createForSubscriptionId(mSubId);
.createForSubscriptionId(mSubId);
return this;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mRestrictedPreference = screen.findPreference(getPreferenceKey());
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
// The device admin decision overrides any carrier preferences
if (isDisabledByAdmin()) {
return;
}
if (preference == null || !SubscriptionManager.isUsableSubscriptionId(mSubId)) {
return;
}
final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
boolean isDisabledByCarrier =
carrierConfig != null
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G);
preference.setEnabled(!isDisabledByCarrier);
String summary;
if (isDisabledByCarrier) {
summary = mContext.getString(R.string.enable_2g_summary_disabled_carrier,
getCarrierName());
} else {
summary = mContext.getString(R.string.enable_2g_summary);
}
preference.setSummary(summary);
}
private String getCarrierName() {
SubscriptionInfo subInfo = SubscriptionUtil.getSubById(mSubscriptionManager, mSubId);
if (subInfo == null) {
return "";
}
CharSequence carrierName = subInfo.getCarrierName();
return TextUtils.isEmpty(carrierName) ? "" : carrierName.toString();
}
/**
* Get the {@link com.android.settings.core.BasePreferenceController.AvailabilityStatus} for
* this preference given a {@code subId}.
@@ -104,36 +151,6 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
* <a href="https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/radio/1.6/IRadio.hal">Radio HAL version 1.6 or greater</a> </li>
* </ul>
*/
@Override
public void updateState(Preference preference) {
super.updateState(preference);
if (preference == null || !SubscriptionManager.isUsableSubscriptionId(mSubId)) {
return;
}
final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
boolean isDisabledByCarrier =
carrierConfig != null
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLE_2G);
preference.setEnabled(!isDisabledByCarrier);
String summary;
if (isDisabledByCarrier) {
summary = mContext.getString(R.string.enable_2g_summary_disabled_carrier,
getCarrierName());
} else {
summary = mContext.getString(R.string.enable_2g_summary);
}
preference.setSummary(summary);
}
private String getCarrierName() {
SubscriptionInfo subInfo = SubscriptionUtil.getSubById(mSubscriptionManager, mSubId);
if (subInfo == null) {
return "";
}
CharSequence carrierName = subInfo.getCarrierName();
return TextUtils.isEmpty(carrierName) ? "" : carrierName.toString();
}
@Override
public int getAvailabilityStatus(int subId) {
final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId);
@@ -143,9 +160,9 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
}
boolean visible =
SubscriptionManager.isUsableSubscriptionId(subId)
&& carrierConfig != null
&& mTelephonyManager.isRadioInterfaceCapabilitySupported(
mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK);
&& carrierConfig != null
&& mTelephonyManager.isRadioInterfaceCapabilitySupported(
mTelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK);
return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@@ -158,6 +175,14 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
*/
@Override
public boolean isChecked() {
// If an enterprise admin has disabled 2g, we show the toggle as not checked to avoid
// user confusion of seeing a checked toggle, but having 2g actually disabled.
// The RestrictedSwitchPreference will take care of transparently informing the user that
// the setting was disabled by their admin
if (isDisabledByAdmin()) {
return false;
}
long currentlyAllowedNetworkTypes = mTelephonyManager.getAllowedNetworkTypesForReason(
mTelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G);
return (currentlyAllowedNetworkTypes & BITMASK_2G) != 0;
@@ -176,6 +201,10 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
*/
@Override
public boolean setChecked(boolean isChecked) {
if (isDisabledByAdmin()) {
return false;
}
if (!SubscriptionManager.isUsableSubscriptionId(mSubId)) {
return false;
}
@@ -199,4 +228,8 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
mContext, SettingsEnums.ACTION_2G_ENABLED, isChecked);
return true;
}
private boolean isDisabledByAdmin() {
return (mRestrictedPreference != null && mRestrictedPreference.isDisabledByAdmin());
}
}