Fix for call timer resetting when starting IMS conference call. 1/4

- Added support in Conference for specifying the connect time when the
conference is created.

Bug: 18959443
Change-Id: I501edde3b62f6bf021eb7455089e80626013da12
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index e764cd5..33bbb29 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -32,6 +32,12 @@
 @SystemApi
 public abstract class Conference implements IConferenceable {
 
+    /**
+     * Used to indicate that the conference connection time is not specified.  If not specified,
+     * Telecom will set the connect time.
+     */
+    public static long CONNECT_TIME_NOT_SPECIFIED = 0;
+
     /** @hide */
     public abstract static class Listener {
         public void onStateChanged(Conference conference, int oldState, int newState) {}
@@ -59,6 +65,7 @@
     private DisconnectCause mDisconnectCause;
     private int mConnectionCapabilities;
     private String mDisconnectMessage;
+    private long mConnectTimeMillis = CONNECT_TIME_NOT_SPECIFIED;
 
     private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
         @Override
@@ -422,6 +429,26 @@
     }
 
     /**
+     * Sets the connect time of the {@code Conference}.
+     *
+     * @param connectTimeMillis The connection time, in milliseconds.
+     */
+    public void setConnectTimeMillis(long connectTimeMillis) {
+        mConnectTimeMillis = connectTimeMillis;
+    }
+
+    /**
+     * Retrieves the connect time of the {@code Conference}, if specified.  A value of
+     * {@link #CONNECT_TIME_NOT_SPECIFIED} indicates that Telecom should determine the start time
+     * of the conference.
+     *
+     * @return The time the {@code Conference} has been connected.
+     */
+    public long getConnectTimeMillis() {
+        return mConnectTimeMillis;
+    }
+
+    /**
      * Inform this Conference that the state of its audio output has been changed externally.
      *
      * @param state The new audio state.
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index df16375..dfdc3e1 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -883,7 +883,8 @@
                     conference.getPhoneAccountHandle(),
                     conference.getState(),
                     conference.getConnectionCapabilities(),
-                    connectionIds);
+                    connectionIds,
+                    conference.getConnectTimeMillis());
             mAdapter.addConferenceCall(id, parcelableConference);
 
             // Go through any child calls and set the parent.
diff --git a/telecomm/java/android/telecom/ParcelableConference.java b/telecomm/java/android/telecom/ParcelableConference.java
index c4e11d6..dcc2713 100644
--- a/telecomm/java/android/telecom/ParcelableConference.java
+++ b/telecomm/java/android/telecom/ParcelableConference.java
@@ -32,6 +32,7 @@
     private int mState;
     private int mConnectionCapabilities;
     private List<String> mConnectionIds;
+    private long mConnectTimeMillis;
 
     public ParcelableConference(
             PhoneAccountHandle phoneAccount,
@@ -42,6 +43,17 @@
         mState = state;
         mConnectionCapabilities = connectionCapabilities;
         mConnectionIds = connectionIds;
+        mConnectTimeMillis = Conference.CONNECT_TIME_NOT_SPECIFIED;
+    }
+
+    public ParcelableConference(
+            PhoneAccountHandle phoneAccount,
+            int state,
+            int connectionCapabilities,
+            List<String> connectionIds,
+            long connectTimeMillis) {
+        this(phoneAccount, state, connectionCapabilities, connectionIds);
+        mConnectTimeMillis = connectTimeMillis;
     }
 
     @Override
@@ -53,6 +65,8 @@
                 .append(Connection.stateToString(mState))
                 .append(", capabilities: ")
                 .append(Connection.capabilitiesToString(mConnectionCapabilities))
+                .append(", connectTime: ")
+                .append(mConnectTimeMillis)
                 .append(", children: ")
                 .append(mConnectionIds)
                 .toString();
@@ -74,6 +88,10 @@
         return mConnectionIds;
     }
 
+    public long getConnectTimeMillis() {
+        return mConnectTimeMillis;
+    }
+
     public static final Parcelable.Creator<ParcelableConference> CREATOR =
             new Parcelable.Creator<ParcelableConference> () {
         @Override
@@ -84,8 +102,10 @@
             int capabilities = source.readInt();
             List<String> connectionIds = new ArrayList<>(2);
             source.readList(connectionIds, classLoader);
+            long connectTimeMillis = source.readLong();
 
-            return new ParcelableConference(phoneAccount, state, capabilities, connectionIds);
+            return new ParcelableConference(phoneAccount, state, capabilities, connectionIds,
+                    connectTimeMillis);
         }
 
         @Override
@@ -107,5 +127,6 @@
         destination.writeInt(mState);
         destination.writeInt(mConnectionCapabilities);
         destination.writeList(mConnectionIds);
+        destination.writeLong(mConnectTimeMillis);
     }
 }