Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da2c0ae3 authored by Sekine Yasuaki's avatar Sekine Yasuaki Committed by takeshi tanigawa
Browse files

Fix error case which session change request failed when pausing video

When a user clicks the pause video button, the camera close request and
the session modify request are executed at the same time. However, the
session modify request fails occasionally by a limitation of the Network
side. In that case, the video session is continued with the camera
closed state and a user cannot open the camera again due to pause video
button disabled.

Remove camera close request triggered by the pause video button clicked
because it is handled appropriately according to the result of the
session modify request. Also, enable the pause video button and show
error message to a user if receiving the error result of the session
modify request.

Test: manual
Bug: 69235524

Change-Id: I9a2dde755a6c28edfb0ce962b55ac8a6e907ca97
parent 381dffd9
Loading
Loading
Loading
Loading
+49 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import com.android.incallui.audiomode.AudioModeProvider.AudioModeListener;
import com.android.incallui.call.CallList;
import com.android.incallui.call.DialerCall;
import com.android.incallui.call.DialerCall.CameraDirection;
import com.android.incallui.call.DialerCallListener;
import com.android.incallui.call.TelecomAdapter;
import com.android.incallui.call.state.DialerCallState;
import com.android.incallui.incall.protocol.InCallButtonIds;
@@ -58,7 +59,8 @@ public class CallButtonPresenter
        InCallDetailsListener,
        CanAddCallListener,
        Listener,
        InCallButtonUiDelegate {
        InCallButtonUiDelegate,
        DialerCallListener {

  private static final String KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL =
      "incall_key_automatically_muted_by_add_call";
@@ -106,11 +108,18 @@ public class CallButtonPresenter
    InCallPresenter.getInstance().getInCallCameraManager().removeCameraSelectionListener(this);
    InCallPresenter.getInstance().removeCanAddCallListener(this);
    isInCallButtonUiReady = false;

    if (call != null) {
      call.removeListener(this);
    }
  }

  @Override
  public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
    Trace.beginSection("CallButtonPresenter.onStateChange");
    if (call != null) {
      call.removeListener(this);
    }
    if (newState == InCallState.OUTGOING) {
      call = callList.getOutgoingCall();
    } else if (newState == InCallState.INCALL) {
@@ -133,6 +142,10 @@ public class CallButtonPresenter
    } else {
      call = null;
    }

    if (call != null) {
      call.addListener(this);
    }
    updateUi(newState, call);
    Trace.endSection();
  }
