From db3098f633de5fd3a8ba9d288a342f600446b328 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 8 Jan 2021 10:47:04 -0400 Subject: [PATCH] Add immersive mode for calling. --- .../securesms/WebRtcCallActivity.java | 21 +++++++- .../components/webrtc/WebRtcCallView.java | 43 +++++++++++++--- .../securesms/util/WindowUtil.java | 1 + app/src/main/res/layout/webrtc_call_view.xml | 50 ++++++++++--------- app/src/main/res/values/themes.xml | 2 + 5 files changed, 85 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index ad288be4b6..f5bfb3f89e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -27,7 +27,9 @@ import android.media.AudioManager; import android.os.Build; import android.os.Bundle; import android.util.Rational; +import android.view.View; import android.view.Window; +import android.view.WindowInsetsController; import android.view.WindowManager; import androidx.annotation.NonNull; @@ -35,6 +37,8 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; import androidx.lifecycle.ViewModelProviders; +import androidx.transition.Transition; +import androidx.transition.TransitionListenerAdapter; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -58,8 +62,10 @@ import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.service.WebRtcCallService; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.EllapsedTimeFormatter; +import org.thoughtcrime.securesms.util.FullscreenHelper; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; +import org.thoughtcrime.securesms.util.WindowUtil; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.signalservice.api.messages.calls.HangupMessage; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; @@ -80,6 +86,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan private CallParticipantsListUpdatePopupWindow participantUpdateWindow; + private FullscreenHelper fullscreenHelper; private WebRtcCallView callScreen; private TooltipPopup videoTooltip; private WebRtcCallViewModel viewModel; @@ -100,8 +107,8 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.webrtc_call_activity); - //noinspection ConstantConditions - getSupportActionBar().hide(); + + fullscreenHelper = new FullscreenHelper(this); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); @@ -636,6 +643,16 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } } + @Override + public void showSystemUI() { + fullscreenHelper.showSystemUI(); + } + + @Override + public void hideSystemUI() { + fullscreenHelper.hideSystemUI(); + } + @Override public void onAudioOutputChanged(@NonNull WebRtcAudioOutput audioOutput) { switch (audioOutput) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java index 60f8dd1604..c978aac187 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.components.webrtc; import android.content.Context; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; +import android.graphics.Rect; import android.util.AttributeSet; import android.view.MenuItem; import android.view.View; @@ -28,7 +29,6 @@ import androidx.transition.TransitionSet; import androidx.viewpager2.widget.MarginPageTransformer; import androidx.viewpager2.widget.ViewPager2; -import com.annimon.stream.OptionalLong; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.google.android.material.button.MaterialButton; @@ -160,7 +160,6 @@ public class WebRtcCallView extends FrameLayout { View decline = findViewById(R.id.call_screen_decline_call); View answerLabel = findViewById(R.id.call_screen_answer_call_label); View declineLabel = findViewById(R.id.call_screen_decline_call_label); - Guideline statusBarGuideline = findViewById(R.id.call_screen_status_bar_guideline); View cancelStartCall = findViewById(R.id.call_screen_start_call_cancel); callParticipantsPager.setPageTransformer(new MarginPageTransformer(ViewUtil.dpToPx(4))); @@ -227,9 +226,6 @@ public class WebRtcCallView extends FrameLayout { largeLocalRenderNoVideoAvatar.setAlpha(0.6f); largeLocalRenderNoVideoAvatar.setColorFilter(new ColorMatrixColorFilter(greyScaleMatrix)); - int statusBarHeight = ViewUtil.getStatusBarHeight(this); - statusBarGuideline.setGuidelineBegin(statusBarHeight); - errorButton.setOnClickListener(v -> { if (controlsListener != null) { controlsListener.onCancelStartCall(); @@ -246,6 +242,26 @@ public class WebRtcCallView extends FrameLayout { } } + @Override + protected boolean fitSystemWindows(Rect insets) { + Guideline statusBarGuideline = findViewById(R.id.call_screen_status_bar_guideline); + Guideline navigationBarGuideline = findViewById(R.id.call_screen_navigation_bar_guideline); + + statusBarGuideline.setGuidelineBegin(insets.top); + navigationBarGuideline.setGuidelineEnd(insets.bottom); + + return true; + } + + @Override + public void onWindowSystemUiVisibilityChanged(int visible) { + if ((visible & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { + pictureInPictureGestureHelper.setVerticalBoundaries(toolbar.getBottom(), videoToggle.getTop()); + } else { + pictureInPictureGestureHelper.clearVerticalBoundaries(); + } + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); @@ -515,6 +531,10 @@ public class WebRtcCallView extends FrameLayout { } } else { cancelFadeOut(); + + if (controlsListener != null) { + controlsListener.showSystemUI(); + } } controls = webRtcControls; @@ -581,12 +601,10 @@ public class WebRtcCallView extends FrameLayout { private void fadeOutControls() { fadeControls(ConstraintSet.GONE); controlsListener.onControlsFadeOut(); - pictureInPictureGestureHelper.clearVerticalBoundaries(); } private void fadeInControls() { fadeControls(ConstraintSet.VISIBLE); - pictureInPictureGestureHelper.setVerticalBoundaries(toolbar.getBottom(), videoToggle.getTop()); scheduleFadeOut(); } @@ -630,6 +648,15 @@ public class WebRtcCallView extends FrameLayout { .setDuration(TRANSITION_DURATION_MILLIS); TransitionManager.endTransitions(parent); + + if (controlsListener != null) { + if (controlsVisible) { + controlsListener.showSystemUI(); + } else { + controlsListener.hideSystemUI(); + } + } + TransitionManager.beginDelayedTransition(parent, transition); ConstraintSet constraintSet = new ConstraintSet(); @@ -714,6 +741,8 @@ public class WebRtcCallView extends FrameLayout { void onStartCall(boolean isVideoCall); void onCancelStartCall(); void onControlsFadeOut(); + void showSystemUI(); + void hideSystemUI(); void onAudioOutputChanged(@NonNull WebRtcAudioOutput audioOutput); void onVideoChanged(boolean isVideoEnabled); void onMicChanged(boolean isMicEnabled); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java index 24b4eb663e..cec0e26cfe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.os.Build; import android.view.View; import android.view.Window; +import android.view.WindowInsetsController; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; diff --git a/app/src/main/res/layout/webrtc_call_view.xml b/app/src/main/res/layout/webrtc_call_view.xml index 8c6ae8a849..e0e79167ad 100644 --- a/app/src/main/res/layout/webrtc_call_view.xml +++ b/app/src/main/res/layout/webrtc_call_view.xml @@ -13,11 +13,11 @@ android:id="@+id/call_screen_participants_pager" android:layout_width="match_parent" android:layout_height="match_parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" + android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" - android:orientation="vertical" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> @@ -28,9 +28,15 @@ + android:layout_height="match_parent" + android:layout="@layout/group_call_call_full" /> + + - + + app:layout_constraintBottom_toBottomOf="@id/call_screen_footer_gradient_barrier" /> @@ -93,7 +97,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/call_screen_status_bar_guideline" + app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0"> @@ -336,18 +340,18 @@ android:textColor="@color/core_white" android:visibility="gone" app:backgroundTint="@color/transparent_white_40" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/call_screen_navigation_bar_guideline" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" tools:visibility="visible" /> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 5361a7cdbf..2237cb8e43 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -282,6 +282,8 @@ false @color/core_black false + false + true