diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AudioView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AudioView.java
index 2a3f9fc4d4..187f7a0704 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/AudioView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/AudioView.java
@@ -52,14 +52,14 @@ public final class AudioView extends FrameLayout {
private static final int FORWARDS = 1;
private static final int REVERSE = -1;
- @NonNull private final AnimatingToggle controlToggle;
- @NonNull private final View progressAndPlay;
- @NonNull private final LottieAnimationView playPauseButton;
- @NonNull private final ImageView downloadButton;
- @NonNull private final ProgressWheel circleProgress;
- @NonNull private final SeekBar seekBar;
- private final boolean smallView;
- private final boolean autoRewind;
+ @NonNull private final AnimatingToggle controlToggle;
+ @NonNull private final View progressAndPlay;
+ @NonNull private final LottieAnimationView playPauseButton;
+ @NonNull private final ImageView downloadButton;
+ @Nullable private final ProgressWheel circleProgress;
+ @NonNull private final SeekBar seekBar;
+ private final boolean smallView;
+ private final boolean autoRewind;
@Nullable private final TextView duration;
@@ -179,16 +179,20 @@ public final class AudioView extends FrameLayout {
controlToggle.displayQuick(downloadButton);
seekBar.setEnabled(false);
downloadButton.setOnClickListener(new DownloadClickedListener(audio));
- if (circleProgress.isSpinning()) circleProgress.stopSpinning();
- circleProgress.setVisibility(View.GONE);
+ if (circleProgress != null) {
+ if (circleProgress.isSpinning()) circleProgress.stopSpinning();
+ circleProgress.setVisibility(View.GONE);
+ }
} else if (showControls && audio.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_STARTED) {
controlToggle.displayQuick(progressAndPlay);
seekBar.setEnabled(false);
- circleProgress.setVisibility(View.VISIBLE);
- circleProgress.spin();
+ if (circleProgress != null) {
+ circleProgress.setVisibility(View.VISIBLE);
+ circleProgress.spin();
+ }
} else {
seekBar.setEnabled(true);
- if (circleProgress.isSpinning()) circleProgress.stopSpinning();
+ if (circleProgress != null && circleProgress.isSpinning()) circleProgress.stopSpinning();
showPlayButton();
}
@@ -346,7 +350,7 @@ public final class AudioView extends FrameLayout {
duration.setText(getResources().getString(R.string.AudioView_duration, remainingSecs / 60, remainingSecs % 60));
}
- if (smallView) {
+ if (smallView && circleProgress != null) {
circleProgress.setInstantProgress(seekBar.getProgress() == 0 ? 1 : progress);
}
}
@@ -357,7 +361,10 @@ public final class AudioView extends FrameLayout {
new LottieValueCallback<>(new SimpleColorFilter(foregroundTint))));
this.downloadButton.setColorFilter(foregroundTint, PorterDuff.Mode.SRC_IN);
- this.circleProgress.setBarColor(foregroundTint);
+
+ if (circleProgress != null) {
+ this.circleProgress.setBarColor(foregroundTint);
+ }
if (this.duration != null) {
this.duration.setTextColor(foregroundTint);
@@ -400,11 +407,14 @@ public final class AudioView extends FrameLayout {
}
private void showPlayButton() {
- if (!smallView) {
- circleProgress.setVisibility(GONE);
- } else if (seekBar.getProgress() == 0) {
- circleProgress.setInstantProgress(1);
+ if (circleProgress != null) {
+ if (!smallView) {
+ circleProgress.setVisibility(GONE);
+ } else if (seekBar.getProgress() == 0) {
+ circleProgress.setInstantProgress(1);
+ }
}
+
playPauseButton.setVisibility(VISIBLE);
controlToggle.displayQuick(progressAndPlay);
}
@@ -495,7 +505,7 @@ public final class AudioView extends FrameLayout {
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventAsync(final PartProgressEvent event) {
- if (audioSlide != null && event.attachment.equals(audioSlide.asAttachment())) {
+ if (audioSlide != null && circleProgress != null && event.attachment.equals(audioSlide.asAttachment())) {
circleProgress.setInstantProgress(((float) event.progress) / event.total);
}
}
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 af25d26eed..c199e31f7a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java
@@ -26,6 +26,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.RecyclerView;
@@ -421,16 +422,21 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
line1.setText(describe(fromToPair.first(), fromToPair.second()));
}
- private String describe(@NonNull Recipient from, @NonNull Recipient thread) {
+ protected @Nullable String getMediaTitle() {
+ return fileName.orNull();
+ }
+
+ private @NonNull String describe(@NonNull Recipient from, @NonNull Recipient thread) {
if (from == Recipient.UNKNOWN && thread == Recipient.UNKNOWN) {
return fileName.or(fileTypeDescription);
}
String sentFromToString = getSentFromToString(from, thread);
+ String mediaTitle = getMediaTitle();
- if (fileName.isPresent()) {
+ if (mediaTitle != null) {
return context.getString(R.string.MediaOverviewActivity_detail_line_2_part,
- fileName.get(),
+ mediaTitle,
sentFromToString);
} else {
return sentFromToString;
@@ -479,6 +485,8 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
private final AudioView audioView;
+ private boolean isVoiceNote;
+
AudioDetailViewHolder(@NonNull View itemView) {
super(itemView);
this.audioView = itemView.findViewById(R.id.audio);
@@ -486,12 +494,14 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
@Override
public void bind(@NonNull Context context, @NonNull MediaDatabase.MediaRecord mediaRecord, @NonNull Slide slide) {
- super.bind(context, mediaRecord, slide);
-
if (!slide.hasAudio()) {
throw new AssertionError();
}
+ isVoiceNote = slide.asAttachment().isVoiceNote();
+
+ super.bind(context, mediaRecord, slide);
+
long mmsId = Objects.requireNonNull(mediaRecord.getAttachment()).getMmsId();
audioItemListener.unregisterPlaybackStateObserver(audioView.getPlaybackStateObserver());
@@ -502,6 +512,11 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(mediaRecord));
}
+ @Override
+ protected @NonNull String getMediaTitle() {
+ return context.getString(R.string.ThreadRecord_voice_message);
+ }
+
@Override
void unbind() {
super.unbind();
diff --git a/app/src/main/res/drawable/ic_audio_24.xml b/app/src/main/res/drawable/ic_audio_24.xml
new file mode 100644
index 0000000000..26141f5630
--- /dev/null
+++ b/app/src/main/res/drawable/ic_audio_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/audio_view_circle_small.xml b/app/src/main/res/layout/audio_view_circle_small.xml
new file mode 100644
index 0000000000..748097eec3
--- /dev/null
+++ b/app/src/main/res/layout/audio_view_circle_small.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/audio_view_small.xml b/app/src/main/res/layout/audio_view_small.xml
index 44a07c74d7..00916e3400 100644
--- a/app/src/main/res/layout/audio_view_small.xml
+++ b/app/src/main/res/layout/audio_view_small.xml
@@ -9,7 +9,7 @@
android:orientation="vertical"
tools:background="#ff00ff">
-
+
diff --git a/app/src/main/res/layout/media_overview_detail_item_audio.xml b/app/src/main/res/layout/media_overview_detail_item_audio.xml
index 301c889376..f5a648cf65 100644
--- a/app/src/main/res/layout/media_overview_detail_item_audio.xml
+++ b/app/src/main/res/layout/media_overview_detail_item_audio.xml
@@ -3,24 +3,26 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="56dp">
+ android:minHeight="@dimen/media_overview_detail_item_height">
-
+
@@ -28,4 +30,19 @@
+
+
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 d06096fcf7..8bd5eafe27 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,15 +2,16 @@
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/media_overview_detail_item_height">
@@ -29,13 +30,10 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="false"
- android:gravity="center"
- android:scaleType="centerInside"
- android:textAlignment="center"
+ android:textAppearance="@style/TextAppearance.Signal.Subtitle.Bold"
android:textColor="@color/core_black"
- android:textSize="10sp"
android:visibility="visible"
- tools:text="PDF"
+ tools:text="pdf"
tools:visibility="visible" />
@@ -44,4 +42,13 @@
+
+
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 97d3f3b1f0..9f6fceea3a 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
@@ -3,13 +3,14 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="56dp">
+ android:minHeight="@dimen/media_overview_detail_item_height">
@@ -22,12 +23,19 @@
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 eff9c908ff..be08e25a06 100644
--- a/app/src/main/res/layout/media_overview_detail_text.xml
+++ b/app/src/main/res/layout/media_overview_detail_text.xml
@@ -2,12 +2,17 @@
@@ -28,10 +31,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
- android:paddingStart="6dp"
- android:paddingEnd="6dp"
android:singleLine="true"
- android:textSize="14sp"
+ android:textAppearance="@style/TextAppearance.Signal.Body2"
+ android:textColor="@color/signal_text_secondary"
app:layout_constraintStart_toEndOf="@+id/image_container"
app:layout_constraintTop_toTopOf="parent"
tools:text="2.7 MB, 11.06.19 at 5:25 AM" />
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 02daf110b7..a39c38573f 100644
--- a/app/src/main/res/layout/media_overview_item_header.xml
+++ b/app/src/main/res/layout/media_overview_item_header.xml
@@ -5,15 +5,15 @@
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">
diff --git a/app/src/main/res/values-sw360dp/dimens.xml b/app/src/main/res/values-sw360dp/dimens.xml
index b5295bb71a..7d4b4797db 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
+ 10dp
16dp
260dp
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index e9920641f6..ee33d02a26 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -71,6 +71,7 @@
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 525704ac88..4ed3336859 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -84,6 +84,7 @@
4dp
4
+ 72dp
8dp
8dp
@@ -181,6 +182,7 @@
32dp
16dp
+ 2dp
8dp
240dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d71718b2fd..d39427d32c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -942,6 +942,7 @@
Image
%1$s · %2$s
%1$s · %2$s · %3$s
+ Voice message
Sent by %1$s
Sent by you