summaryrefslogtreecommitdiff
path: root/java/com/android/incallui
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui')
-rw-r--r--java/com/android/incallui/CallButtonPresenter.java23
-rw-r--r--java/com/android/incallui/answer/impl/AnswerFragment.java9
-rw-r--r--java/com/android/incallui/call/CallList.java69
-rw-r--r--java/com/android/incallui/call/DialerCall.java59
-rw-r--r--java/com/android/incallui/speakeasy/SpeakEasyComponent.java2
-rw-r--r--java/com/android/incallui/speakeasy/StubSpeakEasyModule.java5
6 files changed, 59 insertions, 108 deletions
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index 3fd3ee64b..a8b060daa 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -62,13 +62,14 @@ public class CallButtonPresenter
Listener,
InCallButtonUiDelegate {
- private static final String KEY_AUTOMATICALLY_MUTED = "incall_key_automatically_muted";
+ private static final String KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL =
+ "incall_key_automatically_muted_by_add_call";
private static final String KEY_PREVIOUS_MUTE_STATE = "incall_key_previous_mute_state";
private final Context context;
private InCallButtonUi inCallButtonUi;
private DialerCall call;
- private boolean automaticallyMuted = false;
+ private boolean automaticallyMutedByAddCall = false;
private boolean previousMuteState = false;
private boolean isInCallButtonUiReady;
private PhoneAccountHandle otherAccount;
@@ -276,8 +277,14 @@ public class CallButtonPresenter
DialerImpression.Type.IN_CALL_ADD_CALL_BUTTON_PRESSED,
call.getUniqueCallId(),
call.getTimeAddedMs());
+ if (automaticallyMutedByAddCall) {
+ // Since clicking add call button brings user to MainActivity and coming back refreshes mute
+ // state, add call button should only be clicked once during InCallActivity shows. Otherwise,
+ // we set previousMuteState wrong.
+ return;
+ }
// Automatically mute the current call
- automaticallyMuted = true;
+ automaticallyMutedByAddCall = true;
previousMuteState = AudioModeProvider.getInstance().getAudioState().isMuted();
// Simulate a click on the mute button
muteClicked(true /* checked */, false /* clickedByUser */);
@@ -540,25 +547,27 @@ public class CallButtonPresenter
@Override
public void refreshMuteState() {
// Restore the previous mute state
- if (automaticallyMuted
+ if (automaticallyMutedByAddCall
&& AudioModeProvider.getInstance().getAudioState().isMuted() != previousMuteState) {
if (inCallButtonUi == null) {
return;
}
muteClicked(previousMuteState, false /* clickedByUser */);
}
- automaticallyMuted = false;
+ automaticallyMutedByAddCall = false;
}
@Override
public void onSaveInstanceState(Bundle outState) {
- outState.putBoolean(KEY_AUTOMATICALLY_MUTED, automaticallyMuted);
+ outState.putBoolean(KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL, automaticallyMutedByAddCall);
outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
- automaticallyMuted = savedInstanceState.getBoolean(KEY_AUTOMATICALLY_MUTED, automaticallyMuted);
+ automaticallyMutedByAddCall =
+ savedInstanceState.getBoolean(
+ KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL, automaticallyMutedByAddCall);
previousMuteState = savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState);
}
diff --git a/java/com/android/incallui/answer/impl/AnswerFragment.java b/java/com/android/incallui/answer/impl/AnswerFragment.java
index fb1de05bd..d44a5daa2 100644
--- a/java/com/android/incallui/answer/impl/AnswerFragment.java
+++ b/java/com/android/incallui/answer/impl/AnswerFragment.java
@@ -82,9 +82,11 @@ import com.android.incallui.incalluilock.InCallUiLock;
import com.android.incallui.maps.MapsComponent;
import com.android.incallui.sessiondata.AvatarPresenter;
import com.android.incallui.sessiondata.MultimediaFragment;
+import com.android.incallui.speakeasy.SpeakEasyComponent;
import com.android.incallui.util.AccessibilityUtil;
import com.android.incallui.video.protocol.VideoCallScreen;
import com.android.incallui.videotech.utils.VideoUtils;
+import com.google.common.base.Optional;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -206,7 +208,7 @@ public class AnswerFragment extends Fragment
}
};
- @DrawableRes public final int icon;
+ @DrawableRes public int icon;
@StringRes public final int contentDescription;
@StringRes public final int accessibilityLabel;
@StringRes public final int hintText;
@@ -456,6 +458,11 @@ public class AnswerFragment extends Fragment
answerAndReleaseButton.setVisibility(View.VISIBLE);
answerScreenDelegate.onAnswerAndReleaseButtonEnabled();
} else if (allowSpeakEasy()) {
+ Optional<Integer> alternativeIcon = SpeakEasyComponent.get(getContext()).speakEasyIcon();
+ if (alternativeIcon.isPresent()) {
+ // TODO(erfanian): Replace enum hack when we have a dedicated button.
+ SecondaryBehavior.SPEAKEASY.icon = alternativeIcon.get();
+ }
answerAndReleaseBehavior = SecondaryBehavior.SPEAKEASY;
answerAndReleaseBehavior.applyToView(answerAndReleaseButton);
answerAndReleaseButton.setVisibility(View.VISIBLE);
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 13be252dd..6940f7d6c 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -23,13 +23,11 @@ import android.os.Trace;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
import android.telecom.Call;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccount;
import android.util.ArrayMap;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.blocking.FilteredNumbersUtil;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
@@ -41,7 +39,6 @@ import com.android.dialer.metrics.Metrics;
import com.android.dialer.metrics.MetricsComponent;
import com.android.dialer.promotion.RttPromotion;
import com.android.dialer.shortcuts.ShortcutUsageReporter;
-import com.android.dialer.spam.Spam;
import com.android.dialer.spam.SpamComponent;
import com.android.dialer.spam.status.SpamStatus;
import com.android.dialer.telecom.TelecomCallUtil;
@@ -164,20 +161,7 @@ public class CallList implements DialerCallDelegate {
call.getState() == DialerCallState.INCOMING
|| call.getState() == DialerCallState.CALL_WAITING;
boolean isSpam = result.isSpam();
- if (isSpam) {
- if (!isIncomingCall) {
- LogUtil.i(
- "CallList.onCallAdded",
- "marking spam call as not spam because it's not an incoming call");
- isSpam = false;
- } else if (isPotentialEmergencyCallback(context, call)) {
- LogUtil.i(
- "CallList.onCallAdded",
- "marking spam call as not spam because an emergency call was made on this"
- + " device recently");
- isSpam = false;
- }
- }
+ call.setSpamStatus(result);
if (isIncomingCall) {
Logger.get(context)
@@ -188,7 +172,6 @@ public class CallList implements DialerCallDelegate {
call.getUniqueCallId(),
call.getTimeAddedMs());
}
- call.setSpam(isSpam);
onUpdateCall(call);
notifyGenericListeners();
}
@@ -201,7 +184,6 @@ public class CallList implements DialerCallDelegate {
DialerExecutorComponent.get(context).uiExecutor());
Trace.beginSection("updateUserMarkedSpamStatus");
- updateUserMarkedSpamStatus(call, context, number);
Trace.endSection();
}
Trace.endSection();
@@ -279,60 +261,11 @@ public class CallList implements DialerCallDelegate {
impression, incomingCall.getUniqueCallId(), incomingCall.getTimeAddedMs());
}
- private static boolean isPotentialEmergencyCallback(Context context, DialerCall call) {
- if (BuildCompat.isAtLeastO()) {
- return call.isPotentialEmergencyCallback();
- } else {
- long timestampMillis = FilteredNumbersUtil.getLastEmergencyCallTimeMillis(context);
- return call.isInEmergencyCallbackWindow(timestampMillis);
- }
- }
-
@Override
public DialerCall getDialerCallFromTelecomCall(Call telecomCall) {
return callByTelecomCall.get(telecomCall);
}
- private void updateUserMarkedSpamStatus(
- final DialerCall call, final Context context, String number) {
-
- SpamComponent.get(context)
- .spam()
- .checkUserMarkedNonSpamStatus(
- number,
- call.getCountryIso(),
- new Spam.Listener() {
- @Override
- public void onComplete(boolean isInUserWhiteList) {
- call.setIsInUserWhiteList(isInUserWhiteList);
- }
- });
-
- SpamComponent.get(context)
- .spam()
- .checkGlobalSpamListStatus(
- number,
- call.getCountryIso(),
- new Spam.Listener() {
- @Override
- public void onComplete(boolean isInGlobalSpamList) {
- call.setIsInGlobalSpamList(isInGlobalSpamList);
- }
- });
-
- SpamComponent.get(context)
- .spam()
- .checkUserMarkedSpamStatus(
- number,
- call.getCountryIso(),
- new Spam.Listener() {
- @Override
- public void onComplete(boolean isInUserSpamList) {
- call.setIsInUserSpamList(isInUserSpamList);
- }
- });
- }
-
public void onCallRemoved(Context context, android.telecom.Call telecomCall) {
if (callByTelecomCall.containsKey(telecomCall)) {
DialerCall call = callByTelecomCall.get(telecomCall);
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 431634a0c..da7c54d27 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -52,6 +52,7 @@ import android.widget.Toast;
import com.android.contacts.common.compat.CallCompat;
import com.android.dialer.assisteddialing.ConcreteCreator;
import com.android.dialer.assisteddialing.TransformationInfo;
+import com.android.dialer.blocking.FilteredNumbersUtil;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentParser;
import com.android.dialer.callintent.CallSpecificAppData;
@@ -76,6 +77,7 @@ import com.android.dialer.logging.Logger;
import com.android.dialer.preferredsim.PreferredAccountRecorder;
import com.android.dialer.rtt.RttTranscript;
import com.android.dialer.rtt.RttTranscriptUtil;
+import com.android.dialer.spam.status.SpamStatus;
import com.android.dialer.telecom.TelecomCallUtil;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.theme.R;
@@ -91,6 +93,7 @@ import com.android.incallui.videotech.duo.DuoVideoTech;
import com.android.incallui.videotech.empty.EmptyVideoTech;
import com.android.incallui.videotech.ims.ImsVideoTech;
import com.android.incallui.videotech.utils.VideoUtils;
+import com.google.common.base.Optional;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
import java.io.IOException;
@@ -165,14 +168,10 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
private String callSubject;
@Nullable private PhoneAccountHandle phoneAccountHandle;
@CallHistoryStatus private int callHistoryStatus = CALL_HISTORY_STATUS_UNKNOWN;
- private boolean isSpam;
- private boolean isBlocked;
-
- @Nullable private Boolean isInUserSpamList;
- @Nullable private Boolean isInUserWhiteList;
+ @Nullable private SpamStatus spamStatus;
+ private boolean isBlocked;
- @Nullable private Boolean isInGlobalSpamList;
private boolean didShowCameraPermission;
private boolean didDismissVideoChargesAlertDialog;
private PersistableBundle carrierConfig;
@@ -820,6 +819,13 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
if (hasProperty(Details.PROPERTY_EMERGENCY_CALLBACK_MODE)) {
return true;
}
+
+ // Call.EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS is available starting in O
+ if (VERSION.SDK_INT < VERSION_CODES.O) {
+ long timestampMillis = FilteredNumbersUtil.getLastEmergencyCallTimeMillis(context);
+ return isInEmergencyCallbackWindow(timestampMillis);
+ }
+
// We want to treat any incoming call that arrives a short time after an outgoing emergency call
// as a potential emergency callback.
if (getExtras() != null
@@ -1270,39 +1276,28 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
didDismissVideoChargesAlertDialog = didDismiss;
}
- @Nullable
- public Boolean isInGlobalSpamList() {
- return isInGlobalSpamList;
- }
-
- public void setIsInGlobalSpamList(boolean inSpamList) {
- isInGlobalSpamList = inSpamList;
- }
-
- @Nullable
- public Boolean isInUserSpamList() {
- return isInUserSpamList;
+ public void setSpamStatus(@Nullable SpamStatus spamStatus) {
+ this.spamStatus = spamStatus;
}
- public void setIsInUserSpamList(boolean inSpamList) {
- isInUserSpamList = inSpamList;
+ public Optional<SpamStatus> getSpamStatus() {
+ return Optional.fromNullable(spamStatus);
}
- @Nullable
- public Boolean isInUserWhiteList() {
- return isInUserWhiteList;
- }
+ public boolean isSpam() {
+ if (spamStatus == null || !spamStatus.isSpam()) {
+ return false;
+ }
- public void setIsInUserWhiteList(boolean inWhiteList) {
- isInUserWhiteList = inWhiteList;
- }
+ if (!isIncoming()) {
+ return false;
+ }
- public boolean isSpam() {
- return isSpam;
- }
+ if (isPotentialEmergencyCallback()) {
+ return false;
+ }
- public void setSpam(boolean isSpam) {
- this.isSpam = isSpam;
+ return true;
}
public boolean isBlocked() {
diff --git a/java/com/android/incallui/speakeasy/SpeakEasyComponent.java b/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
index 320bc69ee..6dae44128 100644
--- a/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
+++ b/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
@@ -30,6 +30,8 @@ public abstract class SpeakEasyComponent {
public abstract Optional<Fragment> speakEasySettingsFragment();
+ public abstract Optional<Integer> speakEasyIcon();
+
public static SpeakEasyComponent get(Context context) {
return ((SpeakEasyComponent.HasComponent)
((HasRootComponent) context.getApplicationContext()).component())
diff --git a/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java b/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
index d5f644372..67b564cb0 100644
--- a/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
+++ b/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
@@ -36,4 +36,9 @@ public abstract class StubSpeakEasyModule {
static Optional<Fragment> provideSpeakEasySettingsFragment() {
return Optional.absent();
}
+
+ @Provides
+ static Optional<Integer> provideSpeakEasyIcon() {
+ return Optional.absent();
+ }
}