[Settings] To avoid use APIs in IccCard directly, calling APIs through TelephonyManager

Bug: 146983487
Test: manual
Change-Id: I4bf1341f972639829cd9fc64370018127460a65f
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 8880001..eed3b49 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -24,11 +24,12 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.PixelFormat;
-import android.os.AsyncResult;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.telephony.SubscriptionInfo;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
@@ -49,9 +50,6 @@
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.settings.network.ProxySubscriptionManager;
 
@@ -112,7 +110,6 @@
     private TabWidget mTabWidget;
     private ListView mListView;
 
-    private Phone mPhone;
     private ProxySubscriptionManager mProxySubscriptionMgr;
 
     private EditPinPreference mPinDialog;
@@ -121,24 +118,18 @@
     private Resources mRes;
 
     // For async handler to identify request type
-    private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100;
-    private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101;
     private static final int MSG_SIM_STATE_CHANGED = 102;
 
     // @see android.widget.Toast$TN
     private static final long LONG_DURATION_TIMEOUT = 7000;
 
+    private int mSubId;
+    private TelephonyManager mTelephonyManager;
+
     // For replies from IccCard interface
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
-            final AsyncResult ar = (AsyncResult) msg.obj;
             switch (msg.what) {
-                case MSG_ENABLE_ICC_PIN_COMPLETE:
-                    iccLockChanged(ar.exception == null, msg.arg1, ar.exception);
-                    break;
-                case MSG_CHANGE_ICC_PIN_COMPLETE:
-                    iccPinChanged(ar.exception == null, msg.arg1);
-                    break;
                 case MSG_SIM_STATE_CHANGED:
                     updatePreferences();
                     break;
@@ -158,11 +149,12 @@
     };
 
     // For top-level settings screen to query
-    static boolean isIccLockEnabled() {
-        return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled();
+    private boolean isIccLockEnabled() {
+        mTelephonyManager =  mTelephonyManager.createForSubscriptionId(mSubId);
+        return mTelephonyManager.isIccLockEnabled();
     }
 
-    static String getSummary(Context context) {
+    private String getSummary(Context context) {
         final Resources res = context.getResources();
         final String summary = isIccLockEnabled()
                 ? res.getString(R.string.sim_lock_on)
@@ -184,6 +176,8 @@
         mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(getContext());
         mProxySubscriptionMgr.setLifecycle(getLifecycle());
 
+        mTelephonyManager = getContext().getSystemService(TelephonyManager.class);
+
         addPreferencesFromResource(R.xml.sim_lock_settings);
 
         mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG);
@@ -251,15 +245,13 @@
                             : subInfo.getDisplayName())));
             }
             final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(subInfoList, 0);
-
-            mPhone = (sir == null) ? null : PhoneFactory.getPhone(sir.getSimSlotIndex());
+            mSubId = sir.getSubscriptionId();
 
             if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_TAB)) {
                 mTabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB));
             }
             return view;
         } else {
-            mPhone = PhoneFactory.getDefaultPhone();
             return super.onCreateView(inflater, container, savedInstanceState);
         }
     }
@@ -271,14 +263,20 @@
     }
 
     private void updatePreferences() {
+
+        final List<SubscriptionInfo> subInfoList =
+                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
+        final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(subInfoList, 0);
+        mSubId = sir.getSubscriptionId();
+
         if (mPinDialog != null) {
-            mPinDialog.setEnabled(mPhone != null);
+            mPinDialog.setEnabled(sir != null);
         }
         if (mPinToggle != null) {
-            mPinToggle.setEnabled(mPhone != null);
+            mPinToggle.setEnabled(sir != null);
 
-            if (mPhone != null) {
-                mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
+            if (sir != null) {
+                mPinToggle.setChecked(isIccLockEnabled());
             }
         }
     }
@@ -462,29 +460,52 @@
     private void tryChangeIccLockState() {
         // Try to change icc lock. If it succeeds, toggle the lock state and
         // reset dialog state. Else inject error message and show dialog again.
-        final Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);
-        mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
+        new SetIccLockEnabled(mToState, mPin).execute();
         // Disable the setting till the response is received.
         mPinToggle.setEnabled(false);
     }
 
