summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java/com/android/contacts/common/compat/TelephonyManagerCompat.java4
-rw-r--r--java/com/android/incallui/CallCardPresenter.java3
-rw-r--r--java/com/android/incallui/call/DialerCall.java37
-rw-r--r--java/com/android/incallui/contactgrid/TopRow.java10
-rw-r--r--java/com/android/incallui/contactgrid/res/values/cm_strings.xml29
-rw-r--r--java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java2
-rw-r--r--java/com/android/incallui/disconnectdialog/DisconnectDialog.java2
-rw-r--r--java/com/android/incallui/disconnectdialog/DisconnectMessage.java6
-rw-r--r--java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java2
-rw-r--r--java/com/android/incallui/disconnectdialog/RemoteIncomingCallsBarredDialog.java47
-rw-r--r--java/com/android/incallui/disconnectdialog/UnansweredForwardedDialog.java47
-rw-r--r--java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java2
-rw-r--r--java/com/android/incallui/incall/protocol/PrimaryCallState.java4
13 files changed, 186 insertions, 9 deletions
diff --git a/java/com/android/contacts/common/compat/TelephonyManagerCompat.java b/java/com/android/contacts/common/compat/TelephonyManagerCompat.java
index 02113ca55..5a9ae9a52 100644
--- a/java/com/android/contacts/common/compat/TelephonyManagerCompat.java
+++ b/java/com/android/contacts/common/compat/TelephonyManagerCompat.java
@@ -42,6 +42,10 @@ public class TelephonyManagerCompat {
"android.telecom.event.CALL_REMOTELY_UNHELD";
public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START";
public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE";
+ public static final String EVENT_DIALING_IS_WAITING =
+ "android.telecom.event.DIALING_IS_WAITING";
+ public static final String EVENT_ADDITIONAL_CALL_FORWARDED =
+ "android.telecom.event.ADDITIONAL_CALL_FORWARDED";
public static final String EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC =
"android.telephony.event.EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC";
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 67b917767..96f65881c 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -466,11 +466,12 @@ public class CallCardPresenter
isWorkCall,
isAttemptingHdAudioCall,
isHdAudioCall,
- !TextUtils.isEmpty(mPrimary.getLastForwardedNumber()),
+ mPrimary.isForwarded(),
shouldShowContactPhoto,
mPrimary.getConnectTimeMillis(),
CallerInfoUtils.isVoiceMailNumber(mContext, mPrimary),
mPrimary.isRemotelyHeld(),
+ mPrimary.isDialingWaitingForRemoteSide(),
isBusiness,
supports2ndCallOnHold()));
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 43140eac2..aadfd17f9 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -168,6 +168,16 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
private boolean isMergeInProcess;
/**
+ * Whether dialing is waiting for the busy remote party
+ */
+ private boolean dialingIsWaiting;
+
+ /**
+ * Whether an additional call was forwarded while this call was active
+ */
+ private boolean additionalCallForwarded;
+
+ /**
* Indicates whether the phone account associated with this call supports specifying a call
* subject.
*/
@@ -277,6 +287,14 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
LogUtil.i("DialerCall.onConnectionEvent", "merge complete");
isMergeInProcess = false;
break;
+ case TelephonyManagerCompat.EVENT_DIALING_IS_WAITING:
+ dialingIsWaiting = true;
+ update();
+ break;
+ case TelephonyManagerCompat.EVENT_ADDITIONAL_CALL_FORWARDED:
+ additionalCallForwarded = true;
+ update();
+ break;
default:
break;
}
@@ -796,6 +814,25 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
return hasProperty(Call.Details.PROPERTY_CONFERENCE);
}
+ public boolean isForwarded() {
+ return hasProperty(Call.Details.PROPERTY_WAS_FORWARDED)
+ || !TextUtils.isEmpty(getLastForwardedNumber());
+ }
+
+ public boolean isDialingWaitingForRemoteSide() {
+ return mState == State.DIALING && dialingIsWaiting;
+ }
+
+ public boolean wasUnansweredForwarded() {
+ return getDisconnectCause().getCode() == DisconnectCause.MISSED
+ && additionalCallForwarded;
+ }
+
+ public boolean missedBecauseIncomingCallsBarredRemotely() {
+ return getDisconnectCause().getCode() == DisconnectCause.RESTRICTED
+ && hasProperty(Call.Details.PROPERTY_REMOTE_INCOMING_CALLS_BARRED);
+ }
+
@Nullable
public GatewayInfo getGatewayInfo() {
return mTelecomCall == null ? null : mTelecomCall.getDetails().getGatewayInfo();
diff --git a/java/com/android/incallui/contactgrid/TopRow.java b/java/com/android/incallui/contactgrid/TopRow.java
index ab003570f..b26d43c08 100644
--- a/java/com/android/incallui/contactgrid/TopRow.java
+++ b/java/com/android/incallui/contactgrid/TopRow.java
@@ -156,7 +156,10 @@ public class TopRow {
private static CharSequence getLabelForDialing(Context context, PrimaryCallState state) {
if (!TextUtils.isEmpty(state.connectionLabel) && !state.isWifi) {
- return context.getString(R.string.incall_calling_via_template, state.connectionLabel);
+ int resId = state.isDialingWaitingForRemoteSide
+ ? R.string.incall_calling_via_waiting_template
+ : R.string.incall_calling_via_template;
+ return context.getString(resId, state.connectionLabel);
} else {
if (state.isVideoCall) {
if (state.isWifi) {
@@ -165,7 +168,10 @@ public class TopRow {
return context.getString(R.string.incall_video_call_requesting);
}
}
- return context.getString(R.string.incall_connecting);
+ int resId = state.isDialingWaitingForRemoteSide
+ ? R.string.incall_connecting_waiting
+ : R.string.incall_connecting;
+ return context.getString(resId);
}
}
diff --git a/java/com/android/incallui/contactgrid/res/values/cm_strings.xml b/java/com/android/incallui/contactgrid/res/values/cm_strings.xml
new file mode 100644
index 000000000..96ac734e0
--- /dev/null
+++ b/java/com/android/incallui/contactgrid/res/values/cm_strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2013-2014 The CyanogenMod Project
+ Copyright (c) 2013, The Linux Foundation. All rights reserved.
+
+ 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- In-call screen: call failure reason (call denied because call barring is ON on MT side ) -->
+ <string name="callFailed_incoming_cb_enabled">Party has barred all incoming calls.</string>
+ <!-- In-call screen: status label for an incoming call that is not answered and forwarded -->
+ <string name="callUnanswered_forwarded">Call unanswered and forwarded</string>
+
+ <!-- In-call screen: status label for a call in the "dialing" state that's waiting for the busy remote side -->
+ <string name="incall_connecting_waiting">Calling (waiting\u2026)</string>
+ <!-- In-call screen: status label for an outgoing call that's routed via a specific
+ provider (e.g. MSIM) and is waiting for the busy remote side -->
+ <string name="incall_calling_via_waiting_template">Calling via <xliff:g id="provider_name">%s</xliff:g> (waiting\u2026)</string>
+</resources>
diff --git a/java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java b/java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java
index 2ce238718..2c8ad2573 100644
--- a/java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java
+++ b/java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java
@@ -29,7 +29,7 @@ import com.android.incallui.call.DialerCall;
public class DefaultErrorDialog implements DisconnectDialog {
@Override
- public boolean shouldShow(DisconnectCause disconnectCause) {
+ public boolean shouldShow(DialerCall call, DisconnectCause disconnectCause) {
return !TextUtils.isEmpty(disconnectCause.getDescription())
&& (disconnectCause.getCode() == DisconnectCause.ERROR
|| disconnectCause.getCode() == DisconnectCause.RESTRICTED);
diff --git a/java/com/android/incallui/disconnectdialog/DisconnectDialog.java b/java/com/android/incallui/disconnectdialog/DisconnectDialog.java
index 0b2b8cc8f..d2b4ea38e 100644
--- a/java/com/android/incallui/disconnectdialog/DisconnectDialog.java
+++ b/java/com/android/incallui/disconnectdialog/DisconnectDialog.java
@@ -26,7 +26,7 @@ import com.android.incallui.call.DialerCall;
/** Interface for disconnect dialog. */
public interface DisconnectDialog {
- boolean shouldShow(DisconnectCause disconnectCause);
+ boolean shouldShow(DialerCall call, DisconnectCause disconnectCause);
Pair<Dialog, CharSequence> createDialog(@NonNull Context context, DialerCall call);
}
diff --git a/java/com/android/incallui/disconnectdialog/DisconnectMessage.java b/java/com/android/incallui/disconnectdialog/DisconnectMessage.java
index 97d58f27c..3dab42cdc 100644
--- a/java/com/android/incallui/disconnectdialog/DisconnectMessage.java
+++ b/java/com/android/incallui/disconnectdialog/DisconnectMessage.java
@@ -31,7 +31,9 @@ public class DisconnectMessage {
// Disconnect dialog catalog. Default error dialog MUST be last one.
private static final DisconnectDialog[] DISCONNECT_DIALOGS =
new DisconnectDialog[] {
- new EnableWifiCallingPrompt(), new VideoCallNotAvailablePrompt(), new DefaultErrorDialog()
+ new EnableWifiCallingPrompt(), new VideoCallNotAvailablePrompt(),
+ new UnansweredForwardedDialog(), new RemoteIncomingCallsBarredDialog(),
+ new DefaultErrorDialog()
};
public final Dialog dialog;
@@ -42,7 +44,7 @@ public class DisconnectMessage {
cause = call.getDisconnectCause();
for (DisconnectDialog disconnectDialog : DISCONNECT_DIALOGS) {
- if (disconnectDialog.shouldShow(cause)) {
+ if (disconnectDialog.shouldShow(call, cause)) {
Pair<Dialog, CharSequence> pair = disconnectDialog.createDialog(context, call);
dialog = pair.first;
toastMessage = pair.second;
diff --git a/java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java b/java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java
index a0ca8cd04..b470af6a5 100644
--- a/java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java
+++ b/java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java
@@ -39,7 +39,7 @@ public class EnableWifiCallingPrompt implements DisconnectDialog {
private static final String ANDROID_SETTINGS_PACKAGE = "com.android.settings";
@Override
- public boolean shouldShow(DisconnectCause disconnectCause) {
+ public boolean shouldShow(DialerCall call, DisconnectCause disconnectCause) {
String reason = disconnectCause.getReason();
if (reason != null && reason.startsWith(REASON_WIFI_ON_BUT_WFC_OFF)) {
LogUtil.i(
diff --git a/java/com/android/incallui/disconnectdialog/RemoteIncomingCallsBarredDialog.java b/java/com/android/incallui/disconnectdialog/RemoteIncomingCallsBarredDialog.java
new file mode 100644
index 000000000..01aacadf3
--- /dev/null
+++ b/java/com/android/incallui/disconnectdialog/RemoteIncomingCallsBarredDialog.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 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.disconnectdialog;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.telecom.DisconnectCause;
+import android.util.Pair;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.incallui.call.DialerCall;
+
+public class RemoteIncomingCallsBarredDialog implements DisconnectDialog {
+ @Override
+ public boolean shouldShow(DialerCall call, DisconnectCause disconnectCause) {
+ return call.missedBecauseIncomingCallsBarredRemotely();
+ }
+
+ @Override
+ public Pair<Dialog, CharSequence> createDialog(final @NonNull Context context, DialerCall call) {
+ CharSequence message = context.getString(R.string.callFailed_incoming_cb_enabled);
+ Dialog dialog =
+ new AlertDialog.Builder(context)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .create();
+ return new Pair<>(dialog, message);
+ }
+}
diff --git a/java/com/android/incallui/disconnectdialog/UnansweredForwardedDialog.java b/java/com/android/incallui/disconnectdialog/UnansweredForwardedDialog.java
new file mode 100644
index 000000000..50140ee15
--- /dev/null
+++ b/java/com/android/incallui/disconnectdialog/UnansweredForwardedDialog.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 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.disconnectdialog;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.telecom.DisconnectCause;
+import android.util.Pair;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.incallui.call.DialerCall;
+
+public class UnansweredForwardedDialog implements DisconnectDialog {
+ @Override
+ public boolean shouldShow(DialerCall call, DisconnectCause disconnectCause) {
+ return call.wasUnansweredForwarded();
+ }
+
+ @Override
+ public Pair<Dialog, CharSequence> createDialog(final @NonNull Context context, DialerCall call) {
+ CharSequence message = context.getString(R.string.callUnanswered_forwarded);
+ Dialog dialog =
+ new AlertDialog.Builder(context)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .create();
+ return new Pair<>(dialog, message);
+ }
+}
diff --git a/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java b/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
index 526d45ed7..1e7112d86 100644
--- a/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
+++ b/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
@@ -35,7 +35,7 @@ import com.android.incallui.call.DialerCall;
public class VideoCallNotAvailablePrompt implements DisconnectDialog {
@Override
- public boolean shouldShow(DisconnectCause disconnectCause) {
+ public boolean shouldShow(DialerCall call, DisconnectCause disconnectCause) {
if (disconnectCause.getCode() == DisconnectCause.ERROR
&& TelecomManagerCompat.REASON_IMS_ACCESS_BLOCKED.equals(disconnectCause.getReason())) {
LogUtil.i(
diff --git a/java/com/android/incallui/incall/protocol/PrimaryCallState.java b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
index 26dd3887a..f9b4964bf 100644
--- a/java/com/android/incallui/incall/protocol/PrimaryCallState.java
+++ b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
@@ -43,6 +43,7 @@ public class PrimaryCallState {
public final long connectTimeMillis;
public final boolean isVoiceMailNumber;
public final boolean isRemotelyHeld;
+ public final boolean isDialingWaitingForRemoteSide;
public final boolean isBusinessNumber;
public final boolean supportsCallOnHold;
@@ -68,6 +69,7 @@ public class PrimaryCallState {
0,
false /* isVoiceMailNumber */,
false /* isRemotelyHeld */,
+ false /* isDialingWaitingForRemoteSide */,
false /* isBusinessNumber */,
true /* supportsCallOnHold */);
}
@@ -92,6 +94,7 @@ public class PrimaryCallState {
long connectTimeMillis,
boolean isVoiceMailNumber,
boolean isRemotelyHeld,
+ boolean isDialingWaitingForRemoteSide,
boolean isBusinessNumber,
boolean supportsCallOnHold) {
this.state = state;
@@ -113,6 +116,7 @@ public class PrimaryCallState {
this.connectTimeMillis = connectTimeMillis;
this.isVoiceMailNumber = isVoiceMailNumber;
this.isRemotelyHeld = isRemotelyHeld;
+ this.isDialingWaitingForRemoteSide = isDialingWaitingForRemoteSide;
this.isBusinessNumber = isBusinessNumber;
this.supportsCallOnHold = supportsCallOnHold;
}