diff options
author | Danny Baumann <dannybaumann@web.de> | 2017-10-11 16:22:16 +0200 |
---|---|---|
committer | Danny Baumann <dannybaumann@web.de> | 2018-07-26 09:15:30 +0200 |
commit | a42f70473abcdb9e77810c517faa9f4aa168625b (patch) | |
tree | 12155976c3663ecc281761eb3b7e3c67b5354885 /java | |
parent | ff42a0715e814d93e1cf945baab319c64dca8085 (diff) | |
download | android_packages_apps_Dialer-a42f70473abcdb9e77810c517faa9f4aa168625b.tar.gz android_packages_apps_Dialer-a42f70473abcdb9e77810c517faa9f4aa168625b.tar.bz2 android_packages_apps_Dialer-a42f70473abcdb9e77810c517faa9f4aa168625b.zip |
Proper supplementary service notification handling (5/5).
Map some pieces of information provided by SSN into the UI.
Change-Id: I6650102a9c464b6c1eb8bfc5a30a12fe68a1cfef
Diffstat (limited to 'java')
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; } |