From 14d008d89d7b4fefe43428d0d220ca3d6a786cf7 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 10 Apr 2020 11:16:54 +0200 Subject: [PATCH] turn screen off during call --- .../conversations/ui/RtpSessionActivity.java | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index 47ec38024..f86856493 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -2,11 +2,15 @@ package eu.siacs.conversations.ui; import android.Manifest; import android.annotation.SuppressLint; +import android.content.Context; import android.content.Intent; import android.databinding.DataBindingUtil; +import android.os.Build; import android.os.Bundle; +import android.os.PowerManager; import android.support.annotation.NonNull; import android.support.annotation.StringRes; +import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.View; import android.view.WindowManager; @@ -15,6 +19,7 @@ import android.widget.Toast; import com.google.common.collect.ImmutableList; import java.lang.ref.WeakReference; +import java.util.Arrays; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; @@ -35,6 +40,8 @@ import static java.util.Arrays.asList; public class RtpSessionActivity extends XmppActivity implements XmppConnectionService.OnJingleRtpConnectionUpdate { + private static final String PROXIMITY_WAKE_LOCK_TAG = "conversations:in-rtp-session"; + private static final int REQUEST_ACCEPT_CALL = 0x1111; public static final String EXTRA_WITH = "with"; @@ -48,6 +55,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe private WeakReference rtpConnectionReference; private ActivityRtpSessionBinding binding; + private PowerManager.WakeLock mProximityWakeLock; @Override public void onCreate(Bundle savedInstanceState) { @@ -55,8 +63,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) - ; + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); Log.d(Config.LOGTAG, "RtpSessionActivity.onCreate()"); this.binding = DataBindingUtil.setContentView(this, R.layout.activity_rtp_session); } @@ -77,7 +84,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe final Account account = extractAccount(intent); final Jid with = Jid.of(intent.getStringExtra(EXTRA_WITH)); xmppConnectionService.getJingleConnectionManager().retractSessionProposal(account, with.asBareJid()); - finish(); + finishAndReleaseWakeLock(); } else { requireRtpConnection().endCall(); } @@ -85,7 +92,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe private void rejectCall(View view) { requireRtpConnection().rejectCall(); - finish(); + finishAndReleaseWakeLock(); } private void acceptCall(View view) { @@ -94,10 +101,41 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe private void requestPermissionsAndAcceptCall() { if (PermissionUtils.hasPermission(this, ImmutableList.of(Manifest.permission.RECORD_AUDIO), REQUEST_ACCEPT_CALL)) { + putScreenInCallMode(); requireRtpConnection().acceptCall(); } } + @SuppressLint("WakelockTimeout") + private void putScreenInCallMode() { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (powerManager == null) { + Log.e(Config.LOGTAG, "power manager not available"); + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + this.mProximityWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, PROXIMITY_WAKE_LOCK_TAG); + if (!this.mProximityWakeLock.isHeld()) { + Log.d(Config.LOGTAG, "acquiring wake lock"); + this.mProximityWakeLock.acquire(); + } + } + } + + private void finishAndReleaseWakeLock() { + releaseWakeLock(); + finish(); + } + + private void releaseWakeLock() { + if (this.mProximityWakeLock != null && mProximityWakeLock.isHeld()) { + Log.d(Config.LOGTAG, "releasing wake lock"); + this.mProximityWakeLock.release(); + this.mProximityWakeLock = null; + } + } + @Override protected void refreshUiReal() { @@ -134,7 +172,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe requestPermissionsAndAcceptCall(); } } else if (asList(ACTION_MAKE_VIDEO_CALL, ACTION_MAKE_VOICE_CALL).contains(intent.getAction())) { - xmppConnectionService.getJingleConnectionManager().proposeJingleRtpSession(account, with); + proposeJingleRtpSession(account, with); binding.with.setText(account.getRoster().getContact(with).getDisplayName()); } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE); @@ -148,6 +186,11 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } } + private void proposeJingleRtpSession(final Account account, final Jid with) { + xmppConnectionService.getJingleConnectionManager().proposeJingleRtpSession(account, with); + putScreenInCallMode(); + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -180,13 +223,13 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe final WeakReference reference = xmppConnectionService.getJingleConnectionManager() .findJingleRtpConnection(account, with, sessionId); if (reference == null || reference.get() == null) { - finish(); + finishAndReleaseWakeLock(); return; } this.rtpConnectionReference = reference; final RtpEndUserState currentState = requireRtpConnection().getEndUserState(); if (currentState == RtpEndUserState.ENDED) { - finish(); + finishAndReleaseWakeLock(); return; } binding.with.setText(getWith().getDisplayName()); @@ -238,7 +281,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe binding.status.setText(R.string.rtp_state_application_failure); break; case ENDED: - throw new IllegalStateException("Activity should have called finish()"); + throw new IllegalStateException("Activity should have called finishAndReleaseWakeLock();"); default: throw new IllegalStateException(String.format("State %s has not been handled in UI", state)); } @@ -287,11 +330,11 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe final Account account = extractAccount(intent); final Jid with = Jid.of(intent.getStringExtra(EXTRA_WITH)); this.rtpConnectionReference = null; - xmppConnectionService.getJingleConnectionManager().proposeJingleRtpSession(account, with); + proposeJingleRtpSession(account, with); } private void exit(View view) { - finish(); + finishAndReleaseWakeLock(); } private Contact getWith() { @@ -310,6 +353,9 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe @Override public void onJingleRtpConnectionUpdate(Account account, Jid with, final String sessionId, RtpEndUserState state) { + if (Arrays.asList(RtpEndUserState.APPLICATION_ERROR, RtpEndUserState.DECLINED_OR_BUSY, RtpEndUserState.DECLINED_OR_BUSY).contains(state)) { + releaseWakeLock(); + } Log.d(Config.LOGTAG, "onJingleRtpConnectionUpdate(" + state + ")"); if (with.isBareJid()) { updateRtpSessionProposalState(account, with, state); @@ -323,7 +369,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe final AbstractJingleConnection.Id id = requireRtpConnection().getId(); if (account == id.account && id.with.equals(with) && id.sessionId.equals(sessionId)) { if (state == RtpEndUserState.ENDED) { - finish(); + finishAndReleaseWakeLock(); return; } else if (asList(RtpEndUserState.APPLICATION_ERROR, RtpEndUserState.DECLINED_OR_BUSY, RtpEndUserState.CONNECTIVITY_ERROR).contains(state)) { resetIntent(account, with, state);