diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java index 5b3620f07..6aac3726a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java @@ -1,27 +1,34 @@ package org.thoughtcrime.securesms.components; import android.content.Context; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; +import android.graphics.PorterDuff; import android.util.AttributeSet; import android.view.View; -import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; +import com.annimon.stream.Stream; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; +import org.whispersystems.libsignal.util.Pair; +import java.util.LinkedList; import java.util.List; -public class ConversationTypingView extends LinearLayout { +public class ConversationTypingView extends ConstraintLayout { - private AvatarImageView avatar; + private AvatarImageView avatar1; + private AvatarImageView avatar2; + private AvatarImageView avatar3; private View bubble; private TypingIndicatorView indicator; + private TextView typistCount; public ConversationTypingView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -31,9 +38,12 @@ public class ConversationTypingView extends LinearLayout { protected void onFinishInflate() { super.onFinishInflate(); - avatar = findViewById(R.id.typing_avatar); - bubble = findViewById(R.id.typing_bubble); - indicator = findViewById(R.id.typing_indicator); + avatar1 = findViewById(R.id.typing_avatar_1); + avatar2 = findViewById(R.id.typing_avatar_2); + avatar3 = findViewById(R.id.typing_avatar_3); + typistCount = findViewById(R.id.typing_count); + bubble = findViewById(R.id.typing_bubble); + indicator = findViewById(R.id.typing_indicator); } public void setTypists(@NonNull GlideRequests glideRequests, @NonNull List typists, boolean isGroupThread, boolean hasWallpaper) { @@ -42,21 +52,44 @@ public class ConversationTypingView extends LinearLayout { return; } - Recipient typist = typists.get(0); + avatar1.setVisibility(GONE); + avatar2.setVisibility(GONE); + avatar3.setVisibility(GONE); + typistCount.setVisibility(GONE); if (isGroupThread) { - avatar.setAvatar(glideRequests, typist, true); - avatar.setVisibility(VISIBLE); - } else { - avatar.setVisibility(GONE); + presentGroupThreadAvatars(glideRequests, typists); } if (hasWallpaper) { bubble.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.conversation_item_wallpaper_bubble_color)); + typistCount.getBackground().setColorFilter(ContextCompat.getColor(getContext(), R.color.conversation_item_wallpaper_bubble_color), PorterDuff.Mode.SRC_IN); } else { bubble.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.signal_background_secondary)); + typistCount.getBackground().setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_background_secondary), PorterDuff.Mode.SRC_IN); } indicator.startAnimation(); } + + private void presentGroupThreadAvatars(@NonNull GlideRequests glideRequests, @NonNull List typists) { + avatar1.setAvatar(glideRequests, typists.get(0), typists.size() == 1); + avatar1.setVisibility(VISIBLE); + + if (typists.size() > 1) { + avatar2.setAvatar(glideRequests, typists.get(1), false); + avatar2.setVisibility(VISIBLE); + } + + if (typists.size() == 3) { + avatar3.setAvatar(glideRequests, typists.get(2), false); + avatar3.setVisibility(VISIBLE); + } + + if (typists.size() > 3) { + typistCount.setText(getResources().getString(R.string.ConversationTypingView__plus_d, typists.size() - 2)); + typistCount.setVisibility(VISIBLE); + } + } } + diff --git a/app/src/main/res/drawable/tintable_pill_bg.xml b/app/src/main/res/drawable/tintable_pill_bg.xml new file mode 100644 index 000000000..74a00141e --- /dev/null +++ b/app/src/main/res/drawable/tintable_pill_bg.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/conversation_typing_view.xml b/app/src/main/res/layout/conversation_typing_view.xml index a7096355a..472839b9c 100644 --- a/app/src/main/res/layout/conversation_typing_view.xml +++ b/app/src/main/res/layout/conversation_typing_view.xml @@ -2,25 +2,86 @@ + android:paddingEnd="8dp"> + android:cropToPadding="true" + android:foreground="@drawable/contact_photo_background" + android:visibility="gone" + app:fallbackImageSize="small" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:visibility="visible" /> + + + + + + + + + app:contentPadding="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/typist_barrier" + app:layout_constraintTop_toTopOf="parent"> + android:layout_margin="12dp" + app:typingIndicator_tint="@color/signal_inverse_primary" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57eba691d..697b87cbc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -377,6 +377,9 @@ Verified You + + +%1$d + Some contacts cannot be in legacy groups.