turn screen off during call

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java | 68 ++
1 file changed, 57 insertions(+), 11 deletions(-)

Detailed changes

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<JingleRtpConnection> 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<JingleRtpConnection> 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);