kopia lustrzana https://github.com/ryukoposting/Signal-Android
Drop voice notes that do not have a URI.
rodzic
b9657208fe
commit
fd115ebb72
|
@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||||
|
import org.thoughtcrime.securesms.mms.AudioSlide;
|
||||||
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
|
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.util.DateUtils;
|
import org.thoughtcrime.securesms.util.DateUtils;
|
||||||
|
@ -70,8 +71,8 @@ class VoiceNoteMediaDescriptionCompatFactory {
|
||||||
* @return A MediaDescriptionCompat with all the details the service expects.
|
* @return A MediaDescriptionCompat with all the details the service expects.
|
||||||
*/
|
*/
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
static MediaDescriptionCompat buildMediaDescription(@NonNull Context context,
|
@Nullable static MediaDescriptionCompat buildMediaDescription(@NonNull Context context,
|
||||||
@NonNull MessageRecord messageRecord)
|
@NonNull MessageRecord messageRecord)
|
||||||
{
|
{
|
||||||
int startingPosition = DatabaseFactory.getMmsSmsDatabase(context)
|
int startingPosition = DatabaseFactory.getMmsSmsDatabase(context)
|
||||||
.getMessagePositionInConversation(messageRecord.getThreadId(),
|
.getMessagePositionInConversation(messageRecord.getThreadId(),
|
||||||
|
@ -79,9 +80,20 @@ class VoiceNoteMediaDescriptionCompatFactory {
|
||||||
|
|
||||||
Recipient threadRecipient = Objects.requireNonNull(DatabaseFactory.getThreadDatabase(context)
|
Recipient threadRecipient = Objects.requireNonNull(DatabaseFactory.getThreadDatabase(context)
|
||||||
.getRecipientForThreadId(messageRecord.getThreadId()));
|
.getRecipientForThreadId(messageRecord.getThreadId()));
|
||||||
Recipient sender = messageRecord.isOutgoing() ? Recipient.self() : messageRecord.getIndividualRecipient();
|
Recipient sender = messageRecord.isOutgoing() ? Recipient.self() : messageRecord.getIndividualRecipient();
|
||||||
Recipient avatarRecipient = threadRecipient.isGroup() ? threadRecipient : sender;
|
Recipient avatarRecipient = threadRecipient.isGroup() ? threadRecipient : sender;
|
||||||
Uri uri = Objects.requireNonNull(((MmsMessageRecord) messageRecord).getSlideDeck().getAudioSlide().getUri());
|
AudioSlide audioSlide = ((MmsMessageRecord) messageRecord).getSlideDeck().getAudioSlide();
|
||||||
|
|
||||||
|
if (audioSlide == null) {
|
||||||
|
Log.w(TAG, "Message does not have an audio slide. Can't play this voice note.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uri uri = audioSlide.getUri();
|
||||||
|
if (uri == null) {
|
||||||
|
Log.w(TAG, "Audio slide does not have a URI. Can't play this voice note.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return buildMediaDescription(context,
|
return buildMediaDescription(context,
|
||||||
threadRecipient,
|
threadRecipient,
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.os.Bundle;
|
||||||
import android.os.ResultReceiver;
|
import android.os.ResultReceiver;
|
||||||
import android.support.v4.media.MediaDescriptionCompat;
|
import android.support.v4.media.MediaDescriptionCompat;
|
||||||
import android.support.v4.media.session.PlaybackStateCompat;
|
import android.support.v4.media.session.PlaybackStateCompat;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.MainThread;
|
import androidx.annotation.MainThread;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
@ -19,7 +20,9 @@ import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
||||||
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
|
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
|
||||||
|
|
||||||
|
import org.signal.core.util.ThreadUtil;
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
|
@ -35,6 +38,7 @@ import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ExoPlayer Preparer for Voice Notes. This only supports ACTION_PLAY_FROM_URI
|
* ExoPlayer Preparer for Voice Notes. This only supports ACTION_PLAY_FROM_URI
|
||||||
|
@ -140,6 +144,10 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP
|
||||||
|
|
||||||
player.prepare(dataSource);
|
player.prepare(dataSource);
|
||||||
canLoadMore = !singlePlayback;
|
canLoadMore = !singlePlayback;
|
||||||
|
} else if (Objects.equals(latestUri, uri)) {
|
||||||
|
Log.w(TAG, "Requested playback but no voice notes could be found.");
|
||||||
|
ThreadUtil.postToMain(() -> Toast.makeText(context, R.string.VoiceNotePlaybackPreparer__failed_to_play_voice_message, Toast.LENGTH_SHORT)
|
||||||
|
.show());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -262,7 +270,12 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Collections.singletonList(VoiceNoteMediaDescriptionCompatFactory.buildMediaDescription(context ,messageRecord));
|
MediaDescriptionCompat mediaDescriptionCompat = VoiceNoteMediaDescriptionCompatFactory.buildMediaDescription(context ,messageRecord);
|
||||||
|
if (mediaDescriptionCompat == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
} else {
|
||||||
|
return Collections.singletonList(mediaDescriptionCompat);
|
||||||
|
}
|
||||||
} catch (NoSuchMessageException e) {
|
} catch (NoSuchMessageException e) {
|
||||||
Log.w(TAG, "Could not find message.", e);
|
Log.w(TAG, "Could not find message.", e);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
@ -278,9 +291,10 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP
|
||||||
try {
|
try {
|
||||||
List<MessageRecord> recordsAfter = DatabaseFactory.getMmsSmsDatabase(context).getMessagesAfterVoiceNoteInclusive(messageId, LIMIT);
|
List<MessageRecord> recordsAfter = DatabaseFactory.getMmsSmsDatabase(context).getMessagesAfterVoiceNoteInclusive(messageId, LIMIT);
|
||||||
|
|
||||||
return Stream.of(buildFilteredMessageRecordList(recordsAfter))
|
return buildFilteredMessageRecordList(recordsAfter).stream()
|
||||||
.map(record -> VoiceNoteMediaDescriptionCompatFactory.buildMediaDescription(context, record))
|
.map(record -> VoiceNoteMediaDescriptionCompatFactory.buildMediaDescription(context, record))
|
||||||
.toList();
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toList());
|
||||||
} catch (NoSuchMessageException e) {
|
} catch (NoSuchMessageException e) {
|
||||||
Log.w(TAG, "Could not find message.", e);
|
Log.w(TAG, "Could not find message.", e);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
|
@ -3169,6 +3169,7 @@
|
||||||
<string name="GroupLinkBottomSheet_the_link_is_not_currently_active">The link is not currently active</string>
|
<string name="GroupLinkBottomSheet_the_link_is_not_currently_active">The link is not currently active</string>
|
||||||
|
|
||||||
<!-- VoiceNotePlaybackPreparer -->
|
<!-- VoiceNotePlaybackPreparer -->
|
||||||
|
<string name="VoiceNotePlaybackPreparer__failed_to_play_voice_message">Failed to play voice message</string>
|
||||||
|
|
||||||
<!-- VoiceNoteMediaDescriptionCompatFactory -->
|
<!-- VoiceNoteMediaDescriptionCompatFactory -->
|
||||||
<string name="VoiceNoteMediaDescriptionCompatFactory__voice_message">Voice message · %1$s</string>
|
<string name="VoiceNoteMediaDescriptionCompatFactory__voice_message">Voice message · %1$s</string>
|
||||||
|
|
Ładowanie…
Reference in New Issue