From a702084a20b3edc6536c5e3527b065c1d99640e4 Mon Sep 17 00:00:00 2001 From: Sekine Yasuaki Date: Thu, 31 May 2018 17:10:12 +0900 Subject: Fix the issue that automatic mute state remains ON after adding VT call An issue occurs because InCallFragment#onResume() that release the automatic mute state is not called when switching fragments by adding call. To resolve this issue, handle automatic mute state in InCallActivity. Bug: 110815828 Test: Checked that the mute state is turned OFF when add a video call during a voice call. Change-Id: Ided7c58e1148f6ee12bdfeaa813d596a4716c1d6 --- java/com/android/incallui/CallButtonPresenter.java | 44 ++-------------------- java/com/android/incallui/InCallPresenter.java | 40 +++++++++++++++++++- .../incallui/callpending/CallPendingActivity.java | 3 -- .../incallui/incall/impl/InCallFragment.java | 1 - .../incall/protocol/InCallButtonUiDelegate.java | 2 - .../android/incallui/rtt/impl/RttChatFragment.java | 1 - .../video/impl/SurfaceViewVideoCallFragment.java | 1 - .../incallui/video/impl/VideoCallFragment.java | 1 - 8 files changed, 42 insertions(+), 51 deletions(-) diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java index 7d12d5281..8bf234823 100644 --- a/java/com/android/incallui/CallButtonPresenter.java +++ b/java/com/android/incallui/CallButtonPresenter.java @@ -60,15 +60,9 @@ public class CallButtonPresenter Listener, InCallButtonUiDelegate { - 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 automaticallyMutedByAddCall = false; - private boolean previousMuteState = false; private boolean isInCallButtonUiReady; private PhoneAccountHandle otherAccount; @@ -275,18 +269,7 @@ 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 - automaticallyMutedByAddCall = true; - previousMuteState = AudioModeProvider.getInstance().getAudioState().isMuted(); - // Simulate a click on the mute button - muteClicked(true /* checked */, false /* clickedByUser */); - TelecomAdapter.getInstance().addCall(); + InCallPresenter.getInstance().addCallClicked(); } @Override @@ -542,31 +525,10 @@ public class CallButtonPresenter } @Override - public void refreshMuteState() { - // Restore the previous mute state - if (automaticallyMutedByAddCall - && AudioModeProvider.getInstance().getAudioState().isMuted() != previousMuteState) { - if (inCallButtonUi == null) { - return; - } - muteClicked(previousMuteState, false /* clickedByUser */); - } - automaticallyMutedByAddCall = false; - } - - @Override - public void onSaveInstanceState(Bundle outState) { - outState.putBoolean(KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL, automaticallyMutedByAddCall); - outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState); - } + public void onSaveInstanceState(Bundle outState) {} @Override - public void onRestoreInstanceState(Bundle savedInstanceState) { - automaticallyMutedByAddCall = - savedInstanceState.getBoolean( - KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL, automaticallyMutedByAddCall); - previousMuteState = savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, previousMuteState); - } + public void onRestoreInstanceState(Bundle savedInstanceState) {} @Override public void onCameraPermissionGranted() { diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java index 150499f73..17af75691 100644 --- a/java/com/android/incallui/InCallPresenter.java +++ b/java/com/android/incallui/InCallPresenter.java @@ -273,6 +273,9 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud private SpeakEasyCallManager speakEasyCallManager; + private boolean addCallClicked = false; + private boolean automaticallyMutedByAddCall = false; + /** Inaccessible constructor. Must use getRunningInstance() to get this singleton. */ @VisibleForTesting InCallPresenter() {} @@ -1226,7 +1229,9 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud proximitySensor.onInCallShowing(showing); } - if (!showing) { + if (showing) { + refreshMuteState(); + } else { updateIsChangingConfigurations(); } @@ -2033,5 +2038,38 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud return true; } + public void addCallClicked() { + if (addCallClicked) { + // 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. + return; + } + addCallClicked = true; + if (!AudioModeProvider.getInstance().getAudioState().isMuted()) { + // Automatically mute the current call + TelecomAdapter.getInstance().mute(true); + automaticallyMutedByAddCall = true; + } + TelecomAdapter.getInstance().addCall(); + } + + /** Refresh mute state after call UI resuming from add call screen. */ + public void refreshMuteState() { + LogUtil.i( + "InCallPresenter.refreshMuteState", + "refreshMuteStateAfterAddCall: %b addCallClicked: %b", + automaticallyMutedByAddCall, + addCallClicked); + if (!addCallClicked) { + return; + } + if (automaticallyMutedByAddCall) { + // Restore the previous mute state + TelecomAdapter.getInstance().mute(false); + automaticallyMutedByAddCall = false; + } + addCallClicked = false; + } + private final Set inCallUiLocks = new ArraySet<>(); } diff --git a/java/com/android/incallui/callpending/CallPendingActivity.java b/java/com/android/incallui/callpending/CallPendingActivity.java index a686308c2..4086e1419 100644 --- a/java/com/android/incallui/callpending/CallPendingActivity.java +++ b/java/com/android/incallui/callpending/CallPendingActivity.java @@ -231,9 +231,6 @@ public class CallPendingActivity extends FragmentActivity @Override public void onRestoreInstanceState(Bundle savedInstanceState) {} - @Override - public void refreshMuteState() {} - @Override public void addCallClicked() {} diff --git a/java/com/android/incallui/incall/impl/InCallFragment.java b/java/com/android/incallui/incall/impl/InCallFragment.java index 7f20b407f..30620699a 100644 --- a/java/com/android/incallui/incall/impl/InCallFragment.java +++ b/java/com/android/incallui/incall/impl/InCallFragment.java @@ -206,7 +206,6 @@ public class InCallFragment extends Fragment @Override public void onResume() { super.onResume(); - inCallButtonUiDelegate.refreshMuteState(); inCallScreenDelegate.onInCallScreenResumed(); } diff --git a/java/com/android/incallui/incall/protocol/InCallButtonUiDelegate.java b/java/com/android/incallui/incall/protocol/InCallButtonUiDelegate.java index b0e23efcd..4cf40ef6a 100644 --- a/java/com/android/incallui/incall/protocol/InCallButtonUiDelegate.java +++ b/java/com/android/incallui/incall/protocol/InCallButtonUiDelegate.java @@ -31,8 +31,6 @@ public interface InCallButtonUiDelegate { void onRestoreInstanceState(Bundle savedInstanceState); - void refreshMuteState(); - void addCallClicked(); void muteClicked(boolean checked, boolean clickedByUser); diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java index 988f20c2c..649e80840 100644 --- a/java/com/android/incallui/rtt/impl/RttChatFragment.java +++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java @@ -361,7 +361,6 @@ public class RttChatFragment extends Fragment @Override public void onRttScreenStart() { - inCallButtonUiDelegate.refreshMuteState(); rttCallScreenDelegate.onRttCallScreenUiReady(); Activity activity = getActivity(); Window window = getActivity().getWindow(); diff --git a/java/com/android/incallui/video/impl/SurfaceViewVideoCallFragment.java b/java/com/android/incallui/video/impl/SurfaceViewVideoCallFragment.java index f270edab9..89db07903 100644 --- a/java/com/android/incallui/video/impl/SurfaceViewVideoCallFragment.java +++ b/java/com/android/incallui/video/impl/SurfaceViewVideoCallFragment.java @@ -308,7 +308,6 @@ public class SurfaceViewVideoCallFragment extends Fragment @Override public void onVideoScreenStart() { - inCallButtonUiDelegate.refreshMuteState(); videoCallScreenDelegate.onVideoCallScreenUiReady(); getView().postDelayed(cameraPermissionDialogRunnable, CAMERA_PERMISSION_DIALOG_DELAY_IN_MILLIS); } diff --git a/java/com/android/incallui/video/impl/VideoCallFragment.java b/java/com/android/incallui/video/impl/VideoCallFragment.java index 11b80ceb9..e7dff892e 100644 --- a/java/com/android/incallui/video/impl/VideoCallFragment.java +++ b/java/com/android/incallui/video/impl/VideoCallFragment.java @@ -367,7 +367,6 @@ public class VideoCallFragment extends Fragment @Override public void onVideoScreenStart() { - inCallButtonUiDelegate.refreshMuteState(); videoCallScreenDelegate.onVideoCallScreenUiReady(); getView().postDelayed(cameraPermissionDialogRunnable, CAMERA_PERMISSION_DIALOG_DELAY_IN_MILLIS); getView() -- cgit v1.2.3