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