mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-09 15:58:34 +00:00
Fullscreen media preview on tap.
This commit is contained in:
parent
110a40592b
commit
15b650382e
12
res/drawable/image_preview_shade.xml
Normal file
12
res/drawable/image_preview_shade.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<gradient
|
||||||
|
android:angle="90"
|
||||||
|
android:startColor="@color/media_preview_bar_background"
|
||||||
|
android:centerColor="@color/media_preview_bar_shade_center"
|
||||||
|
android:endColor="@android:color/transparent"/>
|
||||||
|
|
||||||
|
</shape>
|
@ -19,11 +19,12 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:orientation="vertical"
|
android:animateLayoutChanges="true"
|
||||||
android:background="@drawable/image_shade"
|
android:background="@drawable/image_preview_shade"
|
||||||
android:gravity="bottom"
|
android:gravity="bottom"
|
||||||
|
android:orientation="vertical"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:animateLayoutChanges="true">
|
tools:visibility="visible">
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.components.MaxHeightScrollView
|
<org.thoughtcrime.securesms.components.MaxHeightScrollView
|
||||||
android:id="@+id/media_preview_caption_container"
|
android:id="@+id/media_preview_caption_container"
|
||||||
@ -64,4 +65,19 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/toolbar_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/media_preview_bar_background"
|
||||||
|
app:elevation="0dp">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="@android:color/transparent" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
@ -10,4 +10,8 @@
|
|||||||
<item name="android:colorControlActivated">@color/signal_primary_dark</item>
|
<item name="android:colorControlActivated">@color/signal_primary_dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="TextSecure.MediaPreview" parent="@style/TextSecure.BaseMediaPreview">
|
||||||
|
<item name="android:navigationBarColor">@color/media_preview_bar_background</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -70,4 +70,7 @@
|
|||||||
|
|
||||||
<color name="avatar_background">@color/transparent_black_90</color>
|
<color name="avatar_background">@color/transparent_black_90</color>
|
||||||
|
|
||||||
|
<color name="media_preview_bar_background">#90010101</color>
|
||||||
|
<color name="media_preview_bar_shade_center">#88000000</color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -26,6 +26,15 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextSecure.DarkNoActionBar" parent="@style/TextSecure.BaseDarkNoActionBar">
|
<style name="TextSecure.DarkNoActionBar" parent="@style/TextSecure.BaseDarkNoActionBar">
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="TextSecure.BaseMediaPreview" parent="@style/TextSecure.BaseDarkNoActionBar">
|
||||||
|
<item name="colorPrimaryDark">@color/media_preview_bar_background</item>
|
||||||
|
<item name="android:textColorSecondary">@color/white</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="TextSecure.MediaPreview" parent="@style/TextSecure.BaseMediaPreview">
|
||||||
<!-- leave empty to allow overriding -->
|
<!-- leave empty to allow overriding -->
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@ -37,6 +38,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.util.Pair;
|
import androidx.core.util.Pair;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||||
@ -109,20 +111,22 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv
|
|||||||
|
|
||||||
private int restartItem = -1;
|
private int restartItem = -1;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle bundle, boolean ready) {
|
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);
|
viewModel = ViewModelProviders.of(this).get(MediaPreviewViewModel.class);
|
||||||
|
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
|
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
||||||
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
|
|
||||||
|
showSystemUI();
|
||||||
|
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
setContentView(R.layout.media_preview_activity);
|
|
||||||
|
|
||||||
initializeViews();
|
initializeViews();
|
||||||
initializeResources();
|
initializeResources();
|
||||||
@ -208,6 +212,14 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv
|
|||||||
caption = findViewById(R.id.media_preview_caption);
|
caption = findViewById(R.id.media_preview_caption);
|
||||||
captionContainer = findViewById(R.id.media_preview_caption_container);
|
captionContainer = findViewById(R.id.media_preview_caption_container);
|
||||||
playbackControlsContainer = findViewById(R.id.media_preview_playback_controls_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() {
|
private void initializeResources() {
|
||||||
@ -439,11 +451,36 @@ public final class MediaPreviewActivity extends PassphraseRequiredActionBarActiv
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean singleTapOnMedia() {
|
public boolean singleTapOnMedia() {
|
||||||
detailsContainer.setVisibility(detailsContainer.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
|
toggleUiVisibility();
|
||||||
|
|
||||||
return true;
|
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 {
|
private class ViewPagerListener extends ExtendedOnPageChangedListener {
|
||||||
|
|
||||||
@Override
|
@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 {
|
private static class CursorPagerAdapter extends FragmentStatePagerAdapter implements MediaItemAdapter {
|
||||||
|
|
||||||
@SuppressLint("UseSparseArrays")
|
@SuppressLint("UseSparseArrays")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user