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")