@@ -393,7 +406,6 @@ public class CallButtonPresenter
            call.getTimeAddedMs());

    if (pause) {
      call.getVideoTech().setCamera(null);
      call.getVideoTech().stopTransmission();
    } else {
      updateCamera(
@@ -583,6 +595,41 @@ public class CallButtonPresenter
    inCallButtonUi.setCameraSwitched(!isUsingFrontFacingCamera);
  }

  @Override
  public void onDialerCallSessionModificationStateChange() {
    if (inCallButtonUi != null && call != null) {
      inCallButtonUi.enableButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, true);
      updateButtonsState(call);
    }
  }

  @Override
  public void onDialerCallDisconnect() {}

  @Override
  public void onDialerCallUpdate() {}

  @Override
  public void onDialerCallChildNumberChange() {}

  @Override
  public void onDialerCallLastForwardedNumberChange() {}

  @Override
  public void onDialerCallUpgradeToVideo() {}

  @Override
  public void onWiFiToLteHandover() {}

  @Override
  public void onHandoverToWifiFailure() {}

  @Override
  public void onInternationalCallOnWifi() {}

  @Override
  public void onEnrichedCallSessionUpdate() {}

  @Override
  public Context getContext() {
    return context;
+2 −0
Original line number Diff line number Diff line
@@ -92,6 +92,8 @@ public class TopRow {
    } else if (VideoUtils.hasSentVideoUpgradeRequest(state.sessionModificationState())
        || VideoUtils.hasReceivedVideoUpgradeRequest(state.sessionModificationState())) {
      label = getLabelForVideoRequest(context, state);
    } else if (state.sessionModificationState() == SessionModificationState.REQUEST_FAILED) {
      label = context.getString(R.string.incall_video_call_operation_failed);
    } else if (state.state() == DialerCallState.PULLING) {
      label = context.getString(R.string.incall_transferring);
    } else if (state.state() == DialerCallState.DIALING
+3 −0
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@
       requests and we timed out. -->
  <string name="incall_video_call_request_timed_out">Call timed out</string>

  <!-- Displayed above the contact name when the user's operation for video calling is failed due to an unknown reason. -->
  <string name="incall_video_call_operation_failed">Unable to operate</string>

  <!-- In-call screen: status label for a call that's in the process of hanging up
       [CHAR LIMIT=25] -->
  <string name="incall_hanging_up">Hanging up</string>
+24 −18
Original line number Diff line number Diff line
@@ -103,8 +103,6 @@ public class ImsVideoCallCallback extends VideoCall.Callback {

    if (videoTech.getSessionModificationState()
        == SessionModificationState.WAITING_FOR_UPGRADE_TO_VIDEO_RESPONSE) {
      handler.removeCallbacksAndMessages(null); // Clear everything

      final int newSessionModificationState = getSessionModificationStateFromTelecomStatus(status);
      if (status == VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
        // Telecom manages audio route for us
@@ -114,12 +112,32 @@ public class ImsVideoCallCallback extends VideoCall.Callback {
        videoTech.setSessionModificationState(newSessionModificationState);
      }

      // Wait for 4 seconds and then clean the session modification state. This allows the video UI
      // to stay up so that the user can read the error message.
      //
      // If the other person accepted the upgrade request then this will keep the video UI up until
      // the call's video state change. Without this we would switch to the voice call and then
      // switch back to video UI.
      clearFailedResponseState(newSessionModificationState);
    } else if (videoTech.getSessionModificationState()
        == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
      requestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
      videoTech.setSessionModificationState(SessionModificationState.NO_REQUEST);
    } else if (videoTech.getSessionModificationState()
        == SessionModificationState.WAITING_FOR_RESPONSE) {
      final int newSessionModificationState = getSessionModificationStateFromTelecomStatus(status);
      videoTech.setSessionModificationState(newSessionModificationState);
      if (status != VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
        clearFailedResponseState(newSessionModificationState);
      }
    } else {
      LogUtil.i(
          "ImsVideoCallCallback.onSessionModifyResponseReceived",
          "call is not waiting for response, doing nothing");
    }
  }

  private void clearFailedResponseState(final int newSessionModificationState) {
    handler.removeCallbacksAndMessages(null); // Clear everything
    // Wait for 4 seconds and then clean the session modification state. This allows the video UI
    // to stay up so that the user can read the error message.
    handler.postDelayed(
        () -> {
          if (videoTech.getSessionModificationState() == newSessionModificationState) {
@@ -132,18 +150,6 @@ public class ImsVideoCallCallback extends VideoCall.Callback {
          }
        },
        CLEAR_FAILED_REQUEST_TIMEOUT_MILLIS);
    } else if (videoTech.getSessionModificationState()
        == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
      requestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
      videoTech.setSessionModificationState(SessionModificationState.NO_REQUEST);
    } else if (videoTech.getSessionModificationState()
        == SessionModificationState.WAITING_FOR_RESPONSE) {
      videoTech.setSessionModificationState(getSessionModificationStateFromTelecomStatus(status));
    } else {
      LogUtil.i(
          "ImsVideoCallCallback.onSessionModifyResponseReceived",
          "call is not waiting for response, doing nothing");
    }
  }

  @SessionModificationState
+1 −0
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ public class ImsVideoTech implements VideoTech {
    call.getVideoCall()
        .sendSessionModifyRequest(
            new VideoProfile(unpausedVideoState & ~VideoProfile.STATE_TX_ENABLED));
    setSessionModificationState(SessionModificationState.WAITING_FOR_RESPONSE);
  }

  @Override