Add setting to turn off connection manager support.

connection manager support allows a component to supply alternative
calling methods in place of a SIM-based call.

Bug: 16794451
Change-Id: I7cbe8342bff5ba8e8f20ceb61a1b6fdbee7a543c
diff --git a/src/com/android/telecomm/PhoneAccountRegistrar.java b/src/com/android/telecomm/PhoneAccountRegistrar.java
index f3a5a0b..db05fff 100644
--- a/src/com/android/telecomm/PhoneAccountRegistrar.java
+++ b/src/com/android/telecomm/PhoneAccountRegistrar.java
@@ -50,6 +50,7 @@
 import java.lang.SecurityException;
 import java.lang.String;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
@@ -74,6 +75,7 @@
 
     private final List<Listener> mListeners = new CopyOnWriteArrayList<>();
     private final AtomicFile mAtomicFile;
+    private final Context mContext;
     private State mState;
 
     public PhoneAccountRegistrar(Context context) {
@@ -85,6 +87,7 @@
         // TODO: Change file location when Telecomm is part of system
         mAtomicFile = new AtomicFile(new File(context.getFilesDir(), fileName));
         mState = new State();
+        mContext = context;
         read();
     }
 
@@ -148,6 +151,10 @@
     }
 
     public void setSimCallManager(PhoneAccountHandle callManager) {
+        if (!isEnabledConnectionManager()) {
+            return;
+        }
+
         if (callManager != null) {
             PhoneAccount callManagerAccount = getPhoneAccount(callManager);
             if (callManagerAccount == null) {
@@ -164,6 +171,10 @@
     }
 
     public PhoneAccountHandle getSimCallManager() {
+        if (!isEnabledConnectionManager()) {
+            return null;
+        }
+
         if (mState.simCallManager != null) {
             // Return the registered sim call manager iff it still exists (we keep a sticky
             // setting to survive account deletion and re-addition)
@@ -175,11 +186,10 @@
         }
 
         // See if the OEM has specified a default one.
-        Context context = TelecommApp.getInstance();
         String defaultConnectionMgr =
-                context.getResources().getString(R.string.default_connection_manager_component);
+                mContext.getResources().getString(R.string.default_connection_manager_component);
         if (!TextUtils.isEmpty(defaultConnectionMgr)) {
-            PackageManager pm = context.getPackageManager();
+            PackageManager pm = mContext.getPackageManager();
 
             ComponentName componentName = ComponentName.unflattenFromString(defaultConnectionMgr);
             Intent intent = new Intent(ConnectionService.SERVICE_INTERFACE);
@@ -219,7 +229,14 @@
     }
 
     public List<PhoneAccountHandle> getOutgoingPhoneAccounts() {
-        return getCallProviderAccountHandles();
+        return getPhoneAccountHandles(PhoneAccount.CAPABILITY_CALL_PROVIDER);
+    }
+
+    public List<PhoneAccountHandle> getAllConnectionManagerPhoneAccounts() {
+        if (isEnabledConnectionManager()) {
+            return getPhoneAccountHandles(PhoneAccount.CAPABILITY_CONNECTION_MANAGER);
+        }
+        return Collections.emptyList();
     }
 
     public PhoneAccount getPhoneAccount(PhoneAccountHandle handle) {
@@ -323,6 +340,10 @@
         }
     }
 
+    private boolean isEnabledConnectionManager() {
+        return mContext.getResources().getBoolean(R.bool.connection_manager_enabled);
+    }
+
     /**
      * Determines if the connection service specified by a {@link PhoneAccountHandle} has the
      * {@link Manifest.permission#BIND_CONNECTION_SERVICE} permission.
@@ -352,10 +373,13 @@
         return (account.getCapabilities() & capability) == capability;
     }
 
-    private List<PhoneAccountHandle> getCallProviderAccountHandles() {
+    /**
+     * Returns a list of phone account handles with the specified flag.
+     */
+    private List<PhoneAccountHandle> getPhoneAccountHandles(int flags) {
         List<PhoneAccountHandle> accountHandles = new ArrayList<>();
         for (PhoneAccount m : mState.accounts) {
-            if (has(m, PhoneAccount.CAPABILITY_CALL_PROVIDER)) {
+            if (has(m, flags)) {
                 accountHandles.add(m.getAccountHandle());
             }
         }