Implement multi-SIM capabilities (6/6) [DO NOT MERGE]

Bug:16292368
Change-Id: Idede24237accb9c4d30a6f016fbfc4e2d74ebe53
(cherry picked from commit 48f132d9c0823858373da46fb270d0075d58d0b1)
diff --git a/src/com/android/telecomm/TelecommServiceImpl.java b/src/com/android/telecomm/TelecommServiceImpl.java
index f1ab6c0..9bf4987 100644
--- a/src/com/android/telecomm/TelecommServiceImpl.java
+++ b/src/com/android/telecomm/TelecommServiceImpl.java
@@ -29,13 +29,16 @@
 import android.phone.PhoneManager;
 import android.telecomm.CallState;
 import android.telecomm.PhoneAccount;
+import android.telecomm.PhoneAccountMetadata;
 import android.telecomm.TelecommManager;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.telecomm.ITelecommService;
-import com.google.android.collect.Lists;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Implementation of the ITelecomm interface.
@@ -135,60 +138,94 @@
     // Implementation of the ITelecommService interface.
     //
 
-    @Override
-    public List<PhoneAccount> getAccounts() {
+    private static Map<PhoneAccount, PhoneAccountMetadata> sMetadataByAccount = new HashMap<>();
+
+    static {
         // TODO (STOPSHIP): Static list of Accounts for testing and UX work only.
         ComponentName componentName = new ComponentName(
                 "com.android.telecomm",
                 TelecommServiceImpl.class.getName());  // This field is a no-op
         Context app = TelecommApp.getInstance();
 
-        return Lists.newArrayList(
+        PhoneAccount[] accounts = new PhoneAccount[] {
                 new PhoneAccount(
                         componentName,
                         "account0",
                         Uri.parse("tel:999-555-1212"),
-                        app.getString(R.string.test_account_0_label),
-                        app.getString(R.string.test_account_0_short_description),
-                        true,
-                        true),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account1",
                         Uri.parse("tel:333-111-2222"),
-                        app.getString(R.string.test_account_1_label),
-                        app.getString(R.string.test_account_1_short_description),
-                        true,
-                        false),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account2",
                         Uri.parse("mailto:two@example.com"),
-                        app.getString(R.string.test_account_2_label),
-                        app.getString(R.string.test_account_2_short_description),
-                        true,
-                        false),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account3",
                         Uri.parse("mailto:three@example.com"),
+                        0)
+        };
+
+        sMetadataByAccount.put(
+                accounts[0],
+                new PhoneAccountMetadata(
+                        accounts[0],
+                        0,
+                        app.getString(R.string.test_account_0_label),
+                        app.getString(R.string.test_account_0_short_description)));
+        sMetadataByAccount.put(
+                accounts[1],
+                new PhoneAccountMetadata(
+                        accounts[1],
+                        0,
+                        app.getString(R.string.test_account_1_label),
+                        app.getString(R.string.test_account_1_short_description)));
+        sMetadataByAccount.put(
+                accounts[2],
+                new PhoneAccountMetadata(
+                        accounts[2],
+                        0,
+                        app.getString(R.string.test_account_2_label),
+                        app.getString(R.string.test_account_2_short_description)));
+        sMetadataByAccount.put(
+                accounts[3],
+                new PhoneAccountMetadata(
+                        accounts[3],
+                        0,
                         app.getString(R.string.test_account_3_label),
-                        app.getString(R.string.test_account_3_short_description),
-                        true,
-                        false)
-        );
+                        app.getString(R.string.test_account_3_short_description)));
     }
 
     @Override
-    public void setEnabled(PhoneAccount account, boolean enabled) {
-        // Enforce MODIFY_PHONE_STATE ?
-        // TODO
+    public List<PhoneAccount> getEnabledPhoneAccounts() {
+        return new ArrayList<>(sMetadataByAccount.keySet());
     }
 
     @Override
-    public void setSystemDefault(PhoneAccount account) {
-        // Enforce MODIFY_PHONE_STATE ?
-        // TODO
+    public PhoneAccountMetadata getPhoneAccountMetadata(PhoneAccount account) {
+        return sMetadataByAccount.get(account);
+    }
+
+    @Override
+    public void registerPhoneAccount(PhoneAccount account, PhoneAccountMetadata metadata) {
+        enforceModifyPermissionOrCallingPackage(account.getComponentName().getPackageName());
+        // TODO(santoscordon) -- IMPLEMENT ...
+    }
+
+    @Override
+    public void unregisterPhoneAccount(PhoneAccount account) {
+        enforceModifyPermissionOrCallingPackage(account.getComponentName().getPackageName());
+        // TODO(santoscordon) -- IMPLEMENT ...
+    }
+
+    @Override
+    public void clearAccounts(String packageName) {
+        enforceModifyPermissionOrCallingPackage(packageName);
+        // TODO(santoscordon) -- IMPLEMENT ...
     }
 
     /**
@@ -334,6 +371,15 @@
         }
     }
 
+    private void enforceModifyPermissionOrCallingPackage(String packageName) {
+        // TODO(santoscordon): Use a new telecomm permission for this instead of reusing modify.
+        try {
+            enforceModifyPermission();
+        } catch (SecurityException e) {
+            enforceCallingPackage(packageName);
+        }
+    }
+
     private void enforceReadPermission() {
         TelecommApp.getInstance().enforceCallingOrSelfPermission(
                 android.Manifest.permission.READ_PHONE_STATE, null);
@@ -345,6 +391,10 @@
         }
     }
 
+    private void enforceCallingPackage(String packageName) {
+        mAppOpsManager.checkPackage(Binder.getCallingUid(), packageName);
+    }
+
     private void showCallScreenInternal(boolean showDialpad) {
         CallsManager.getInstance().getInCallController().bringToForeground(showDialpad);
     }