am ff85b1b5: Merge "Disallow additional conferencing of full GSM conferences" into lmp-dev

* commit 'ff85b1b5eca38561c9e743e1872d4aedf8e0af9b':
  Disallow additional conferencing of full GSM conferences
diff --git a/src/com/android/services/telephony/GsmConferenceController.java b/src/com/android/services/telephony/GsmConferenceController.java
index ecac404..b6aaaf9 100644
--- a/src/com/android/services/telephony/GsmConferenceController.java
+++ b/src/com/android/services/telephony/GsmConferenceController.java
@@ -33,6 +33,8 @@
  * call functionality.
  */
 final class GsmConferenceController {
+    private static final int GSM_CONFERENCE_MAX_SIZE = 5;
+
     private final Connection.Listener mConnectionListener = new Connection.Listener() {
         @Override
         public void onStateChanged(Connection c, int state) {
@@ -80,6 +82,15 @@
         recalculateConference();
     }
 
+    private boolean isFullConference(Conference conference) {
+        return conference.getConnections().size() >= GSM_CONFERENCE_MAX_SIZE;
+    }
+
+    private boolean participatesInFullConference(Connection connection) {
+        return connection.getConference() != null &&
+                isFullConference(connection.getConference());
+    }
+
     /**
      * Calculates the conference-capable state of all GSM connections in this connection service.
      */
@@ -91,25 +102,22 @@
 
         // Loop through and collect all calls which are active or holding
         for (GsmConnection connection : mGsmConnections) {
-            com.android.internal.telephony.Connection radioConnection =
-                    connection.getOriginalConnection();
-            Log.d(this, "recalc - %s %s",
-                    radioConnection == null ? null : radioConnection.getState(), connection);
+            Log.d(this, "recalc - %s %s", connection.getState(), connection);
 
-            if (radioConnection != null) {
-                switch(radioConnection.getState()) {
-                    case ACTIVE:
+            if (!participatesInFullConference(connection)) {
+                switch (connection.getState()) {
+                    case Connection.STATE_ACTIVE:
                         activeConnections.add(connection);
-                        break;
-                    case HOLDING:
+                        continue;
+                    case Connection.STATE_HOLDING:
                         backgroundConnections.add(connection);
-                        break;
+                        continue;
                     default:
-                        connection.setConferenceableConnections(
-                                Collections.<Connection>emptyList());
                         break;
                 }
             }
+
+            connection.setConferenceableConnections(Collections.<Connection>emptyList());
         }
 
         Log.v(this, "active: %d, holding: %d",
@@ -128,7 +136,7 @@
         }
 
         // Set the conference as conferenceable with all the connections
-        if (mGsmConference != null) {
+        if (mGsmConference != null && !isFullConference(mGsmConference)) {
             List<Connection> nonConferencedConnections = new ArrayList<>(mGsmConnections.size());
             for (GsmConnection c : mGsmConnections) {
                 if (c.getConference() == null) {