-    private void iccLockChanged(boolean success, int attemptsRemaining, Throwable exception) {
+    private class SetIccLockEnabled extends AsyncTask<Void, Void, Void> {
+        private final boolean mState;
+        private final String mPassword;
+        private int mAttemptsRemaining;
+
+        private SetIccLockEnabled(boolean state, String pin) {
+            mState = state;
+            mPassword = pin;
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            mTelephonyManager =  mTelephonyManager.createForSubscriptionId(mSubId);
+            mAttemptsRemaining = mTelephonyManager.setIccLockEnabled(mState, mPassword);
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void aVoid) {
+            if (mAttemptsRemaining == TelephonyManager.CHANGE_ICC_LOCK_SUCCESS) {
+                iccLockChanged(true, mAttemptsRemaining);
+            } else {
+                iccLockChanged(false, mAttemptsRemaining);
+            }
+        }
+    }
+
+    private void iccLockChanged(boolean success, int attemptsRemaining) {
+        Log.d(TAG, "iccLockChanged: success = " + success);
         if (success) {
             mPinToggle.setChecked(mToState);
         } else {
-            if (exception instanceof CommandException) {
-                final CommandException.Error err =
-                        ((CommandException) exception).getCommandError();
-                if (err == CommandException.Error.PASSWORD_INCORRECT) {
-                    createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
+            if (attemptsRemaining >= 0) {
+                createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
+            } else {
+                if (mToState) {
+                    Toast.makeText(getContext(), mRes.getString(
+                            R.string.sim_pin_enable_failed), Toast.LENGTH_LONG).show();
                 } else {
-                    if (mToState) {
-                        Toast.makeText(getContext(), mRes.getString
-                               (R.string.sim_pin_enable_failed), Toast.LENGTH_LONG).show();
-                    } else {
-                        Toast.makeText(getContext(), mRes.getString
-                               (R.string.sim_pin_disable_failed), Toast.LENGTH_LONG).show();
-                    }
+                    Toast.makeText(getContext(), mRes.getString(
+                            R.string.sim_pin_disable_failed), Toast.LENGTH_LONG).show();
                 }
             }
         }
@@ -540,21 +561,46 @@
     }
 
     private void iccPinChanged(boolean success, int attemptsRemaining) {
+        Log.d(TAG, "iccPinChanged: success = " + success);
         if (!success) {
             createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
         } else {
             Toast.makeText(getContext(), mRes.getString(R.string.sim_change_succeeded),
                     Toast.LENGTH_SHORT)
                     .show();
-
         }
         resetDialogState();
     }
 
     private void tryChangePin() {
-        final Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE);
-        mPhone.getIccCard().changeIccLockPassword(mOldPin,
-                mNewPin, callback);
+        new ChangeIccLockPassword(mOldPin, mNewPin).execute();
+    }
+
+    private class ChangeIccLockPassword extends AsyncTask<Void, Void, Void> {
+        private final String mOldPwd;
+        private final String mNewPwd;
+        private int mAttemptsRemaining;
+
+        private ChangeIccLockPassword(String oldPin, String newPin) {
+            mOldPwd = oldPin;
+            mNewPwd = newPin;
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+            mAttemptsRemaining = mTelephonyManager.changeIccLockPassword(mOldPwd, mNewPwd);
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void aVoid) {
+            if (mAttemptsRemaining == TelephonyManager.CHANGE_ICC_LOCK_SUCCESS) {
+                iccPinChanged(true, mAttemptsRemaining);
+            } else {
+                iccPinChanged(false, mAttemptsRemaining);
+            }
+        }
     }
 
     private String getPinPasswordErrorMessage(int attemptsRemaining) {
@@ -610,8 +656,6 @@
             final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(
                     mProxySubscriptionMgr.getActiveSubscriptionsInfo(), slotId);
 
-            mPhone = (sir == null) ? null : PhoneFactory.getPhone(sir.getSimSlotIndex());
-
             // The User has changed tab; update the body.
             updatePreferences();
         }