From ee81a02109a29dd838ee8d19d5f4c01252bd5c14 Mon Sep 17 00:00:00 2001 From: Lee Chou Date: Mon, 2 Mar 2020 11:32:50 +0800 Subject: [PATCH] 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 --- ...onfirmSimDeletionPreferenceController.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java index f24d8db32b5..8d093c0bc46 100644 --- a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java +++ b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java @@ -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);