From 15b650382e9ad452c4b94349d8d2a212f1bd66a7 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 30 Aug 2019 17:31:59 -0400 Subject: [PATCH] Fullscreen media preview on tap. --- res/drawable/image_preview_shade.xml | 12 +++ res/layout/media_preview_activity.xml | 22 ++++- res/values-v21/themes.xml | 4 + res/values/colors.xml | 3 + res/values/themes.xml | 9 ++ .../securesms/MediaPreviewActivity.java | 91 +++++++++++++++++-- 6 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 res/drawable/image_preview_shade.xml diff --git a/res/drawable/image_preview_shade.xml b/res/drawable/image_preview_shade.xml new file mode 100644 index 0000000000..70c52a4aac --- /dev/null +++ b/res/drawable/image_preview_shade.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/media_preview_activity.xml b/res/layout/media_preview_activity.xml index d1cd20d4f9..b685cbb976 100644 --- a/res/layout/media_preview_activity.xml +++ b/res/layout/media_preview_activity.xml @@ -19,11 +19,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - android:orientation="vertical" - android:background="@drawable/image_shade" + android:animateLayoutChanges="true" + android:background="@drawable/image_preview_shade" android:gravity="bottom" + android:orientation="vertical" android:visibility="gone" - android:animateLayoutChanges="true"> + tools:visibility="visible"> + + + + + + diff --git a/res/values-v21/themes.xml b/res/values-v21/themes.xml index 164a717ee4..709482676f 100644 --- a/res/values-v21/themes.xml +++ b/res/values-v21/themes.xml @@ -10,4 +10,8 @@ @color/signal_primary_dark + + diff --git a/res/values/colors.xml b/res/values/colors.xml index fe2dd51e58..9a98951cb4 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -70,4 +70,7 @@ @color/transparent_black_90 + #90010101 + #88000000 + diff --git a/res/values/themes.xml b/res/values/themes.xml index 05901c240a..755246c7a2 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -26,6 +26,15 @@ + + + + diff --git a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java index a247bfe493..2c317e8eda 100644 --- a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -29,6 +29,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; @@ -37,6 +38,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.core.util.Pair; +import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; @@ -109,20 +111,22 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv private int restartItem = -1; - @SuppressWarnings("ConstantConditions") @Override protected void onCreate(Bundle bundle, boolean ready) { - this.setTheme(R.style.TextSecure_DarkTheme); + this.setTheme(R.style.TextSecure_MediaPreview); + setContentView(R.layout.media_preview_activity); + + setSupportActionBar(findViewById(R.id.toolbar)); viewModel = ViewModelProviders.of(this).get(MediaPreviewViewModel.class); - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + showSystemUI(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - setContentView(R.layout.media_preview_activity); initializeViews(); initializeResources(); @@ -208,6 +212,14 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv caption = findViewById(R.id.media_preview_caption); captionContainer = findViewById(R.id.media_preview_caption_container); playbackControlsContainer = findViewById(R.id.media_preview_playback_controls_container); + + View toolbarLayout = findViewById(R.id.toolbar_layout); + + anchorMarginsToBottomInsets(detailsContainer); + + anchorMarginsToTopInsets(toolbarLayout); + + showAndHideWithSystemUI(getWindow(), detailsContainer, toolbarLayout); } private void initializeResources() { @@ -439,11 +451,36 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv @Override public boolean singleTapOnMedia() { - detailsContainer.setVisibility(detailsContainer.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE); - + toggleUiVisibility(); return true; } + private void toggleUiVisibility() { + int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility(); + if ((systemUiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0) { + showSystemUI(); + } else { + hideSystemUI(); + } + } + + private void hideSystemUI() { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE | + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_FULLSCREEN ); + } + + private void showSystemUI() { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ); + } + private class ViewPagerListener extends ExtendedOnPageChangedListener { @Override @@ -534,6 +571,48 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv } } + private static void anchorMarginsToBottomInsets(@NonNull View viewToAnchor) { + ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor, (view, insets) -> { + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + + layoutParams.setMargins(insets.getSystemWindowInsetLeft(), + layoutParams.topMargin, + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom()); + + view.setLayoutParams(layoutParams); + + return insets; + }); + } + + private static void anchorMarginsToTopInsets(@NonNull View viewToAnchor) { + ViewCompat.setOnApplyWindowInsetsListener(viewToAnchor, (view, insets) -> { + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + + layoutParams.setMargins(insets.getSystemWindowInsetLeft(), + insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), + layoutParams.bottomMargin); + + view.setLayoutParams(layoutParams); + + return insets; + }); + } + + private static void showAndHideWithSystemUI(@NonNull Window window, @NonNull View... views) { + window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> { + boolean hide = (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + + for (View view : views) { + view.animate() + .alpha(hide ? 0 : 1) + .start(); + } + }); + } + private static class CursorPagerAdapter extends FragmentStatePagerAdapter implements MediaItemAdapter { @SuppressLint("UseSparseArrays")