Use avatars from server (depending on light/dark mode)

Placeholder avatars now also come from the server. This means themed avatars from the android app itself are no longer used here. The static placeholder icons defined in loadConversationAvatar are only used when the http request fails completely.

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2023-04-20 11:49:29 +02:00
parent ad15bca8ec
commit ed4fa3690d
No known key found for this signature in database
GPG key ID: C793F8B59F43CE7B
5 changed files with 22 additions and 23 deletions

View file

@ -42,8 +42,6 @@ import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.RvItemConversationWithLastMessageBinding import com.nextcloud.talk.databinding.RvItemConversationWithLastMessageBinding
import com.nextcloud.talk.extensions.loadAvatar import com.nextcloud.talk.extensions.loadAvatar
import com.nextcloud.talk.extensions.loadConversationAvatar import com.nextcloud.talk.extensions.loadConversationAvatar
import com.nextcloud.talk.extensions.loadDefaultGroupCallAvatar
import com.nextcloud.talk.extensions.loadDefaultPublicCallAvatar
import com.nextcloud.talk.extensions.loadSystemAvatar import com.nextcloud.talk.extensions.loadSystemAvatar
import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatMessage
import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.Conversation
@ -178,15 +176,9 @@ class ConversationItem(
} }
} }
ConversationType.ROOM_GROUP_CALL -> ConversationType.ROOM_GROUP_CALL, ConversationType.FORMER_ONE_TO_ONE, ConversationType.ROOM_PUBLIC_CALL ->
holder.binding.dialogAvatar.loadConversationAvatar(user, model) holder.binding.dialogAvatar.loadConversationAvatar(user, model)
ConversationType.FORMER_ONE_TO_ONE ->
holder.binding.dialogAvatar.loadDefaultGroupCallAvatar(viewThemeUtils)
ConversationType.ROOM_PUBLIC_CALL ->
holder.binding.dialogAvatar.loadDefaultPublicCallAvatar(viewThemeUtils)
else -> holder.binding.dialogAvatar.visibility = View.GONE else -> holder.binding.dialogAvatar.visibility = View.GONE
} }
} }

View file

