diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DisplayMetricsUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/DisplayMetricsUtil.java new file mode 100644 index 000000000..5113c4d59 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DisplayMetricsUtil.java @@ -0,0 +1,21 @@ +package org.thoughtcrime.securesms.util; + +import android.util.DisplayMetrics; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; + +public final class DisplayMetricsUtil { + private DisplayMetricsUtil() { + } + + public static void forceAspectRatioToScreenByAdjustingHeight(@NonNull DisplayMetrics displayMetrics, @NonNull View view) { + int screenHeight = displayMetrics.heightPixels; + int screenWidth = displayMetrics.widthPixels; + + ViewGroup.LayoutParams params = view.getLayoutParams(); + params.height = params.width * screenHeight / screenWidth; + view.setLayoutParams(params); + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java index dab1c8a2b..b1a8c708a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.wallpaper; import android.app.AlertDialog; import android.os.Bundle; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,6 +18,7 @@ import androidx.lifecycle.ViewModelProviders; import androidx.navigation.Navigation; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.ThemeUtil; public class ChatWallpaperFragment extends Fragment { @@ -43,6 +45,8 @@ public class ChatWallpaperFragment extends Fragment { resetAllWallpaper = view.findViewById(R.id.chat_wallpaper_reset_all_wallpapers); divider = view.findViewById(R.id.chat_wallpaper_divider); + forceAspectRatioToScreenByAdjustingHeight(chatWallpaperPreview); + viewModel.getCurrentWallpaper().observe(getViewLifecycleOwner(), wallpaper -> { if (wallpaper.isPresent()) { wallpaper.get().loadInto(chatWallpaperPreview); @@ -124,4 +128,10 @@ public class ChatWallpaperFragment extends Fragment { .setCancelable(true) .show(); } + + private void forceAspectRatioToScreenByAdjustingHeight(@NonNull View view) { + DisplayMetrics displayMetrics = new DisplayMetrics(); + requireActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + DisplayMetricsUtil.forceAspectRatioToScreenByAdjustingHeight(displayMetrics, view); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperPreviewAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperPreviewAdapter.java index 45a9a253c..e98b04ae2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperPreviewAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperPreviewAdapter.java @@ -5,6 +5,6 @@ import org.thoughtcrime.securesms.util.MappingAdapter; class ChatWallpaperPreviewAdapter extends MappingAdapter { ChatWallpaperPreviewAdapter() { - registerFactory(ChatWallpaperSelectionMappingModel.class, ChatWallpaperViewHolder.createFactory(R.layout.chat_wallpaper_preview_fragment_adapter_item, null)); + registerFactory(ChatWallpaperSelectionMappingModel.class, ChatWallpaperViewHolder.createFactory(R.layout.chat_wallpaper_preview_fragment_adapter_item, null, null)); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionAdapter.java index 9643a97bc..099c6fd77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionAdapter.java @@ -1,12 +1,15 @@ package org.thoughtcrime.securesms.wallpaper; +import android.util.DisplayMetrics; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.util.MappingAdapter; class ChatWallpaperSelectionAdapter extends MappingAdapter { - ChatWallpaperSelectionAdapter(@Nullable ChatWallpaperViewHolder.EventListener eventListener) { - registerFactory(ChatWallpaperSelectionMappingModel.class, ChatWallpaperViewHolder.createFactory(R.layout.chat_wallpaper_selection_fragment_adapter_item, eventListener)); + ChatWallpaperSelectionAdapter(@Nullable ChatWallpaperViewHolder.EventListener eventListener, @NonNull DisplayMetrics windowDisplayMetrics) { + registerFactory(ChatWallpaperSelectionMappingModel.class, ChatWallpaperViewHolder.createFactory(R.layout.chat_wallpaper_selection_fragment_adapter_item, eventListener, windowDisplayMetrics)); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java index a2091e60f..1dcd2a040 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java @@ -4,6 +4,7 @@ import android.Manifest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,7 +17,6 @@ import androidx.lifecycle.ViewModelProviders; import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.flexbox.AlignContent; import com.google.android.flexbox.FlexboxLayoutManager; import com.google.android.flexbox.JustifyContent; @@ -46,11 +46,14 @@ public class ChatWallpaperSelectionFragment extends Fragment { askForPermissionIfNeededAndLaunchPhotoSelection(); }); + DisplayMetrics displayMetrics = new DisplayMetrics(); + requireActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + @SuppressWarnings("CodeBlock2Expr") ChatWallpaperSelectionAdapter adapter = new ChatWallpaperSelectionAdapter(chatWallpaper -> { startActivityForResult(ChatWallpaperPreviewActivity.create(requireActivity(), chatWallpaper, viewModel.getRecipientId(), viewModel.getDimInDarkTheme().getValue()), CHOOSE_WALLPAPER); ActivityTransitionUtil.setSlideInTransition(requireActivity()); - }); + }, displayMetrics); flexboxLayoutManager.setJustifyContent(JustifyContent.CENTER); recyclerView.setLayoutManager(flexboxLayoutManager); diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java index 3e273a779..3c54e4492 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.wallpaper; +import android.util.DisplayMetrics; import android.view.View; import android.widget.ImageView; @@ -9,9 +10,9 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.MappingAdapter; import org.thoughtcrime.securesms.util.MappingViewHolder; -import org.thoughtcrime.securesms.util.ThemeUtil; class ChatWallpaperViewHolder extends MappingViewHolder { @@ -19,11 +20,15 @@ class ChatWallpaperViewHolder extends MappingViewHolder createFactory(@LayoutRes int layout, @Nullable EventListener listener) { - return new MappingAdapter.LayoutFactory<>(view -> new ChatWallpaperViewHolder(view, listener), layout); + public static @NonNull MappingAdapter.Factory createFactory(@LayoutRes int layout, @Nullable EventListener listener, @Nullable DisplayMetrics windowDisplayMetrics) { + return new MappingAdapter.LayoutFactory<>(view -> new ChatWallpaperViewHolder(view, listener, windowDisplayMetrics), layout); } public interface EventListener { diff --git a/app/src/main/res/layout/chat_wallpaper_fragment.xml b/app/src/main/res/layout/chat_wallpaper_fragment.xml index c5f3a735f..3fd143bb2 100644 --- a/app/src/main/res/layout/chat_wallpaper_fragment.xml +++ b/app/src/main/res/layout/chat_wallpaper_fragment.xml @@ -13,20 +13,21 @@ + app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintTop_toBottomOf="@id/chat_wallpaper_dark_theme_dims_wallpaper" + tools:visibility="visible" /> Contact name Reset Clear + Wallpaper preview Choose from photos