summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--InCallUI/src/com/android/incallui/CallCardFragment.java20
-rw-r--r--InCallUI/src/com/android/incallui/CallCardPresenter.java47
-rw-r--r--InCallUI/src/com/android/incallui/CallTimer.java90
-rw-r--r--InCallUI/src/com/android/incallui/StatusBarNotifier.java7
4 files changed, 158 insertions, 6 deletions
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 552a42a61..3598aaf7b 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -39,11 +39,15 @@ import com.android.services.telephony.common.Call;
public class CallCardFragment extends BaseFragment<CallCardPresenter>
implements CallCardPresenter.CallCardUi {
+ // Primary caller info
private TextView mPhoneNumber;
private TextView mNumberLabel;
private TextView mName;
- private ImageView mPhoto;
private TextView mCallStateLabel;
+ private ImageView mPhoto;
+ private TextView mElapsedTime;
+
+ // Secondary caller info
private ViewStub mSecondaryCallInfo;
private TextView mSecondaryCallName;
private ImageView mSecondaryPhoto;
@@ -73,6 +77,7 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter>
mSecondaryCallInfo = (ViewStub) view.findViewById(R.id.secondary_call_info);
mPhoto = (ImageView) view.findViewById(R.id.photo);
mCallStateLabel = (TextView) view.findViewById(R.id.callStateLabel);
+ mElapsedTime = (TextView) view.findViewById(R.id.elapsedTime);
// This method call will begin the callbacks on CallCardUi. We need to ensure
// everything needed for the callbacks is set up before this is called.
@@ -189,6 +194,19 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter>
}
}
+ @Override
+ public void setPrimaryCallElapsedTime(boolean show, String callTimeElapsed) {
+ if (show) {
+ if (mElapsedTime.getVisibility() != View.VISIBLE) {
+ AnimationUtils.Fade.show(mElapsedTime);
+ }
+ mElapsedTime.setText(callTimeElapsed);
+ } else {
+ // hide() animation has no effect if it is already hidden.
+ AnimationUtils.Fade.hide(mElapsedTime, View.INVISIBLE);
+ }
+ }
+
private void setDrawableToImageView(ImageView view, Drawable photo) {
if (photo == null) {
photo = view.getResources().getDrawable(R.drawable.picture_unknown);
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 8a855c104..330957e80 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -18,6 +18,7 @@ package com.android.incallui;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.text.format.DateUtils;
import com.android.incallui.AudioModeProvider.AudioModeListener;
import com.android.incallui.ContactInfoCache.ContactCacheEntry;
@@ -35,14 +36,25 @@ import com.android.services.telephony.common.Call;
public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
implements InCallStateListener, AudioModeListener, ContactInfoCacheCallback {
+ private static final long CALL_TIME_UPDATE_INTERVAL = 1000; // in milliseconds
+
private AudioModeProvider mAudioModeProvider;
private ContactInfoCache mContactInfoCache;
private Call mPrimary;
private Call mSecondary;
private ContactCacheEntry mPrimaryContactInfo;
private ContactCacheEntry mSecondaryContactInfo;
+ private CallTimer mCallTimer;
public CallCardPresenter() {
+
+ // create the call timer
+ mCallTimer = new CallTimer(new Runnable() {
+ @Override
+ public void run() {
+ updateCallTime();
+ }
+ });
}
@Override
@@ -66,11 +78,6 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
mSecondaryContactInfo = null;
}
- public void setContactInfoCache(ContactInfoCache cache) {
- mContactInfoCache = cache;
- startContactInfoSearch();
- }
-
@Override
public void onStateChange(InCallState state, CallList callList) {
final CallCardUi ui = getUi();
@@ -106,6 +113,16 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
// It is in that callback that we set the values into the Ui.
startContactInfoSearch();
+ // Start/Stop the call time update timer
+ if (mPrimary != null && mPrimary.getState() == Call.State.ACTIVE) {
+ Logger.d(this, "Starting the calltime timer");
+ mCallTimer.start(CALL_TIME_UPDATE_INTERVAL);
+ } else {
+ Logger.d(this, "Canceling the calltime timer");
+ mCallTimer.cancel();
+ ui.setPrimaryCallElapsedTime(false, null);
+ }
+
// Set the call state
if (mPrimary != null) {
final boolean bluetoothOn = mAudioModeProvider != null &&
@@ -129,6 +146,25 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
public void onSupportedAudioMode(int mask) {
}
+ public void updateCallTime() {
+ final CallCardUi ui = getUi();
+
+ if (ui == null || mPrimary == null || mPrimary.getState() != Call.State.ACTIVE) {
+ ui.setPrimaryCallElapsedTime(false, null);
+ mCallTimer.cancel();
+ }
+
+ final long callStart = mPrimary.getConnectTime();
+ final long duration = System.currentTimeMillis() - callStart;
+ ui.setPrimaryCallElapsedTime(true, DateUtils.formatElapsedTime(duration / 1000));
+ }
+
+
+ public void setContactInfoCache(ContactInfoCache cache) {
+ mContactInfoCache = cache;
+ startContactInfoSearch();
+ }
+
/**
* Starts a query for more contact data for the save primary and secondary calls.
*/
@@ -245,5 +281,6 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
void setPrimary(String number, String name, String label, Drawable photo);
void setSecondary(boolean show, String number, String name, String label, Drawable photo);
void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn);
+ void setPrimaryCallElapsedTime(boolean show, String duration);
}
}
diff --git a/InCallUI/src/com/android/incallui/CallTimer.java b/InCallUI/src/com/android/incallui/CallTimer.java
new file mode 100644
index 000000000..dcaa7865f
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallTimer.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.os.Handler;
+import android.os.SystemClock;
+
+/**
+ * Helper class used to keep track of events requiring regular intervals.
+ */
+public class CallTimer extends Handler {
+ private Runnable mInternalCallback;
+ private Runnable mCallback;
+ private long mLastReportedTime;
+ private long mInterval;
+ private boolean mRunning;
+
+ public CallTimer(Runnable callback) {
+ Preconditions.checkNotNull(callback);
+
+ mInterval = 0;
+ mLastReportedTime = 0;
+ mRunning = false;
+ mCallback = callback;
+ mInternalCallback = new CallTimerCallback();
+ }
+
+ public boolean start(long interval) {
+ if (interval <= 0) {
+ return false;
+ }
+
+ // cancel any previous timer
+ cancel();
+
+ mInterval = interval;
+ mLastReportedTime = SystemClock.uptimeMillis();
+
+ mRunning = true;
+ periodicUpdateTimer();
+
+ return true;
+ }
+
+ public void cancel() {
+ removeCallbacks(mInternalCallback);
+ mRunning = false;
+ }
+
+ private void periodicUpdateTimer() {
+ if (!mRunning) {
+ return;
+ }
+
+ final long now = SystemClock.uptimeMillis();
+ final long nextReport = mLastReportedTime + mInterval;
+ while (now >= nextReport) {
+ nextReport += mInterval;
+ }
+
+ postAtTime(mInternalCallback, nextReport);
+ mLastReportedTime = nextReport;
+
+ // Run the callback
+ mCallback.run();
+ }
+
+ private class CallTimerCallback implements Runnable {
+ @Override
+ public void run() {
+ periodicUpdateTimer();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index e2dc42ca8..0c39dc8ad 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -222,6 +222,13 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener,
builder.setContentTitle(contentTitle);
builder.setLargeIcon(largeIcon);
+ if (call.getState() == Call.State.ACTIVE) {
+ builder.setUsesChronometer(true);
+ builder.setWhen(call.getConnectTime());
+ } else {
+ builder.setUsesChronometer(false);
+ }
+
// Add special Content for calls that are ongoing
if (InCallState.INCALL == state || InCallState.OUTGOING == state) {
addHangupAction(builder);