ViewStub for AudioView in ConversationItems

// FREEBIE
pull/1/head
Moxie Marlinspike 8 years ago
parent 7286fd9b06
commit e270e8d429

@ -60,14 +60,11 @@
tools:src="@drawable/ic_video_light" tools:src="@drawable/ic_video_light"
tools:visibility="gone" /> tools:visibility="gone" />
<org.thoughtcrime.securesms.components.AudioView <ViewStub
android:id="@+id/audio_view" android:id="@+id/audio_view_stub"
android:layout="@layout/conversation_item_received_audio"
android:layout_width="210dp" android:layout_width="210dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"/>
android:visibility="gone"
app:foregroundTintColor="@color/white"
app:backgroundTintColor="@color/blue_500"
tools:visibility="visible"/>
<org.thoughtcrime.securesms.components.emoji.EmojiTextView <org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/conversation_item_body" android:id="@+id/conversation_item_body"

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<org.thoughtcrime.securesms.components.AudioView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/audio_view"
android:layout_width="210dp"
android:layout_height="wrap_content"
android:visibility="gone"
app:foregroundTintColor="@color/white"
app:backgroundTintColor="@color/blue_500"
tools:visibility="visible"/>

@ -51,13 +51,11 @@
tools:src="@drawable/ic_video_light" tools:src="@drawable/ic_video_light"
tools:visibility="visible" /> tools:visibility="visible" />
<org.thoughtcrime.securesms.components.AudioView <ViewStub
android:id="@+id/audio_view" android:id="@+id/audio_view_stub"
android:layout="@layout/conversation_item_sent_audio"
android:layout_width="210dp" android:layout_width="210dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"/>
app:foregroundTintColor="@color/grey_500"
app:backgroundTintColor="@color/white"
android:visibility="gone"/>
<org.thoughtcrime.securesms.components.emoji.EmojiTextView <org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/conversation_item_body" android:id="@+id/conversation_item_body"

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<org.thoughtcrime.securesms.components.AudioView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/audio_view"
android:layout_width="210dp"
android:layout_height="wrap_content"
app:foregroundTintColor="@color/grey_500"
app:backgroundTintColor="@color/white"
android:visibility="gone"/>

