Use user avatar or avatar color for bubble on wallpaper fragment.

This commit is contained in:
Alex Hart 2021-06-04 09:50:45 -03:00
parent 4bdd07db16
commit b8f1b98c74
4 changed files with 49 additions and 12 deletions

View file

@ -1,11 +1,7 @@
package org.thoughtcrime.securesms.wallpaper; package org.thoughtcrime.securesms.wallpaper;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -29,6 +25,7 @@ import androidx.navigation.Navigation;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.conversation.colors.ColorizerView; import org.thoughtcrime.securesms.conversation.colors.ColorizerView;
import org.thoughtcrime.securesms.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.DisplayMetricsUtil;
import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.Projection;
@ -52,7 +49,7 @@ public class ChatWallpaperFragment extends Fragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
viewModel = ViewModelProviders.of(requireActivity()).get(ChatWallpaperViewModel.class); viewModel = ViewModelProviders.of(requireActivity()).get(ChatWallpaperViewModel.class);
ImageView portrait = view.findViewById(R.id.chat_wallpaper_preview_top_bar_portrait); AvatarImageView portrait = view.findViewById(R.id.chat_wallpaper_preview_top_bar_portrait);
Toolbar toolbar = view.findViewById(R.id.toolbar); Toolbar toolbar = view.findViewById(R.id.toolbar);
ImageView chatWallpaperPreview = view.findViewById(R.id.chat_wallpaper_preview_background); ImageView chatWallpaperPreview = view.findViewById(R.id.chat_wallpaper_preview_background);
View setWallpaper = view.findViewById(R.id.chat_wallpaper_set_wallpaper); View setWallpaper = view.findViewById(R.id.chat_wallpaper_set_wallpaper);
@ -74,6 +71,9 @@ public class ChatWallpaperFragment extends Fragment {
forceAspectRatioToScreenByAdjustingHeight(chatWallpaperPreview); forceAspectRatioToScreenByAdjustingHeight(chatWallpaperPreview);
viewModel.getWallpaperPreviewPortrait().observe(getViewLifecycleOwner(),
wallpaperPreviewPortrait -> wallpaperPreviewPortrait.applyToAvatarImageView(portrait));
viewModel.getCurrentWallpaper().observe(getViewLifecycleOwner(), wallpaper -> { viewModel.getCurrentWallpaper().observe(getViewLifecycleOwner(), wallpaper -> {
if (wallpaper.isPresent()) { if (wallpaper.isPresent()) {
wallpaper.get().loadInto(chatWallpaperPreview); wallpaper.get().loadInto(chatWallpaperPreview);
@ -187,8 +187,6 @@ public class ChatWallpaperFragment extends Fragment {
Drawable colorCircle = chatColors.asCircle(); Drawable colorCircle = chatColors.asCircle();
colorCircle.setBounds(0, 0, ViewUtil.dpToPx(16), ViewUtil.dpToPx(16)); colorCircle.setBounds(0, 0, ViewUtil.dpToPx(16), ViewUtil.dpToPx(16));
TextViewCompat.setCompoundDrawablesRelative(setChatColor, null, null, colorCircle, null); TextViewCompat.setCompoundDrawablesRelative(setChatColor, null, null, colorCircle, null);
portrait.setImageDrawable(chatColors.asCircle());
}); });
sentBubble.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> viewModel.refreshChatColors()); sentBubble.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> viewModel.refreshChatColors());

View file

@ -10,12 +10,14 @@ import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.conversation.colors.AvatarColor;
import org.thoughtcrime.securesms.conversation.colors.ChatColors; import org.thoughtcrime.securesms.conversation.colors.ChatColors;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.LiveRecipient;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.DefaultValueLiveData;
import org.thoughtcrime.securesms.util.MappingModel; import org.thoughtcrime.securesms.util.MappingModel;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.libsignal.util.guava.Optional;
@ -34,6 +36,7 @@ public class ChatWallpaperViewModel extends ViewModel {
private final RecipientId recipientId; private final RecipientId recipientId;
private final LiveRecipient liveRecipient; private final LiveRecipient liveRecipient;
private final RecipientForeverObserver recipientObserver = r -> refreshChatColors(); private final RecipientForeverObserver recipientObserver = r -> refreshChatColors();
private final LiveData<WallpaperPreviewPortrait> wallpaperPreviewPortrait;
private ChatWallpaperViewModel(@Nullable RecipientId recipientId) { private ChatWallpaperViewModel(@Nullable RecipientId recipientId) {
this.recipientId = recipientId; this.recipientId = recipientId;
@ -46,8 +49,16 @@ public class ChatWallpaperViewModel extends ViewModel {
if (recipientId != null) { if (recipientId != null) {
liveRecipient = Recipient.live(recipientId); liveRecipient = Recipient.live(recipientId);
liveRecipient.observeForever(recipientObserver); liveRecipient.observeForever(recipientObserver);
wallpaperPreviewPortrait = Transformations.map(liveRecipient.getLiveData(), recipient -> {
if (recipient.getContactPhoto() != null) {
return new WallpaperPreviewPortrait.ContactPhoto(recipient);
} else {
return new WallpaperPreviewPortrait.SolidColor(recipient.getAvatarColor());
}
});
} else { } else {
liveRecipient = null; liveRecipient = null;
wallpaperPreviewPortrait = new DefaultValueLiveData<>(new WallpaperPreviewPortrait.SolidColor(AvatarColor.ULTRAMARINE));
} }
} }
@ -122,6 +133,10 @@ public class ChatWallpaperViewModel extends ViewModel {
return chatColors; return chatColors;
} }
@NonNull LiveData<WallpaperPreviewPortrait> getWallpaperPreviewPortrait() {
return wallpaperPreviewPortrait;
}
@NonNull LiveData<List<MappingModel<?>>> getWallpapers() { @NonNull LiveData<List<MappingModel<?>>> getWallpapers() {
return LiveDataUtil.combineLatest(builtins, dimInDarkTheme, (wallpapers, dimInDarkMode) -> return LiveDataUtil.combineLatest(builtins, dimInDarkTheme, (wallpapers, dimInDarkMode) ->
Stream.of(wallpapers) Stream.of(wallpapers)

View file

@ -0,0 +1,24 @@
package org.thoughtcrime.securesms.wallpaper
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.AvatarImageView
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
import org.thoughtcrime.securesms.recipients.Recipient
sealed class WallpaperPreviewPortrait {
class ContactPhoto(private val recipient: Recipient) : WallpaperPreviewPortrait() {
override fun applyToAvatarImageView(avatarImageView: AvatarImageView) {
avatarImageView.setAvatar(recipient)
avatarImageView.colorFilter = null
}
}
class SolidColor(private val avatarColor: AvatarColor) : WallpaperPreviewPortrait() {
override fun applyToAvatarImageView(avatarImageView: AvatarImageView) {
avatarImageView.setImageResource(R.drawable.circle_tintable)
avatarImageView.setColorFilter(avatarColor.colorInt())
}
}
abstract fun applyToAvatarImageView(avatarImageView: AvatarImageView)
}

View file

@ -83,7 +83,7 @@
app:srcCompat="@drawable/ic_arrow_left_24" app:srcCompat="@drawable/ic_arrow_left_24"
app:tint="@color/core_white" /> app:tint="@color/core_white" />
<androidx.appcompat.widget.AppCompatImageView <org.thoughtcrime.securesms.components.AvatarImageView
android:id="@+id/chat_wallpaper_preview_top_bar_portrait" android:id="@+id/chat_wallpaper_preview_top_bar_portrait"
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"