summaryrefslogtreecommitdiffstats
path: root/java/com/android/incallui/call/DialerCall.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui/call/DialerCall.java')
-rw-r--r--java/com/android/incallui/call/DialerCall.java105
1 files changed, 104 insertions, 1 deletions
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index acedf41f1..12edb07e6 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -51,6 +51,10 @@ import com.android.dialer.common.ConfigProviderBindings;
import com.android.dialer.common.LogUtil;
import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
+import com.android.dialer.enrichedcall.EnrichedCallManager;
+import com.android.dialer.enrichedcall.EnrichedCallManager.CapabilitiesListener;
+import com.android.dialer.enrichedcall.EnrichedCallManager.Filter;
+import com.android.dialer.enrichedcall.EnrichedCallManager.StateChangedListener;
import com.android.dialer.enrichedcall.Session;
import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.logging.ContactLookupResult;
@@ -77,7 +81,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
/** Describes a single call and its state. */
-public class DialerCall implements VideoTechListener {
+public class DialerCall implements VideoTechListener, StateChangedListener, CapabilitiesListener {
public static final int CALL_HISTORY_STATUS_UNKNOWN = 0;
public static final int CALL_HISTORY_STATUS_PRESENT = 1;
@@ -143,6 +147,12 @@ public class DialerCall implements VideoTechListener {
private EnrichedCallCapabilities mEnrichedCallCapabilities;
private Session mEnrichedCallSession;
+ private int answerAndReleaseButtonDisplayedTimes = 0;
+ private boolean releasedByAnsweringSecondCall = false;
+ // Times when a second call is received but AnswerAndRelease button is not shown
+ // since it's not supported.
+ private int secondCallWithoutAnswerAndReleasedButtonTimes = 0;
+
public static String getNumberFromHandle(Uri handle) {
return handle == null ? "" : handle.getSchemeSpecificPart();
}
@@ -292,6 +302,8 @@ public class DialerCall implements VideoTechListener {
mTimeAddedMs = System.currentTimeMillis();
parseCallSpecificAppData();
+
+ updateEnrichedCallSession();
}
private static int translateState(int state) {
@@ -413,6 +425,12 @@ public class DialerCall implements VideoTechListener {
for (DialerCallListener listener : mListeners) {
listener.onDialerCallDisconnect();
}
+ EnrichedCallComponent.get(mContext)
+ .getEnrichedCallManager()
+ .unregisterCapabilitiesListener(this);
+ EnrichedCallComponent.get(mContext)
+ .getEnrichedCallManager()
+ .unregisterCapabilitiesListener(this);
} else {
for (DialerCallListener listener : mListeners) {
listener.onDialerCallUpdate();
@@ -960,6 +978,30 @@ public class DialerCall implements VideoTechListener {
return mLatencyReport;
}
+ public int getAnswerAndReleaseButtonDisplayedTimes() {
+ return answerAndReleaseButtonDisplayedTimes;
+ }
+
+ public void increaseAnswerAndReleaseButtonDisplayedTimes() {
+ answerAndReleaseButtonDisplayedTimes++;
+ }
+
+ public boolean getReleasedByAnsweringSecondCall() {
+ return releasedByAnsweringSecondCall;
+ }
+
+ public void setReleasedByAnsweringSecondCall(boolean releasedByAnsweringSecondCall) {
+ this.releasedByAnsweringSecondCall = releasedByAnsweringSecondCall;
+ }
+
+ public int getSecondCallWithoutAnswerAndReleasedButtonTimes() {
+ return secondCallWithoutAnswerAndReleasedButtonTimes;
+ }
+
+ public void increaseSecondCallWithoutAnswerAndReleasedButtonTimes() {
+ secondCallWithoutAnswerAndReleasedButtonTimes++;
+ }
+
@Nullable
public EnrichedCallCapabilities getEnrichedCallCapabilities() {
return mEnrichedCallCapabilities;
@@ -1172,6 +1214,66 @@ public class DialerCall implements VideoTechListener {
TelecomAdapter.getInstance().setAudioRoute(CallAudioState.ROUTE_SPEAKER);
}
+ @Override
+ public void onCapabilitiesUpdated() {
+ if (getNumber() == null) {
+ return;
+ }
+ EnrichedCallCapabilities capabilities =
+ EnrichedCallComponent.get(mContext).getEnrichedCallManager().getCapabilities(getNumber());
+ if (capabilities != null) {
+ setEnrichedCallCapabilities(capabilities);
+ update();
+ }
+ }
+
+ @Override
+ public void onEnrichedCallStateChanged() {
+ updateEnrichedCallSession();
+ }
+
+ private void updateEnrichedCallSession() {
+ if (getNumber() == null) {
+ return;
+ }
+ if (getEnrichedCallSession() != null) {
+ // State changes to existing sessions are currently handled by the UI components (which have
+ // their own listeners). Someday instead we could remove those and just call update() here and
+ // have the usual onDialerCallUpdate update the UI.
+ dispatchOnEnrichedCallSessionUpdate();
+ return;
+ }
+
+ EnrichedCallManager manager = EnrichedCallComponent.get(mContext).getEnrichedCallManager();
+
+ Filter filter =
+ isIncoming()
+ ? manager.createIncomingCallComposerFilter()
+ : manager.createOutgoingCallComposerFilter();
+
+ Session session = manager.getSession(getUniqueCallId(), getNumber(), filter);
+ if (session == null) {
+ return;
+ }
+
+ session.setUniqueDialerCallId(getUniqueCallId());
+ setEnrichedCallSession(session);
+
+ LogUtil.i(
+ "DialerCall.updateEnrichedCallSession",
+ "setting session %d's dialer id to %s",
+ session.getSessionId(),
+ getUniqueCallId());
+
+ dispatchOnEnrichedCallSessionUpdate();
+ }
+
+ private void dispatchOnEnrichedCallSessionUpdate() {
+ for (DialerCallListener listener : mListeners) {
+ listener.onEnrichedCallSessionUpdate();
+ }
+ }
+
/**
* Specifies whether a number is in the call history or not. {@link #CALL_HISTORY_STATUS_UNKNOWN}
* means there is no result.
@@ -1372,6 +1474,7 @@ public class DialerCall implements VideoTechListener {
String phoneNumber = call.getNumber();
phoneNumber = phoneNumber != null ? phoneNumber : "";
+ phoneNumber = phoneNumber.replaceAll("[^+0-9]", "");
// Insert order here determines the priority of that video tech option
videoTechs = new ArrayList<>();