@ -61,8 +61,7 @@ import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ControllerConversationInfoBinding import com.nextcloud.talk.databinding.ControllerConversationInfoBinding
import com.nextcloud.talk.events.EventStatus import com.nextcloud.talk.events.EventStatus
import com.nextcloud.talk.extensions.loadAvatar import com.nextcloud.talk.extensions.loadAvatar
import com.nextcloud.talk.extensions.loadDefaultGroupCallAvatar import com.nextcloud.talk.extensions.loadConversationAvatar
import com.nextcloud.talk.extensions.loadDefaultPublicCallAvatar
import com.nextcloud.talk.extensions.loadSystemAvatar import com.nextcloud.talk.extensions.loadSystemAvatar
import com.nextcloud.talk.jobs.DeleteConversationWorker import com.nextcloud.talk.jobs.DeleteConversationWorker
import com.nextcloud.talk.jobs.LeaveConversationWorker import com.nextcloud.talk.jobs.LeaveConversationWorker
@ -760,16 +759,13 @@ class ConversationInfoActivity :
private fun loadConversationAvatar() { private fun loadConversationAvatar() {
when (conversation!!.type) { when (conversation!!.type) {
Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL -> if (!TextUtils.isEmpty(conversation!!.name)) { Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL -> if (!TextUtils.isEmpty(conversation!!.name)) {
conversation!!.name?.let { binding?.avatarImage?.loadAvatar(conversationUser!!, it) } conversation!!.name?.let { binding.avatarImage.loadAvatar(conversationUser, it) }
} }
Conversation.ConversationType.ROOM_GROUP_CALL -> { Conversation.ConversationType.ROOM_GROUP_CALL, Conversation.ConversationType.ROOM_PUBLIC_CALL -> {
binding?.avatarImage?.loadDefaultGroupCallAvatar(viewThemeUtils) binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!)
}
Conversation.ConversationType.ROOM_PUBLIC_CALL -> {
binding?.avatarImage?.loadDefaultPublicCallAvatar(viewThemeUtils)
} }
Conversation.ConversationType.ROOM_SYSTEM -> { Conversation.ConversationType.ROOM_SYSTEM -> {
binding?.avatarImage?.loadSystemAvatar() binding.avatarImage.loadSystemAvatar()
} }
else -> { else -> {

View file

@ -44,6 +44,7 @@ import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DisplayUtils
private const val ROUNDING_PIXEL = 16f private const val ROUNDING_PIXEL = 16f
private const val TAG = "ImageViewExtensions" private const val TAG = "ImageViewExtensions"
@ -59,9 +60,8 @@ fun ImageView.loadConversationAvatar(
conversation.token conversation.token
) )
// TODO: improve this! using the "old" drawables for now. because the themed drawables are not rounded by // these placeholders are only used when the request fails completely. The server also return default avatars
// themselves and coil is // when no own images are set. (although these default avatars can not be themed for the android app..)
// not able to make placeholders rounded!! https://github.com/coil-kt/coil/issues/37
val placeholder = val placeholder =
when (conversation.type) { when (conversation.type) {
Conversation.ConversationType.ROOM_GROUP_CALL -> Conversation.ConversationType.ROOM_GROUP_CALL ->
@ -125,8 +125,14 @@ private fun ImageView.loadAvatarInternal(
diskCacheKey?.let { diskCache?.remove(it) } diskCacheKey?.let { diskCache?.remove(it) }
} }
val finalUrl = if (DisplayUtils.isDarkModeOn(this.context)) {
"$url/dark"
} else {
url
}
return DisposableWrapper( return DisposableWrapper(
load(url) { load(finalUrl) {
user?.let { user?.let {
addHeader( addHeader(
"Authorization", "Authorization",

View file

@ -108,6 +108,11 @@ public class DisplayUtils {
private static final int DATE_TIME_PARTS_SIZE = 2; private static final int DATE_TIME_PARTS_SIZE = 2;
public static Boolean isDarkModeOn(Context context) {
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
}
public static void setClickableString(String string, String url, TextView textView) { public static void setClickableString(String string, String url, TextView textView) {
SpannableString spannableString = new SpannableString(string); SpannableString spannableString = new SpannableString(string);
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {

View file

@ -21,7 +21,7 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:fillColor="#61000000" android:fillColor="#DBDBDB"
android:fillType="nonZero" android:fillType="nonZero"
android:pathData="M12,20.64C9,20.64 6.348,19.104 4.8,16.8C4.836,14.4 9.6,13.08 12,13.08C14.4,13.08 19.164,14.4 19.2,16.8C17.652,19.104 15,20.64 12,20.64M12,3.6C13.9752,3.6 15.6,5.2248 15.6,7.2C15.6,9.1752 13.9752,10.8 12,10.8C10.0248,10.8 8.4,9.1752 8.4,7.2C8.4,5.2248 10.0248,3.6 12,3.6M12,0C5.4168,0 0,5.4168 0,12C0,18.5832 5.4168,24 12,24C18.5832,24 24,18.5832 24,12C24,5.364 18.6,0 12,0Z" /> android:pathData="M12,20.64C9,20.64 6.348,19.104 4.8,16.8C4.836,14.4 9.6,13.08 12,13.08C14.4,13.08 19.164,14.4 19.2,16.8C17.652,19.104 15,20.64 12,20.64M12,3.6C13.9752,3.6 15.6,5.2248 15.6,7.2C15.6,9.1752 13.9752,10.8 12,10.8C10.0248,10.8 8.4,9.1752 8.4,7.2C8.4,5.2248 10.0248,3.6 12,3.6M12,0C5.4168,0 0,5.4168 0,12C0,18.5832 5.4168,24 12,24C18.5832,24 24,18.5832 24,12C24,5.364 18.6,0 12,0Z" />
</vector> </vector>