@ -35,6 +35,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.MmsSmsColumns;
import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase;
import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.SmsDatabase;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.LRUCache;
@ -63,9 +64,11 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
private final Map<String,SoftReference<MessageRecord>> messageRecordCache = private final Map<String,SoftReference<MessageRecord>> messageRecordCache =
Collections.synchronizedMap(new LRUCache<String, SoftReference<MessageRecord>>(MAX_CACHE_SIZE)); Collections.synchronizedMap(new LRUCache<String, SoftReference<MessageRecord>>(MAX_CACHE_SIZE));
public static final int MESSAGE_TYPE_OUTGOING = 0; private static final int MESSAGE_TYPE_OUTGOING = 0;
public static final int MESSAGE_TYPE_INCOMING = 1; private static final int MESSAGE_TYPE_INCOMING = 1;
public static final int MESSAGE_TYPE_UPDATE = 2; private static final int MESSAGE_TYPE_UPDATE = 2;
private static final int MESSAGE_TYPE_AUDIO_OUTGOING = 3;
private static final int MESSAGE_TYPE_AUDIO_INCOMING = 4;
private final Set<MessageRecord> batchSelected = Collections.synchronizedSet(new HashSet<MessageRecord>()); private final Set<MessageRecord> batchSelected = Collections.synchronizedSet(new HashSet<MessageRecord>());
@ -168,10 +171,12 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
private @LayoutRes int getLayoutForViewType(int viewType) { private @LayoutRes int getLayoutForViewType(int viewType) {
switch (viewType) { switch (viewType) {
case ConversationAdapter.MESSAGE_TYPE_OUTGOING: return R.layout.conversation_item_sent; case MESSAGE_TYPE_AUDIO_OUTGOING:
case ConversationAdapter.MESSAGE_TYPE_INCOMING: return R.layout.conversation_item_received; case MESSAGE_TYPE_OUTGOING: return R.layout.conversation_item_sent;
case ConversationAdapter.MESSAGE_TYPE_UPDATE: return R.layout.conversation_item_update; case MESSAGE_TYPE_AUDIO_INCOMING:
default: throw new IllegalArgumentException("unsupported item view type given to ConversationAdapter"); case MESSAGE_TYPE_INCOMING: return R.layout.conversation_item_received;
case MESSAGE_TYPE_UPDATE: return R.layout.conversation_item_update;
default: throw new IllegalArgumentException("unsupported item view type given to ConversationAdapter");
} }
} }
@ -182,9 +187,11 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
MessageRecord messageRecord = getMessageRecord(id, cursor, type); MessageRecord messageRecord = getMessageRecord(id, cursor, type);
if (messageRecord.isGroupAction() || messageRecord.isCallLog() || messageRecord.isJoined() || if (messageRecord.isGroupAction() || messageRecord.isCallLog() || messageRecord.isJoined() ||
messageRecord.isExpirationTimerUpdate() || messageRecord.isEndSession() || messageRecord.isIdentityUpdate()) messageRecord.isExpirationTimerUpdate() || messageRecord.isEndSession() || messageRecord.isIdentityUpdate()) {
{
return MESSAGE_TYPE_UPDATE; return MESSAGE_TYPE_UPDATE;
} else if (hasAudio(messageRecord)) {
if (messageRecord.isOutgoing()) return MESSAGE_TYPE_AUDIO_OUTGOING;
else return MESSAGE_TYPE_AUDIO_INCOMING;
} else if (messageRecord.isOutgoing()) { } else if (messageRecord.isOutgoing()) {
return MESSAGE_TYPE_OUTGOING; return MESSAGE_TYPE_OUTGOING;
} else { } else {
@ -227,4 +234,10 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
public Set<MessageRecord> getSelectedItems() { public Set<MessageRecord> getSelectedItems() {
return Collections.unmodifiableSet(new HashSet<>(batchSelected)); return Collections.unmodifiableSet(new HashSet<>(batchSelected));
} }
private boolean hasAudio(MessageRecord messageRecord) {
return messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MediaMmsMessageRecord)messageRecord).getSlideDeck().getAudioSlide() != null;
}
} }

