Merge "Fix call duration for unanswered/missed calls." into lmp-mr1-dev
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 67ff03a..47b4aa6f 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -189,6 +189,12 @@
*/
private long mCreationTimeMillis = System.currentTimeMillis();
+ /** The time this call was made active. */
+ private long mConnectTimeMillis = 0;
+
+ /** The time this call was disconnected. */
+ private long mDisconnectTimeMillis = 0;
+
/** The gateway information associated with this call. This stores the original call handle
* that the user is attempting to connect to via the gateway, the actual handle to dial in
* order to connect the call via the gateway, as well as the package name of the gateway
@@ -203,8 +209,6 @@
private final List<Call> mConferenceableCalls = new ArrayList<>();
- private long mConnectTimeMillis = 0;
-
/** The state of the call. */
private int mState;
@@ -386,7 +390,18 @@
mState = newState;
maybeLoadCannedSmsResponses();
- if (mState == CallState.DISCONNECTED) {
+ if (mState == CallState.ACTIVE || mState == CallState.ON_HOLD) {
+ if (mConnectTimeMillis == 0) {
+ // We check to see if mConnectTime is already set to prevent the
+ // call from resetting active time when it goes in and out of
+ // ACTIVE/ON_HOLD
+ mConnectTimeMillis = System.currentTimeMillis();
+ }
+
+ // We're clearly not disconnected, so reset the disconnected time.
+ mDisconnectTimeMillis = 0;
+ } else if (mState == CallState.DISCONNECTED) {
+ mDisconnectTimeMillis = System.currentTimeMillis();
setLocallyDisconnecting(false);
fixParentAfterDisconnect();
if ((oldState == CallState.DIALING || oldState == CallState.CONNECTING)
@@ -559,7 +574,21 @@
* mCreationTimeMillis.
*/
long getAgeMillis() {
- return System.currentTimeMillis() - mCreationTimeMillis;
+ if (mState == CallState.DISCONNECTED &&
+ (mDisconnectCause.getCode() == DisconnectCause.REJECTED ||
+ mDisconnectCause.getCode() == DisconnectCause.MISSED)) {
+ // Rejected and missed calls have no age. They're immortal!!
+ return 0;
+ } else if (mConnectTimeMillis == 0) {
+ // Age is measured in the amount of time the call was active. A zero connect time
+ // indicates that we never went active, so return 0 for the age.
+ return 0;
+ } else if (mDisconnectTimeMillis == 0) {
+ // We connected, but have not yet disconnected
+ return System.currentTimeMillis() - mConnectTimeMillis;
+ }
+
+ return mDisconnectTimeMillis - mConnectTimeMillis;
}
/**
@@ -578,10 +607,6 @@
return mConnectTimeMillis;
}
- void setConnectTimeMillis(long connectTimeMillis) {
- mConnectTimeMillis = connectTimeMillis;
- }
-
int getCallCapabilities() {
return mCallCapabilities;
}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 5c8f24f..82421c4 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -408,7 +408,6 @@
// to the existing connection instead of trying to create a new one.
true /* isIncoming */,
false /* isConference */);
- call.setConnectTimeMillis(System.currentTimeMillis());
call.setIsUnknown(true);
call.setExtras(extras);
call.addListener(this);
@@ -801,9 +800,6 @@
}
void markCallAsActive(Call call) {
- if (call.getConnectTimeMillis() == 0) {
- call.setConnectTimeMillis(System.currentTimeMillis());
- }
setCallState(call, CallState.ACTIVE);
if (call.getStartWithSpeakerphoneOn()) {
@@ -995,9 +991,6 @@
true /* isConference */);
setCallState(call, Call.getStateFromConnectionState(parcelableConference.getState()));
- if (call.getState() == CallState.ACTIVE) {
- call.setConnectTimeMillis(System.currentTimeMillis());
- }
call.setCallCapabilities(parcelableConference.getCapabilities());
// TODO: Move this to be a part of addCall()
@@ -1341,7 +1334,6 @@
false /* isConference */);
setCallState(call, Call.getStateFromConnectionState(connection.getState()));
- call.setConnectTimeMillis(System.currentTimeMillis());
call.setCallCapabilities(connection.getCapabilities());
call.setCallerDisplayName(connection.getCallerDisplayName(),
connection.getCallerDisplayNamePresentation());