Revert "Revert "Add getUiccSlots() and switchSlots() in TelephonyManager.""

This reverts commit fffb8bb0dca8bc7ffbe5463ce0b47ecad906d5c9.

Reason for revert: The original failure was not caused by this CL and doesn't contain any dependency.

Change-Id: I1923bde82aabbe046e7c89d4fefa92648abdd3c1
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 64f6214..8127eae 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -67,6 +67,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyHistogram;
 import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
 import android.telephony.UssdResponse;
 import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.text.TextUtils;
@@ -106,6 +107,7 @@
 import com.android.internal.telephony.uicc.UiccCard;
 import com.android.internal.telephony.uicc.UiccCardApplication;
 import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.uicc.UiccSlot;
 import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
 import com.android.internal.util.HexDump;
 import com.android.phone.vvm.PhoneAccountHandleConverter;
@@ -178,6 +180,8 @@
     private static final int CMD_HANDLE_USSD_REQUEST = 47;
     private static final int CMD_GET_FORBIDDEN_PLMNS = 48;
     private static final int EVENT_GET_FORBIDDEN_PLMNS_DONE = 49;
+    private static final int CMD_SWITCH_SLOTS = 50;
+    private static final int EVENT_SWITCH_SLOTS_DONE = 51;
 
     /** The singleton instance. */
     private static PhoneInterfaceManager sInstance;
@@ -940,6 +944,22 @@
                               onCompleted);
                     break;
 
+                case CMD_SWITCH_SLOTS:
+                    request = (MainThreadRequest) msg.obj;
+                    int[] physicalSlots = (int[]) request.argument;
+                    onCompleted = obtainMessage(EVENT_SWITCH_SLOTS_DONE, request);
+                    UiccController.getInstance().switchSlots(physicalSlots, onCompleted);
+                    break;
+
+                case EVENT_SWITCH_SLOTS_DONE:
+                    ar = (AsyncResult) msg.obj;
+                    request = (MainThreadRequest) ar.userObj;
+                    request.result = (ar.exception == null);
+                    synchronized (request) {
+                        request.notifyAll();
+                    }
+                    break;
+
                 default:
                     Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
                     break;
@@ -3948,4 +3968,46 @@
 
         return p.getSignalStrength();
     }
+
+    @Override
+    public UiccSlotInfo[] getUiccSlotsInfo() {
+        enforceReadPrivilegedPermission();
+
+        UiccSlot[] slots = UiccController.getInstance().getUiccSlots();
+        if (slots == null) return null;
+        UiccSlotInfo[] infos = new UiccSlotInfo[slots.length];
+        for (int i = 0; i < slots.length; i++) {
+            UiccSlot slot = slots[i];
+
+            String cardId = UiccController.getInstance().getUiccCard(i).getCardId();
+
+            int cardState = 0;
+            switch (slot.getCardState()) {
+                case CARDSTATE_ABSENT:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT;
+                    break;
+                case CARDSTATE_PRESENT:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+                    break;
+                case CARDSTATE_ERROR:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_ERROR;
+                    break;
+                case CARDSTATE_RESTRICTED:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_RESTRICTED;
+                    break;
+                default:
+                    break;
+
+            }
+
+            infos[i] = new UiccSlotInfo(slot.isActive(), slot.isEuicc(), cardId, cardState);
+        }
+        return infos;
+    }
+
+    @Override
+    public boolean switchSlots(int[] physicalSlots) {
+        enforceModifyPermission();
+        return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+    }
 }