@ -33,6 +33,7 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -70,6 +71,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.dualsim.SubscriptionInfoCompat; import org.thoughtcrime.securesms.util.dualsim.SubscriptionInfoCompat;
import org.thoughtcrime.securesms.util.dualsim.SubscriptionManagerCompat; import org.thoughtcrime.securesms.util.dualsim.SubscriptionManagerCompat;
import org.thoughtcrime.securesms.util.views.Stub;
import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.libsignal.util.guava.Optional;
import java.util.HashSet; import java.util.HashSet;
@ -96,7 +98,7 @@ public class ConversationItem extends LinearLayout
private boolean groupThread; private boolean groupThread;
private Recipient recipient; private Recipient recipient;
private View bodyBubble; protected View bodyBubble;
private TextView bodyText; private TextView bodyText;
private TextView dateText; private TextView dateText;
private TextView simInfoText; private TextView simInfoText;
@ -110,16 +112,19 @@ public class ConversationItem extends LinearLayout
private @NonNull Set<MessageRecord> batchSelected = new HashSet<>(); private @NonNull Set<MessageRecord> batchSelected = new HashSet<>();
private @Nullable Recipients conversationRecipients; private @Nullable Recipients conversationRecipients;
private @NonNull ThumbnailView mediaThumbnail; private @NonNull ThumbnailView mediaThumbnail;
private @NonNull AudioView audioView; private @NonNull Stub<AudioView> audioViewStub;
private @NonNull Button mmsDownloadButton; private @NonNull Button mmsDownloadButton;
private @NonNull TextView mmsDownloadingLabel; private @NonNull TextView mmsDownloadingLabel;
private @NonNull ExpirationTimerView expirationTimer; private @NonNull ExpirationTimerView expirationTimer;
private int defaultBubbleColor; private int defaultBubbleColor;
private final MmsDownloadClickListener mmsDownloadClickListener = new MmsDownloadClickListener(); private final MmsDownloadClickListener mmsDownloadClickListener = new MmsDownloadClickListener();
private final MmsPreferencesClickListener mmsPreferencesClickListener = new MmsPreferencesClickListener(); private final MmsPreferencesClickListener mmsPreferencesClickListener = new MmsPreferencesClickListener();
private final Context context; private final PassthroughClickListener passthroughClickListener = new PassthroughClickListener();
private final AttachmentDownloadClickListener downloadClickListener = new AttachmentDownloadClickListener();
private final Context context;
public ConversationItem(Context context) { public ConversationItem(Context context) {
this(context, null); this(context, null);
@ -154,20 +159,17 @@ public class ConversationItem extends LinearLayout
this.contactPhoto = (AvatarImageView) findViewById(R.id.contact_photo); this.contactPhoto = (AvatarImageView) findViewById(R.id.contact_photo);
this.bodyBubble = findViewById(R.id.body_bubble); this.bodyBubble = findViewById(R.id.body_bubble);
this.mediaThumbnail = (ThumbnailView) findViewById(R.id.image_view); this.mediaThumbnail = (ThumbnailView) findViewById(R.id.image_view);
this.audioView = (AudioView) findViewById(R.id.audio_view); this.audioViewStub = new Stub<>((ViewStub) findViewById(R.id.audio_view_stub));
this.expirationTimer = (ExpirationTimerView) findViewById(R.id.expiration_indicator); this.expirationTimer = (ExpirationTimerView) findViewById(R.id.expiration_indicator);
setOnClickListener(new ClickListener(null)); setOnClickListener(new ClickListener(null));
PassthroughClickListener passthroughClickListener = new PassthroughClickListener();
AttachmentDownloadClickListener downloadClickListener = new AttachmentDownloadClickListener();
mmsDownloadButton.setOnClickListener(mmsDownloadClickListener); mmsDownloadButton.setOnClickListener(mmsDownloadClickListener);
mediaThumbnail.setThumbnailClickListener(new ThumbnailClickListener()); mediaThumbnail.setThumbnailClickListener(new ThumbnailClickListener());
mediaThumbnail.setDownloadClickListener(downloadClickListener); mediaThumbnail.setDownloadClickListener(downloadClickListener);
mediaThumbnail.setOnLongClickListener(passthroughClickListener); mediaThumbnail.setOnLongClickListener(passthroughClickListener);
mediaThumbnail.setOnClickListener(passthroughClickListener); mediaThumbnail.setOnClickListener(passthroughClickListener);
audioView.setDownloadClickListener(downloadClickListener);
audioView.setOnLongClickListener(passthroughClickListener);
bodyText.setOnLongClickListener(passthroughClickListener); bodyText.setOnLongClickListener(passthroughClickListener);
bodyText.setOnClickListener(passthroughClickListener); bodyText.setOnClickListener(passthroughClickListener);
} }
@ -192,12 +194,12 @@ public class ConversationItem extends LinearLayout
setInteractionState(messageRecord); setInteractionState(messageRecord);
setBodyText(messageRecord); setBodyText(messageRecord);
setMediaAttributes(messageRecord);
setBubbleState(messageRecord, recipient); setBubbleState(messageRecord, recipient);
setStatusIcons(messageRecord); setStatusIcons(messageRecord);
setContactPhoto(recipient); setContactPhoto(recipient);
setGroupMessageStatus(messageRecord, recipient); setGroupMessageStatus(messageRecord, recipient);
setMinimumWidth(); setMinimumWidth();
setMediaAttributes(messageRecord);
setSimInfo(messageRecord); setSimInfo(messageRecord);
setExpiration(messageRecord); setExpiration(messageRecord);
} }
@ -237,18 +239,20 @@ public class ConversationItem extends LinearLayout
mediaThumbnail.setBackgroundColorHint(color); mediaThumbnail.setBackgroundColorHint(color);
} }
setAudioViewTint(messageRecord, conversationRecipients); if (audioViewStub.resolved()) {
setAudioViewTint(messageRecord, conversationRecipients);
}
} }
private void setAudioViewTint(MessageRecord messageRecord, Recipients recipients) { private void setAudioViewTint(MessageRecord messageRecord, Recipients recipients) {
if (messageRecord.isOutgoing()) { if (messageRecord.isOutgoing()) {
if (DynamicTheme.LIGHT.equals(TextSecurePreferences.getTheme(context))) { if (DynamicTheme.LIGHT.equals(TextSecurePreferences.getTheme(context))) {
audioView.setTint(recipients.getColor().toConversationColor(context), defaultBubbleColor); audioViewStub.get().setTint(recipients.getColor().toConversationColor(context), defaultBubbleColor);
} else { } else {
audioView.setTint(Color.WHITE, defaultBubbleColor); audioViewStub.get().setTint(Color.WHITE, defaultBubbleColor);
} }
} else { } else {
audioView.setTint(Color.WHITE, recipients.getColor().toConversationColor(context)); audioViewStub.get().setTint(Color.WHITE, recipients.getColor().toConversationColor(context));
} }
} }
@ -293,20 +297,23 @@ public class ConversationItem extends LinearLayout
if (messageRecord.isMmsNotification()) { if (messageRecord.isMmsNotification()) {
mediaThumbnail.setVisibility(View.GONE); mediaThumbnail.setVisibility(View.GONE);
audioView.setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
setNotificationMmsAttributes((NotificationMmsMessageRecord) messageRecord); setNotificationMmsAttributes((NotificationMmsMessageRecord) messageRecord);
} else if (hasAudio(messageRecord)) { } else if (hasAudio(messageRecord)) {
audioView.setVisibility(View.VISIBLE); audioViewStub.get().setVisibility(View.VISIBLE);
mediaThumbnail.setVisibility(View.GONE); mediaThumbnail.setVisibility(View.GONE);
//noinspection ConstantConditions //noinspection ConstantConditions
audioView.setAudio(masterSecret, ((MediaMmsMessageRecord) messageRecord).getSlideDeck().getAudioSlide(), showControls); audioViewStub.get().setAudio(masterSecret, ((MediaMmsMessageRecord) messageRecord).getSlideDeck().getAudioSlide(), showControls);
audioViewStub.get().setDownloadClickListener(downloadClickListener);
audioViewStub.get().setOnLongClickListener(passthroughClickListener);
bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
} else if (hasThumbnail(messageRecord)) { } else if (hasThumbnail(messageRecord)) {
mediaThumbnail.setVisibility(View.VISIBLE); mediaThumbnail.setVisibility(View.VISIBLE);
audioView.setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
//noinspection ConstantConditions //noinspection ConstantConditions
mediaThumbnail.setImageResource(masterSecret, mediaThumbnail.setImageResource(masterSecret,
@ -315,7 +322,7 @@ public class ConversationItem extends LinearLayout
bodyText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); bodyText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
} else { } else {
mediaThumbnail.setVisibility(View.GONE); mediaThumbnail.setVisibility(View.GONE);
audioView.setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); bodyText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
} }
} }

@ -1,20 +1,22 @@
package org.thoughtcrime.securesms.util.views; package org.thoughtcrime.securesms.util.views;
import android.support.annotation.NonNull;
import android.view.ViewStub; import android.view.ViewStub;
public class Stub<T> { public class Stub<T> {
private final ViewStub viewStub; private ViewStub viewStub;
private T view; private T view;
public Stub(ViewStub viewStub) { public Stub(@NonNull ViewStub viewStub) {
this.viewStub = viewStub; this.viewStub = viewStub;
} }
public T get() { public T get() {
if (view == null) { if (view == null) {
view = (T)viewStub.inflate(); view = (T)viewStub.inflate();
viewStub = null;
} }
return view; return view;

Loading…
Cancel
Save