diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 05cd8875bc..fd136d3d3c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -366,7 +366,7 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
index 631a867dfd..ff10d59fe2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java
@@ -13,7 +13,6 @@ import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
@@ -156,8 +155,6 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment {
super.onResume();
camera.bindToLifecycle(getViewLifecycleOwner(), this::handleCameraInitializationError);
- requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- requireActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
index c3fd7fb89b..989a29c730 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt
@@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.mediasend.v2.text.send.TextStoryPostSendReposi
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet
import org.thoughtcrime.securesms.stories.Stories
+import org.thoughtcrime.securesms.util.FullscreenHelper
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.visible
@@ -155,6 +156,8 @@ class MediaSelectionActivity :
}
onBackPressedDispatcher.addCallback(OnBackPressed())
+
+ FullscreenHelper.setLowProfileMode(window)
}
private fun animateTextStyling(selectedSwitch: TextView, unselectedSwitch: TextView, duration: Long) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt
index dce7892a6a..e8c977910d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt
@@ -132,7 +132,7 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) {
}
viewModel.state.observe(viewLifecycleOwner) { state ->
- toolbar.title = state.bucketTitle
+ toolbar.title = state.bucketTitle ?: requireContext().getString(R.string.AttachmentKeyboard_gallery)
}
val galleryItemsWithSelection = LiveDataUtil.combineLatest(
@@ -141,7 +141,7 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) {
) { galleryItems, selectedMedia ->
galleryItems.map {
if (it is MediaGallerySelectableItem.FileModel) {
- it.copy(isSelected = selectedMedia.contains(it.media))
+ it.copy(isSelected = selectedMedia.contains(it.media), selectionOneBasedIndex = selectedMedia.indexOf(it.media) + 1)
} else {
it
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt
index 3b6ba2bdc5..461702f50d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt
@@ -1,14 +1,17 @@
package org.thoughtcrime.securesms.mediasend.v2.gallery
+import android.animation.ValueAnimator
import android.graphics.drawable.Drawable
import android.view.View
import android.widget.ImageView
import android.widget.TextView
+import androidx.core.view.setPadding
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
-import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
+import com.google.android.material.imageview.ShapeableImageView
+import org.signal.core.util.DimensionUnit
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.mediasend.Media
@@ -26,6 +29,8 @@ typealias OnMediaFolderClicked = (MediaFolder) -> Unit
typealias OnMediaClicked = (Media, Boolean) -> Unit
private val FILE_VIEW_HOLDER_TAG = Log.tag(MediaGallerySelectableItem.FileViewHolder::class.java)
+private const val PAYLOAD_CHECK_CHANGED = 0
+private const val PAYLOAD_INDEX_CHANGED = 1
object MediaGallerySelectableItem {
@@ -51,14 +56,10 @@ object MediaGallerySelectableItem {
}
abstract class BaseViewHolder>(itemView: View) : MappingViewHolder(itemView) {
- protected val imageView: ImageView = itemView.findViewById(R.id.media_gallery_image)
+ protected val imageView: ShapeableImageView = itemView.findViewById(R.id.media_gallery_image)
protected val playOverlay: ImageView = itemView.findViewById(R.id.media_gallery_play_overlay)
- protected val checkView: ImageView? = itemView.findViewById(R.id.media_gallery_check)
+ protected val checkView: TextView? = itemView.findViewById(R.id.media_gallery_check)
protected val title: TextView? = itemView.findViewById(R.id.media_gallery_title)
-
- init {
- (itemView as AspectRatioFrameLayout).setAspectRatio(1f)
- }
}
class FolderViewHolder(itemView: View, private val onMediaFolderClicked: OnMediaFolderClicked) : BaseViewHolder(itemView) {
@@ -74,27 +75,81 @@ object MediaGallerySelectableItem {
}
}
- data class FileModel(val media: Media, val isSelected: Boolean) : MappingModel {
+ data class FileModel(val media: Media, val isSelected: Boolean, val selectionOneBasedIndex: Int) : MappingModel {
override fun areItemsTheSame(newItem: FileModel): Boolean {
return newItem.media == media
}
override fun areContentsTheSame(newItem: FileModel): Boolean {
- return newItem.media == media && isSelected == newItem.isSelected
+ return newItem.media == media && isSelected == newItem.isSelected && selectionOneBasedIndex == newItem.selectionOneBasedIndex
+ }
+
+ override fun getChangePayload(newItem: FileModel): Any? {
+ return when {
+ newItem.media != media -> null
+ newItem.isSelected != isSelected -> PAYLOAD_CHECK_CHANGED
+ newItem.selectionOneBasedIndex != selectionOneBasedIndex -> PAYLOAD_INDEX_CHANGED
+ else -> null
+ }
}
}
class FileViewHolder(itemView: View, private val onMediaClicked: OnMediaClicked) : BaseViewHolder(itemView) {
+
+ private val selectedPadding = DimensionUnit.DP.toPixels(12f)
+ private val selectedRadius = DimensionUnit.DP.toPixels(12f)
+ private var animator: ValueAnimator? = null
+
override fun bind(model: FileModel) {
+ checkView?.visible = model.isSelected
+ checkView?.text = "${model.selectionOneBasedIndex}"
+ itemView.setOnClickListener { onMediaClicked(model.media, model.isSelected) }
+ playOverlay.visible = MediaUtil.isVideo(model.media.mimeType) && !model.media.isVideoGif
+ title?.visible = false
+
+ if (PAYLOAD_INDEX_CHANGED in payload) {
+ return
+ }
+
+ if (PAYLOAD_CHECK_CHANGED in payload) {
+ animateCheckState(model.isSelected)
+ return
+ } else {
+ animator?.cancel()
+ updateImageView(if (model.isSelected) 1f else 0f)
+ }
+
GlideApp.with(imageView)
.load(DecryptableStreamUriLoader.DecryptableUri(model.media.uri))
.addListener(ErrorLoggingRequestListener(FILE_VIEW_HOLDER_TAG))
.into(imageView)
+ }
- checkView?.isSelected = model.isSelected
- playOverlay.visible = MediaUtil.isVideo(model.media.mimeType) && !model.media.isVideoGif
- itemView.setOnClickListener { onMediaClicked(model.media, model.isSelected) }
- title?.visible = false
+ private fun animateCheckState(isSelected: Boolean) {
+ animator?.cancel()
+
+ val start = if (isSelected) 0f else 1f
+ val end = if (isSelected) 1f else 0f
+
+ animator = ValueAnimator.ofFloat(start, end).apply {
+ addUpdateListener { animator ->
+ val fraction = animator.animatedValue as Float
+ updateImageView(fraction)
+ }
+ start()
+ }
+ }
+
+ override fun onDetachedFromWindow() {
+ animator?.cancel()
+ }
+
+ private fun updateImageView(fraction: Float) {
+ val padding = selectedPadding * fraction
+ imageView.setPadding(padding.toInt())
+
+ val corners = selectedRadius * fraction
+ imageView.shapeAppearanceModel = imageView.shapeAppearanceModel.withCornerSize(corners)
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt
index e4f402a680..d8b5ff48f9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt
@@ -47,7 +47,7 @@ class MediaGalleryViewModel(bucketId: String?, bucketTitle: String?, private val
state.copy(
bucketId = bucketId, bucketTitle = bucketTitle,
items = media.map {
- MediaGallerySelectableItem.FileModel(it, false)
+ MediaGallerySelectableItem.FileModel(it, false, 0)
}
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
index a25bfe2557..0030f87a83 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt
@@ -283,8 +283,8 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) {
private fun presentImageQualityToggle(quality: SentMediaQuality) {
qualityButton.setImageResource(
when (quality) {
- SentMediaQuality.STANDARD -> R.drawable.ic_sq_36
- SentMediaQuality.HIGH -> R.drawable.ic_hq_36
+ SentMediaQuality.STANDARD -> R.drawable.ic_sq_24
+ SentMediaQuality.HIGH -> R.drawable.ic_hq_24
}
)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt
index 5e90c34cc1..4941533fc7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt
@@ -34,7 +34,6 @@ object MediaReviewSelectedItem {
private val imageView: ImageView = itemView.findViewById(R.id.media_review_selected_image)
private val playOverlay: ImageView = itemView.findViewById(R.id.media_review_play_overlay)
- private val selectedOverlay: ImageView = itemView.findViewById(R.id.media_review_selected_overlay)
override fun bind(model: Model) {
Glide.with(imageView)
@@ -43,7 +42,7 @@ object MediaReviewSelectedItem {
.into(imageView)
playOverlay.visible = MediaUtil.isNonGifVideo(model.media) && !model.isSelected
- selectedOverlay.isSelected = model.isSelected
+ imageView.isSelected = model.isSelected
itemView.contentDescription = if (model.isSelected) {
context.getString(R.string.MediaReviewSelectedItem__tap_to_remove)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
index c6104dd77c..66cb5a1bf1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java
@@ -17,10 +17,12 @@ import android.view.ViewGroup;
import android.widget.Toast;
import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import com.bumptech.glide.load.DataSource;
@@ -249,16 +251,17 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
restoredModel = null;
}
+ @ColorInt int blackoutColor = ContextCompat.getColor(requireContext(), R.color.signal_colorBackground);
if (editorModel == null) {
switch (mode) {
case AVATAR_EDIT:
- editorModel = EditorModel.createForAvatarEdit();
+ editorModel = EditorModel.createForAvatarEdit(blackoutColor);
break;
case AVATAR_CAPTURE:
- editorModel = EditorModel.createForAvatarCapture();
+ editorModel = EditorModel.createForAvatarCapture(blackoutColor);
break;
default:
- editorModel = EditorModel.create();
+ editorModel = EditorModel.create(blackoutColor);
break;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
index b27ae7147e..698e9cd1bf 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
@@ -169,4 +169,8 @@ public final class FullscreenHelper {
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
+
+ public static void setLowProfileMode(@NonNull Window window) {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperCropActivity.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperCropActivity.java
index 2b839f9312..d9bc546863 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperCropActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperCropActivity.java
@@ -179,7 +179,7 @@ public final class WallpaperCropActivity extends BaseActivity {
int width = displayMetrics.widthPixels;
float ratio = width / (float) height;
- EditorModel editorModel = EditorModel.createForWallpaperEditing(ratio);
+ EditorModel editorModel = EditorModel.createForWallpaperEditing(ratio, ContextCompat.getColor(this, R.color.signal_colorBackground));
EditorElement image = new EditorElement(new UriGlideRenderer(imageUri, true, width, height, UriGlideRenderer.WEAK_BLUR));
image.getFlags()
diff --git a/app/src/main/res/color/media_selection_stroke.xml b/app/src/main/res/color/media_selection_stroke.xml
new file mode 100644
index 0000000000..91057ee334
--- /dev/null
+++ b/app/src/main/res/color/media_selection_stroke.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-ldrtl/persistent_fading_edge.xml b/app/src/main/res/drawable-ldrtl/persistent_fading_edge.xml
index 12dcc6edf5..718c8441a9 100644
--- a/app/src/main/res/drawable-ldrtl/persistent_fading_edge.xml
+++ b/app/src/main/res/drawable-ldrtl/persistent_fading_edge.xml
@@ -4,5 +4,5 @@
android:type="linear"
android:angle="180"
android:startColor="@color/transparent"
- android:endColor="@color/black" />
+ android:endColor="@color/signal_dark_colorBackground" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/add_media.xml b/app/src/main/res/drawable/add_media.xml
index 9210636aa0..fff66dfe43 100644
--- a/app/src/main/res/drawable/add_media.xml
+++ b/app/src/main/res/drawable/add_media.xml
@@ -1,13 +1,12 @@
-
-
-
-
+
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add_media_22.xml b/app/src/main/res/drawable/ic_add_media_22.xml
new file mode 100644
index 0000000000..b5c27af88d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_media_22.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_crop_24.xml b/app/src/main/res/drawable/ic_crop_24.xml
deleted file mode 100644
index 29f550c77c..0000000000
--- a/app/src/main/res/drawable/ic_crop_24.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_crop_rotate_24.xml b/app/src/main/res/drawable/ic_crop_rotate_24.xml
new file mode 100644
index 0000000000..ddda2984eb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_crop_rotate_24.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_crop_rotate_36.xml b/app/src/main/res/drawable/ic_crop_rotate_36.xml
deleted file mode 100644
index 15c779184b..0000000000
--- a/app/src/main/res/drawable/ic_crop_rotate_36.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_draw_24.xml b/app/src/main/res/drawable/ic_draw_24.xml
index 6620996d38..05785b3672 100644
--- a/app/src/main/res/drawable/ic_draw_24.xml
+++ b/app/src/main/res/drawable/ic_draw_24.xml
@@ -4,6 +4,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
+ android:pathData="M0,12C0,18.568 5.432,24 12,24C18.568,24 24,18.568 24,12C24,5.42 18.568,0 11.988,0C5.42,0 0,5.42 0,12ZM1.555,12C1.555,6.209 6.209,1.543 11.988,1.543C17.779,1.543 22.445,6.209 22.457,12C22.457,15.793 20.447,19.107 17.42,20.937L15.817,13.555C15.709,13.065 15.314,12.694 14.835,12.67H14.656L12.646,6.544C12.431,5.922 11.569,5.91 11.366,6.544L9.356,12.67H9.176C8.698,12.694 8.303,13.065 8.207,13.543L6.592,20.937C3.577,19.107 1.555,15.793 1.555,12ZM7.729,21.535L9.392,13.902H14.632L16.295,21.535C14.979,22.11 13.531,22.445 12,22.445C10.469,22.445 9.021,22.122 7.729,21.535Z"
+ android:fillColor="#FF000000"/>
diff --git a/app/src/main/res/drawable/ic_draw_36.xml b/app/src/main/res/drawable/ic_draw_36.xml
deleted file mode 100644
index 45249c58ca..0000000000
--- a/app/src/main/res/drawable/ic_draw_36.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_hq_24.xml b/app/src/main/res/drawable/ic_hq_24.xml
new file mode 100644
index 0000000000..560d38f140
--- /dev/null
+++ b/app/src/main/res/drawable/ic_hq_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_hq_36.xml b/app/src/main/res/drawable/ic_hq_36.xml
deleted file mode 100644
index 1af8cfa0a1..0000000000
--- a/app/src/main/res/drawable/ic_hq_36.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_sq_24.xml b/app/src/main/res/drawable/ic_sq_24.xml
new file mode 100644
index 0000000000..876bbc1036
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sq_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_view_infinite_24.xml b/app/src/main/res/drawable/ic_view_infinite_24.xml
new file mode 100644
index 0000000000..f59e264d0c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_view_infinite_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_view_infinite_28.xml b/app/src/main/res/drawable/ic_view_infinite_28.xml
deleted file mode 100644
index 3eff20db72..0000000000
--- a/app/src/main/res/drawable/ic_view_infinite_28.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_view_once_28.xml b/app/src/main/res/drawable/ic_view_once_28.xml
deleted file mode 100644
index af6b1276f7..0000000000
--- a/app/src/main/res/drawable/ic_view_once_28.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/image_editor_hud_clear_all_background.xml b/app/src/main/res/drawable/image_editor_hud_clear_all_background.xml
index f5ec4fa635..3940ebe12e 100644
--- a/app/src/main/res/drawable/image_editor_hud_clear_all_background.xml
+++ b/app/src/main/res/drawable/image_editor_hud_clear_all_background.xml
@@ -2,7 +2,7 @@
-
-
+
diff --git a/app/src/main/res/drawable/media_selection_pill.xml b/app/src/main/res/drawable/media_selection_pill.xml
new file mode 100644
index 0000000000..7aa8eab490
--- /dev/null
+++ b/app/src/main/res/drawable/media_selection_pill.xml
@@ -0,0 +1,17 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/persistent_fading_edge.xml b/app/src/main/res/drawable/persistent_fading_edge.xml
index e0f62ca3be..7aa3b7b67a 100644
--- a/app/src/main/res/drawable/persistent_fading_edge.xml
+++ b/app/src/main/res/drawable/persistent_fading_edge.xml
@@ -4,5 +4,5 @@
android:type="linear"
android:angle="0"
android:startColor="@color/transparent"
- android:endColor="@color/black" />
+ android:endColor="@color/signal_dark_colorBackground" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/v2_media_count_indicator_background.xml b/app/src/main/res/drawable/v2_media_count_indicator_background.xml
index 7078e11dcb..1d2d112e5f 100644
--- a/app/src/main/res/drawable/v2_media_count_indicator_background.xml
+++ b/app/src/main/res/drawable/v2_media_count_indicator_background.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/v2_media_review_selected_item_overlay.xml b/app/src/main/res/drawable/v2_media_review_selected_item_overlay.xml
index cde7209a20..2386ac1c37 100644
--- a/app/src/main/res/drawable/v2_media_review_selected_item_overlay.xml
+++ b/app/src/main/res/drawable/v2_media_review_selected_item_overlay.xml
@@ -4,32 +4,21 @@
-
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/camera_fragment.xml b/app/src/main/res/layout/camera_fragment.xml
index 5165da71b8..2d2e55eecb 100644
--- a/app/src/main/res/layout/camera_fragment.xml
+++ b/app/src/main/res/layout/camera_fragment.xml
@@ -1,7 +1,6 @@
diff --git a/app/src/main/res/layout/camerax_fragment.xml b/app/src/main/res/layout/camerax_fragment.xml
index e3aafa0e00..8d74bf0bdc 100644
--- a/app/src/main/res/layout/camerax_fragment.xml
+++ b/app/src/main/res/layout/camerax_fragment.xml
@@ -2,8 +2,7 @@
+ android:layout_height="match_parent">
-
@@ -11,7 +10,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
- android:gravity="center" />
+ android:gravity="center"
+ app:imageEditorView_blackoutColor="@color/signal_colorBackground" />
+ android:layout_height="match_parent" />
+ app:srcCompat="@drawable/ic_chevron_end_24"
+ app:tint="@color/signal_colorOnSurface" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/v2_media_gallery_folder_item.xml b/app/src/main/res/layout/v2_media_gallery_folder_item.xml
index b3fc501b06..c87c9cd626 100644
--- a/app/src/main/res/layout/v2_media_gallery_folder_item.xml
+++ b/app/src/main/res/layout/v2_media_gallery_folder_item.xml
@@ -1,51 +1,51 @@
-
+ android:layout_height="wrap_content">
-
+
+
+
+
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:layout_marginBottom="12dp"
+ android:drawablePadding="4dp"
+ android:ellipsize="end"
+ android:gravity="center"
+ android:lines="1"
+ android:paddingHorizontal="8dp"
+ android:textAppearance="@style/Signal.Text.BodyMedium"
+ android:textColor="@color/signal_colorOnSurface"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/media_gallery_image"
+ tools:text="Lorem ipsum dolor sit amet" />
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/v2_media_gallery_fragment.xml b/app/src/main/res/layout/v2_media_gallery_fragment.xml
index ccae964ecf..416a4f4a75 100644
--- a/app/src/main/res/layout/v2_media_gallery_fragment.xml
+++ b/app/src/main/res/layout/v2_media_gallery_fragment.xml
@@ -3,23 +3,24 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/core_black">
+ android:layout_height="match_parent">
+ app:navigationIcon="@drawable/ic_arrow_left_24"
+ app:title="@string/AttachmentKeyboard_gallery"
+ app:titleTextAppearance="@style/Signal.Text.TitleLarge" />
diff --git a/app/src/main/res/layout/v2_media_gallery_item.xml b/app/src/main/res/layout/v2_media_gallery_item.xml
index a26a7ec906..c3392c4555 100644
--- a/app/src/main/res/layout/v2_media_gallery_item.xml
+++ b/app/src/main/res/layout/v2_media_gallery_item.xml
@@ -1,47 +1,48 @@
-
+ android:layout_height="wrap_content"
+ android:background="@color/signal_colorSurfaceVariant"
+ tools:layout_height="95dp"
+ tools:layout_width="95dp">
-
+ android:layout_height="0dp"
+ android:importantForAccessibility="no"
+ android:scaleType="centerCrop"
+ app:layout_constraintDimensionRatio="1:1"
+ app:layout_constraintTop_toTopOf="parent"
+ tools:src="@drawable/test_gradient" />
-
+
-
+
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/v2_media_gallery_item_no_check.xml b/app/src/main/res/layout/v2_media_gallery_item_no_check.xml
index 0273e6b901..d5569cef69 100644
--- a/app/src/main/res/layout/v2_media_gallery_item_no_check.xml
+++ b/app/src/main/res/layout/v2_media_gallery_item_no_check.xml
@@ -11,7 +11,7 @@
tools:layout_height="95dp"
tools:layout_width="95dp">
-
@@ -160,20 +159,20 @@
android:layout_marginEnd="16dp"
android:layout_marginBottom="20dp"
android:background="@drawable/rounded_rectangle_secondary_dark"
+ android:cursorVisible="false"
+ android:enabled="false"
+ android:focusable="false"
android:gravity="start|center_vertical"
+ android:inputType="none"
+ android:maxLines="3"
android:minHeight="36dp"
android:paddingStart="12dp"
- android:paddingEnd="12dp"
android:paddingTop="6dp"
+ android:paddingEnd="12dp"
android:paddingBottom="6dp"
android:textAppearance="@style/Signal.Text.Body"
android:textColor="@color/core_white"
android:visibility="gone"
- android:inputType="none"
- android:enabled="false"
- android:focusable="false"
- android:cursorVisible="false"
- android:maxLines="3"
app:layout_constraintBottom_toTopOf="@id/button_barrier"
app:layout_constraintTop_toTopOf="@id/add_a_message_barrier"
tools:visibility="visible" />
@@ -194,79 +193,87 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
-
-
-
-
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_marginStart="12dp"
+ tools:background="@color/signal_dark_colorSurface">
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/v2_media_gallery_fragment_toolbar_menu.xml b/app/src/main/res/menu/v2_media_gallery_fragment_toolbar_menu.xml
index d3a6d44da7..0a81e640c7 100644
--- a/app/src/main/res/menu/v2_media_gallery_fragment_toolbar_menu.xml
+++ b/app/src/main/res/menu/v2_media_gallery_fragment_toolbar_menu.xml
@@ -7,7 +7,7 @@
android:title="@string/MediaPickerActivity__menu_open_camera"
android:id="@+id/action_camera"
android:visible="true"
- android:icon="@drawable/ic_camera_solid_white_24"
+ android:icon="@drawable/ic_camera_24"
app:showAsAction="always" />
\ No newline at end of file
diff --git a/app/src/main/res/values-v21/themes.xml b/app/src/main/res/values-v21/themes.xml
index ee338f62b9..8bc4f750e5 100644
--- a/app/src/main/res/values-v21/themes.xml
+++ b/app/src/main/res/values-v21/themes.xml
@@ -29,8 +29,6 @@
+
+
+
+