diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index f6b0c11312..b31f1e21d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -371,7 +371,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( clickPref( title = DSLSettingsText.from(R.string.preferences__chat_color_and_wallpaper), - icon = DSLSettingsIcon.from(R.drawable.ic_wallpaper_24), + icon = DSLSettingsIcon.from(R.drawable.ic_color_24), onClick = { startActivity(ChatWallpaperActivity.createIntent(requireContext(), state.recipient.id)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java index fcdc02f297..a8c025bd36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java @@ -56,17 +56,21 @@ import org.whispersystems.libsignal.util.guava.Optional; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.concurrent.TimeUnit; final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { + private static final long SELECTION_ANIMATION_DURATION = TimeUnit.MILLISECONDS.toMillis(150); + private final Context context; private final boolean showThread; private final GlideRequests glideRequests; private final ItemClickListener itemClickListener; - private final Map selected = new HashMap<>(); + private final Map selected = new HashMap<>(); private final AudioItemListener audioItemListener; private GroupedThreadMedia media; @@ -74,10 +78,12 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { private boolean detailView; private static final int AUDIO_DETAIL = 1; - private static final int GALLERY = 2; + public static final int GALLERY = 2; private static final int GALLERY_DETAIL = 3; private static final int DOCUMENT_DETAIL = 4; + private static final int PAYLOAD_SELECTED = 1; + void detach(RecyclerView.ViewHolder holder) { if (holder instanceof SelectableViewHolder) { ((SelectableViewHolder) holder).onDetached(); @@ -101,13 +107,13 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { boolean showFileSizes, boolean showThread) { - this.context = context; - this.glideRequests = glideRequests; - this.media = media; - this.itemClickListener = clickListener; - this.audioItemListener = audioItemListener; - this.showFileSizes = showFileSizes; - this.showThread = showThread; + this.context = context; + this.glideRequests = glideRequests; + this.media = media; + this.itemClickListener = clickListener; + this.audioItemListener = audioItemListener; + this.showFileSizes = showFileSizes; + this.showThread = showThread; } public void setMedia(GroupedThreadMedia media) { @@ -138,16 +144,26 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { MediaDatabase.MediaRecord mediaRecord = media.get(section, offset); Slide slide = MediaUtil.getSlideForAttachment(context, mediaRecord.getAttachment()); - if (slide.hasAudio()) return AUDIO_DETAIL; + if (slide.hasAudio()) return AUDIO_DETAIL; if (slide.hasImage() || slide.hasVideo()) return detailView ? GALLERY_DETAIL : GALLERY; - if (slide.hasDocument()) return DOCUMENT_DETAIL; + if (slide.hasDocument()) return DOCUMENT_DETAIL; return 0; } @Override public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int section) { - ((HeaderHolder)viewHolder).textView.setText(media.getName(section)); + ((HeaderHolder) viewHolder).textView.setText(media.getName(section)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List payloads) { + if (holder instanceof SelectableViewHolder && payloads.contains(PAYLOAD_SELECTED)) { + SelectableViewHolder selectableViewHolder = (SelectableViewHolder) holder; + selectableViewHolder.animateSelectedView(); + } else { + super.onBindViewHolder(holder, position, payloads); + } } @Override @@ -155,7 +171,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { MediaDatabase.MediaRecord mediaRecord = media.get(section, offset); Slide slide = MediaUtil.getSlideForAttachment(context, mediaRecord.getAttachment()); - ((SelectableViewHolder)viewHolder).bind(context, mediaRecord, slide); + ((SelectableViewHolder) viewHolder).bind(context, mediaRecord, slide); } @Override @@ -183,7 +199,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { selected.put(attachmentId, mediaRecord); } - notifyDataSetChanged(); + notifyItemRangeChanged(0, getItemCount(), PAYLOAD_SELECTED); } public int getSelectedMediaCount() { @@ -203,7 +219,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { public void clearSelection() { selected.clear(); - notifyDataSetChanged(); + notifyItemRangeChanged(0, getItemCount(), PAYLOAD_SELECTED); } void selectAllMedia() { @@ -215,7 +231,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { selected.put(mediaRecord.getAttachment().getAttachmentId(), mediaRecord); } } - this.notifyDataSetChanged(); + this.notifyItemRangeChanged(0, getItemCount(), PAYLOAD_SELECTED); } void setShowFileSizes(boolean showFileSizes) { @@ -228,9 +244,10 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { class SelectableViewHolder extends ItemViewHolder { - private final View selectedIndicator; - private MediaDatabase.MediaRecord mediaRecord; - private boolean bound; + protected final View selectedIndicator; + + private MediaDatabase.MediaRecord mediaRecord; + private boolean bound; SelectableViewHolder(@NonNull View itemView) { super(itemView); @@ -250,15 +267,27 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { bound = false; } - private void updateSelectedView() { + protected boolean isSelected() { + return selected.containsKey(mediaRecord.getAttachment().getAttachmentId()); + } + + protected void updateSelectedView() { if (selectedIndicator != null) { - selectedIndicator.setVisibility(selected.containsKey(mediaRecord.getAttachment().getAttachmentId()) ? View.VISIBLE : View.GONE); + selectedIndicator.animate().cancel(); + selectedIndicator.setAlpha(isSelected() ? 1f : 0f); + } + } + + protected void animateSelectedView() { + if (selectedIndicator != null) { + selectedIndicator.animate() + .alpha(isSelected() ? 1f : 0f) + .setDuration(SELECTION_ANIMATION_DURATION); } } boolean onLongClick() { itemClickListener.onMediaLongClicked(mediaRecord); - updateSelectedView(); return true; } @@ -271,6 +300,9 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { private class GalleryViewHolder extends SelectableViewHolder { + private static final float SCALE_SELECTED = 0.83f; + private static final float SCALE_NORMAL = 1f; + private final ThumbnailView thumbnailView; private final TextView imageFileSize; @@ -296,18 +328,40 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { thumbnailView.setOnLongClickListener(view -> onLongClick()); } + @Override + protected void updateSelectedView() { + super.updateSelectedView(); + + thumbnailView.animate().cancel(); + + float scale = isSelected() ? SCALE_SELECTED : SCALE_NORMAL; + thumbnailView.setScaleX(scale); + thumbnailView.setScaleY(scale); + } + @Override void unbind() { thumbnailView.clear(glideRequests); super.unbind(); } + + @Override + public void animateSelectedView() { + super.animateSelectedView(); + + float scale = isSelected() ? SCALE_SELECTED : SCALE_NORMAL; + thumbnailView.animate() + .scaleX(scale) + .scaleY(scale) + .setDuration(SELECTION_ANIMATION_DURATION); + } } private abstract class DetailViewHolder extends SelectableViewHolder implements Observer> { protected final View itemView; - private final TextView line1; - private final TextView line2; + private final TextView line1; + private final TextView line2; private LiveDataPair liveDataPair; private Optional fileName; private String fileTypeDescription; @@ -333,7 +387,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(mediaRecord)); itemView.setOnLongClickListener(view -> onLongClick()); selectForMarque = () -> line1.setSelected(true); - handler = new Handler(Looper.getMainLooper()); + handler = new Handler(Looper.getMainLooper()); handler.postDelayed(selectForMarque, 2500); LiveRecipient from = mediaRecord.isOutgoing() ? Recipient.self().live() : Recipient.live(mediaRecord.getRecipientId()); @@ -358,7 +412,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { DateUtils.formatDateWithoutDayOfWeek(Locale.getDefault(), mediaRecord.getDate())); } - protected String getFileTypeDescription(@NonNull Context context, @NonNull Slide slide){ + protected String getFileTypeDescription(@NonNull Context context, @NonNull Slide slide) { return context.getString(R.string.MediaOverviewActivity_file); } @@ -529,15 +583,21 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { interface ItemClickListener { void onMediaClicked(@NonNull MediaDatabase.MediaRecord mediaRecord); + void onMediaLongClicked(MediaDatabase.MediaRecord mediaRecord); } interface AudioItemListener { void onPlay(@NonNull Uri audioUri, double progress, long messageId); + void onPause(@NonNull Uri audioUri); + void onSeekTo(@NonNull Uri audioUri, double progress); + void onStopAndReset(@NonNull Uri audioUri); + void registerPlaybackStateObserver(@NonNull Observer observer); + void unregisterPlaybackStateObserver(@NonNull Observer observer); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGridDividerDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGridDividerDecoration.kt new file mode 100644 index 0000000000..949ac47b22 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGridDividerDecoration.kt @@ -0,0 +1,59 @@ +package org.thoughtcrime.securesms.mediaoverview + +import android.graphics.Rect +import android.view.View +import androidx.annotation.Px +import androidx.recyclerview.widget.RecyclerView +import org.thoughtcrime.securesms.util.ViewUtil + +internal class MediaGridDividerDecoration( + private val spanCount: Int, + @Px private val space: Int, + private val adapter: MediaGalleryAllAdapter +) : RecyclerView.ItemDecoration() { + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + val holder = parent.getChildViewHolder(view) + + val adapterPosition = holder.adapterPosition + val section = adapter.getAdapterPositionSection(adapterPosition) + val itemSectionOffset = adapter.getItemSectionOffset(section, adapterPosition) + + if (itemSectionOffset == -1) { + return + } + + val sectionItemViewType = adapter.getSectionItemViewType(section, itemSectionOffset) + if (sectionItemViewType != MediaGalleryAllAdapter.GALLERY) { + return + } + + val column = itemSectionOffset % spanCount + val isRtl = ViewUtil.isRtl(view) + + val distanceFromEnd = spanCount - 1 - column + + val spaceStart = (column / spanCount.toFloat()) * space + val spaceEnd = (distanceFromEnd / spanCount.toFloat()) * space + + outRect.setStart(spaceStart.toInt(), isRtl) + outRect.setEnd(spaceEnd.toInt(), isRtl) + outRect.bottom = space + } + + private fun Rect.setEnd(end: Int, isRtl: Boolean) { + if (isRtl) { + left = end + } else { + right = end + } + } + + private fun Rect.setStart(start: Int, isRtl: Boolean) { + if (isRtl) { + right = start + } else { + left = start + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java index 30a7dbdb3f..b257d70fd3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java @@ -18,6 +18,7 @@ package org.thoughtcrime.securesms.mediaoverview; import android.content.Context; import android.content.Intent; +import android.graphics.Typeface; import android.os.Bundle; import android.view.MenuItem; import android.view.View; @@ -28,6 +29,7 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; @@ -96,8 +98,8 @@ public final class MediaOverviewActivity extends PassphraseRequiredActivity { boolean allThreads = threadId == MediaDatabase.ALL_THREADS; + tabLayout.addOnTabSelectedListener(new OnTabSelectedListener()); fillTabLayoutIfFits(tabLayout); - tabLayout.setupWithViewPager(viewPager); viewPager.setAdapter(new MediaOverviewPagerAdapter(getSupportFragmentManager())); @@ -283,4 +285,40 @@ public final class MediaOverviewActivity extends PassphraseRequiredActivity { return pages.get(position).second(); } } + + private static final class OnTabSelectedListener implements TabLayout.OnTabSelectedListener { + + private final Typeface tabUnselected = Typeface.create("sans-serif", Typeface.NORMAL); + private final Typeface tabSelected = Typeface.create("sans-serif-medium", Typeface.NORMAL); + + @Override + public void onTabSelected(@NonNull TabLayout.Tab tab) { + View view = getCustomView(tab); + TextView title = view.findViewById(android.R.id.text1); + title.setTypeface(tabSelected); + title.setTextColor(ContextCompat.getColor(view.getContext(), R.color.signal_inverse_primary)); + } + + @Override + public void onTabUnselected(@NonNull TabLayout.Tab tab) { + View view = getCustomView(tab); + TextView title = view.findViewById(android.R.id.text1); + title.setTypeface(tabUnselected); + title.setTextColor(ContextCompat.getColor(view.getContext(), R.color.signal_text_secondary)); + } + + @Override + public void onTabReselected(@NonNull TabLayout.Tab tab) { + // Intentionally Blank. + } + + private @NonNull View getCustomView(@NonNull TabLayout.Tab tab) { + View customView = tab.getCustomView(); + if (customView == null) { + tab.setCustomView(R.layout.custom_tab_layout_text); + } + + return tab.getCustomView(); + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java index 3431a792fc..3af063a698 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java @@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; +import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.WindowUtil; public final class MediaOverviewPageFragment extends Fragment @@ -109,10 +110,11 @@ public final class MediaOverviewPageFragment extends Fragment public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Context context = requireContext(); View view = inflater.inflate(R.layout.media_overview_page_fragment, container, false); + int spans = getResources().getInteger(R.integer.media_overview_cols); this.recyclerView = view.findViewById(R.id.media_grid); this.noMedia = view.findViewById(R.id.no_images); - this.gridManager = new StickyHeaderGridLayoutManager(getResources().getInteger(R.integer.media_overview_cols)); + this.gridManager = new StickyHeaderGridLayoutManager(spans); this.adapter = new MediaGalleryAllAdapter(context, GlideApp.with(this), @@ -124,6 +126,7 @@ public final class MediaOverviewPageFragment extends Fragment this.recyclerView.setAdapter(adapter); this.recyclerView.setLayoutManager(gridManager); this.recyclerView.setHasFixedSize(true); + this.recyclerView.addItemDecoration(new MediaGridDividerDecoration(spans, ViewUtil.dpToPx(4), adapter)); MediaOverviewViewModel viewModel = MediaOverviewViewModel.getMediaOverviewViewModel(requireActivity()); @@ -264,7 +267,6 @@ public final class MediaOverviewPageFragment extends Fragment @Override public void onMediaLongClicked(MediaDatabase.MediaRecord mediaRecord) { ((MediaGalleryAllAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord); - recyclerView.getAdapter().notifyDataSetChanged(); if (actionMode == null) { enterMultiSelect(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperAlignmentDecoration.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperAlignmentDecoration.java deleted file mode 100644 index 4aeffa80a7..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperAlignmentDecoration.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.thoughtcrime.securesms.wallpaper; - -import android.graphics.Rect; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import org.thoughtcrime.securesms.util.ViewUtil; - -class ChatWallpaperAlignmentDecoration extends RecyclerView.ItemDecoration { - @Override - public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { - int itemPosition = parent.getChildAdapterPosition(view); - int itemCount = state.getItemCount(); - - if (itemCount > 0 && itemPosition == itemCount - 1) { - outRect.set(0, 0, 0, 0); - - ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); - int viewWidth = view.getMeasuredWidth() + params.rightMargin + params.leftMargin; - int availableWidth = (parent.getRight() - parent.getPaddingRight()) - (parent.getLeft() + parent.getPaddingLeft()); - int itemsPerRow = availableWidth / viewWidth; - - if (itemsPerRow == 1 || (itemPosition + 1) % itemsPerRow == 0) { - return; - } - - int extraCellsNeeded = itemsPerRow - ((itemPosition + 1) % itemsPerRow); - - setEnd(outRect, ViewUtil.isLtr(view), extraCellsNeeded * viewWidth); - } else { - super.getItemOffsets(outRect, view, parent, state); - } - } - - private void setEnd(@NonNull Rect outRect, boolean ltr, int end) { - if (ltr) { - outRect.right = end; - } else { - outRect.left = end; - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperDimLevelUtil.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperDimLevelUtil.java index 7c10536b46..df6f6185ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperDimLevelUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperDimLevelUtil.java @@ -1,8 +1,14 @@ package org.thoughtcrime.securesms.wallpaper; +import android.content.Context; +import android.graphics.Color; +import android.graphics.ColorFilter; import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.airbnb.lottie.SimpleColorFilter; import org.thoughtcrime.securesms.util.ThemeUtil; @@ -19,4 +25,13 @@ public final class ChatWallpaperDimLevelUtil { dimmer.setVisibility(View.GONE); } } + + public static @Nullable ColorFilter getDimColorFilterForNightMode(@NonNull Context context, @NonNull ChatWallpaper chatWallpaper) { + if (ThemeUtil.isDarkTheme(context)) { + int color = Color.argb(Math.round(0xFF * chatWallpaper.getDimLevelForDarkTheme()), 0, 0, 0); + return new SimpleColorFilter(color); + } else { + return null; + } + } } 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 9e5584ef02..16f0714d04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java @@ -51,7 +51,6 @@ public class ChatWallpaperSelectionFragment extends Fragment { }); recyclerView.setAdapter(adapter); - recyclerView.addItemDecoration(new ChatWallpaperAlignmentDecoration()); viewModel = ViewModelProviders.of(requireActivity()).get(ChatWallpaperViewModel.class); viewModel.getWallpapers().observe(getViewLifecycleOwner(), adapter::submitList); 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 cbd7c607a2..3bf530fa04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperViewHolder.java @@ -20,14 +20,12 @@ class ChatWallpaperViewHolder extends MappingViewHolder { diff --git a/app/src/main/res/drawable-night/ic_color_24.xml b/app/src/main/res/drawable-night/ic_color_24.xml new file mode 100644 index 0000000000..c57e45fea3 --- /dev/null +++ b/app/src/main/res/drawable-night/ic_color_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_color_24.xml b/app/src/main/res/drawable/ic_color_24.xml new file mode 100644 index 0000000000..b44dfea77a --- /dev/null +++ b/app/src/main/res/drawable/ic_color_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_photo_album_24.xml b/app/src/main/res/drawable/ic_photo_album_24.xml new file mode 100644 index 0000000000..5cb0c05822 --- /dev/null +++ b/app/src/main/res/drawable/ic_photo_album_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/chat_wallpaper_selection_fragment.xml b/app/src/main/res/layout/chat_wallpaper_selection_fragment.xml index 92c4a54493..39dff30b69 100644 --- a/app/src/main/res/layout/chat_wallpaper_selection_fragment.xml +++ b/app/src/main/res/layout/chat_wallpaper_selection_fragment.xml @@ -12,18 +12,21 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - @@ -31,9 +34,9 @@ @@ -41,15 +44,17 @@ @@ -59,14 +64,14 @@ android:layout_width="match_parent" android:layout_height="0dp" android:orientation="vertical" - android:paddingStart="14dp" - android:paddingEnd="14dp" + android:paddingStart="@dimen/wallpaper_selection_gutter" + android:paddingEnd="@dimen/wallpaper_selection_gutter" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/chat_wallpaper_presets" app:spanCount="3" - app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" tools:listitem="@layout/chat_wallpaper_selection_fragment_adapter_item" /> diff --git a/app/src/main/res/layout/chat_wallpaper_selection_fragment_adapter_item.xml b/app/src/main/res/layout/chat_wallpaper_selection_fragment_adapter_item.xml index 37908f0181..025852593f 100644 --- a/app/src/main/res/layout/chat_wallpaper_selection_fragment_adapter_item.xml +++ b/app/src/main/res/layout/chat_wallpaper_selection_fragment_adapter_item.xml @@ -5,25 +5,17 @@ android:id="@+id/chat_wallpaper_preview_frame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:layout_marginBottom="4dp" + android:paddingStart="8dp" + android:paddingEnd="8dp" + android:paddingBottom="16dp" app:resize_mode="fixed_width"> - - - \ No newline at end of file diff --git a/app/src/main/res/layout/custom_tab_layout_text.xml b/app/src/main/res/layout/custom_tab_layout_text.xml new file mode 100644 index 0000000000..e5a66b3b8f --- /dev/null +++ b/app/src/main/res/layout/custom_tab_layout_text.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/edit_profile_name_fragment.xml b/app/src/main/res/layout/edit_profile_name_fragment.xml index 412bcb470b..619bd7b8d3 100644 --- a/app/src/main/res/layout/edit_profile_name_fragment.xml +++ b/app/src/main/res/layout/edit_profile_name_fragment.xml @@ -1,67 +1,80 @@ - - + - + - + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/media_overview_activity.xml b/app/src/main/res/layout/media_overview_activity.xml index 08bf680c3b..efd2b4b541 100644 --- a/app/src/main/res/layout/media_overview_activity.xml +++ b/app/src/main/res/layout/media_overview_activity.xml @@ -17,95 +17,103 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" - android:background="@color/media_overview_toolbar_background" - android:titleTextColor="@color/media_overview_toolbar_foreground" - app:layout_scrollFlags="scroll|enterAlways" /> + android:background="@color/signal_background_primary" + app:layout_scrollFlags="scroll|enterAlways" + app:titleTextColor="@color/media_overview_toolbar_foreground" /> + app:tabSelectedTextColor="@color/signal_text_primary" + app:tabTextAppearance="@style/TextAppearance.Signal.Body2" + app:tabTextColor="@color/signal_text_secondary" /> - - - - - - - - + android:textAppearance="@style/TextAppearance.Signal.Body1.Bold" + android:textColor="@color/signal_inverse_primary" + app:layout_constraintStart_toStartOf="@+id/sorting" + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/MediaOverviewActivity_Storage_used" /> + android:id="@+id/sort_order_arrow" + android:layout_width="16dp" + android:layout_height="16dp" + android:layout_marginStart="8dp" + android:importantForAccessibility="no" + android:tint="@color/signal_inverse_primary" + app:layout_constraintBottom_toBottomOf="@+id/sort_order" + app:layout_constraintStart_toEndOf="@+id/sort_order" + app:layout_constraintTop_toTopOf="@+id/sort_order" + app:srcCompat="@drawable/ic_arrow_down_14" /> + + + + + + + + + + + + - + android:layout_height="wrap_content" + android:minHeight="56dp"> @@ -18,14 +18,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:autoRewind="true" - app:progressAndPlayTint="@android:color/transparent" app:foregroundTintColor="@color/core_ultramarine" + app:progressAndPlayTint="@android:color/transparent" app:small="true" /> - - + + diff --git a/app/src/main/res/layout/media_overview_detail_item_document.xml b/app/src/main/res/layout/media_overview_detail_item_document.xml index 2b656ea4f6..d06096fcf7 100644 --- a/app/src/main/res/layout/media_overview_detail_item_document.xml +++ b/app/src/main/res/layout/media_overview_detail_item_document.xml @@ -2,6 +2,7 @@ @@ -9,48 +10,38 @@ android:id="@+id/image_container" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginStart="16dp" - android:layout_marginTop="8dp" + android:layout_marginStart="@dimen/dsl_settings_gutter" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + + - - - - - - - + android:gravity="center" + android:scaleType="centerInside" + android:textAlignment="center" + android:textColor="@color/core_black" + android:textSize="10sp" + android:visibility="visible" + tools:text="PDF" + tools:visibility="visible" /> + + diff --git a/app/src/main/res/layout/media_overview_detail_item_media.xml b/app/src/main/res/layout/media_overview_detail_item_media.xml index 30b90f8eff..97d3f3b1f0 100644 --- a/app/src/main/res/layout/media_overview_detail_item_media.xml +++ b/app/src/main/res/layout/media_overview_detail_item_media.xml @@ -2,27 +2,32 @@ + android:layout_height="wrap_content" + android:minHeight="56dp"> + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_gravity="center" + android:contentDescription="@string/media_preview_activity__media_content_description" + app:thumbnail_radius="8dp" + app:transparent_overlay_color="@color/transparent_black_08" /> - + + + diff --git a/app/src/main/res/layout/media_overview_detail_text.xml b/app/src/main/res/layout/media_overview_detail_text.xml index 9eab49b7d7..eff9c908ff 100644 --- a/app/src/main/res/layout/media_overview_detail_text.xml +++ b/app/src/main/res/layout/media_overview_detail_text.xml @@ -5,7 +5,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/image_container" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/media_overview_gallery_item.xml b/app/src/main/res/layout/media_overview_gallery_item.xml index d0b49f1145..6b137c0c0c 100644 --- a/app/src/main/res/layout/media_overview_gallery_item.xml +++ b/app/src/main/res/layout/media_overview_gallery_item.xml @@ -10,7 +10,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/media_preview_activity__media_content_description" - android:padding="2dp" /> + app:thumbnail_radius="0dp" + app:transparent_overlay_color="@color/transparent_black_08" /> + android:alpha="0" + tools:alpha="1" + tools:showIn="@layout/media_overview_gallery_item"> - diff --git a/app/src/main/res/layout/media_overview_item_header.xml b/app/src/main/res/layout/media_overview_item_header.xml index 59eacd65c2..02daf110b7 100644 --- a/app/src/main/res/layout/media_overview_item_header.xml +++ b/app/src/main/res/layout/media_overview_item_header.xml @@ -1,18 +1,20 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/signal_background_primary" + android:minHeight="48dp" + android:paddingStart="@dimen/dsl_settings_gutter" + android:paddingTop="16dp" + android:paddingEnd="@dimen/dsl_settings_gutter" + android:paddingBottom="12dp"> - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/media_overview_page_fragment.xml b/app/src/main/res/layout/media_overview_page_fragment.xml index 553fe99a55..d300c067cd 100644 --- a/app/src/main/res/layout/media_overview_page_fragment.xml +++ b/app/src/main/res/layout/media_overview_page_fragment.xml @@ -1,8 +1,7 @@ + android:layout_height="match_parent"> + android:layout_width="56dp" + android:layout_height="56dp" + android:alpha="0" + app:layout_constraintBottom_toBottomOf="@id/image_container" + app:layout_constraintEnd_toEndOf="@id/image_container" + app:layout_constraintStart_toStartOf="@id/image_container" + app:layout_constraintTop_toTopOf="@id/image_container" + tools:alpha="1" + tools:showIn="@layout/media_overview_detail_item_media"> \ No newline at end of file diff --git a/app/src/main/res/values-night/dark_colors.xml b/app/src/main/res/values-night/dark_colors.xml index a95a7caa8e..4ce95b709b 100644 --- a/app/src/main/res/values-night/dark_colors.xml +++ b/app/src/main/res/values-night/dark_colors.xml @@ -20,6 +20,8 @@ @color/core_grey_25 @color/core_white + @color/core_grey_15 + @color/transparent_white_90 @color/transparent_white_80 diff --git a/app/src/main/res/values-sw360dp/dimens.xml b/app/src/main/res/values-sw360dp/dimens.xml index 6f574be577..b5295bb71a 100644 --- a/app/src/main/res/values-sw360dp/dimens.xml +++ b/app/src/main/res/values-sw360dp/dimens.xml @@ -17,6 +17,7 @@ 260dp 24dp + 16dp 260dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5ca342c445..38b4a1e9bb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -83,7 +83,7 @@ 4dp - 3 + 4 8dp 8dp @@ -181,6 +181,7 @@ 32dp 16dp + 8dp 240dp diff --git a/app/src/main/res/values/light_colors.xml b/app/src/main/res/values/light_colors.xml index 69bd40a8ca..d1d370fdaa 100644 --- a/app/src/main/res/values/light_colors.xml +++ b/app/src/main/res/values/light_colors.xml @@ -20,6 +20,8 @@ @color/core_grey_60 @color/core_black + @color/core_grey_45 + @color/core_white @color/transparent_white_90 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 43d7d43746..5440539d3f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -522,4 +522,18 @@ @style/TextAppearance.TimeDurationPicker.Unit.Large.Dark ltr + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 40e4132dfa..376b7c7f06 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -393,6 +393,14 @@ 0dp + +