Require authorization before turning off eSIM security feature

eSIM has a feature that requires an auth check before deletion, this
adds a security check before allowing the security feature to be turned
off.

TogglePreferenceController was changed to BasePreferenceController to
separate updating the state from UI press and updating from code.

Bug: 150568010
Test: mp settingsg and manual testing
Change-Id: I9e74e173720dce7b25d2d8a1e9004862cdb5e2e0
This commit is contained in:
Lee Chou
2020-03-02 11:32:50 +08:00
parent d09ecc3e96
commit ee81a02109

View File

@@ -24,11 +24,13 @@ import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.wifi.dpp.WifiDppUtils;
/** Enable/disable user confirmation before deleting an eSim */
public class ConfirmSimDeletionPreferenceController extends TogglePreferenceController {
public class ConfirmSimDeletionPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener{
public static final String KEY_CONFIRM_SIM_DELETION = "confirm_sim_deletion";
private boolean mConfirmationDefaultOn;
@@ -53,21 +55,39 @@ public class ConfirmSimDeletionPreferenceController extends TogglePreferenceCont
== 1;
}
@Override
public boolean isChecked() {
return getGlobalState();
}
@Override
public boolean setChecked(boolean isChecked) {
Settings.Global.putInt(
mContext.getContentResolver(), KEY_CONFIRM_SIM_DELETION, isChecked ? 1 : 0);
return true;
}
// handle UI change
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (!preference.getKey().equals(getPreferenceKey())) {
return false;
}
if (!isChecked()) {
setChecked(true);
return true;
} else {
// prevent disabling the feature until authorized
WifiDppUtils.showLockScreen(mContext, () -> {
// set data
setChecked(false);
// set UI
((TwoStatePreference) preference).setChecked(false);
});
return false;
}
}
@Override
public void updateState(Preference preference) {
final KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class);
if (!keyguardManager.isKeyguardSecure()) {
preference.setEnabled(false);