diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt index 6d3d5cbcc..9e952d634 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt @@ -184,7 +184,7 @@ class ConversationItem( ConversationType.ROOM_GROUP_CALL, ConversationType.FORMER_ONE_TO_ONE, ConversationType.ROOM_PUBLIC_CALL -> - holder.binding.dialogAvatar.loadConversationAvatar(user, model, false) + holder.binding.dialogAvatar.loadConversationAvatar(user, model, false, viewThemeUtils) else -> holder.binding.dialogAvatar.visibility = View.GONE } diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 644e5aa9d..868dc4d64 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -443,12 +443,22 @@ public interface NcApi { @DELETE Observable deleteAvatar(@Header("Authorization") String authorization, @Url String url); + @DELETE + Observable deleteConversationAvatar(@Header("Authorization") String authorization, @Url String url); + + @Multipart @POST Observable uploadAvatar(@Header("Authorization") String authorization, @Url String url, @Part MultipartBody.Part attachment); + @Multipart + @POST + Observable uploadConversationAvatar(@Header("Authorization") String authorization, + @Url String url, + @Part MultipartBody.Part attachment); + @GET Observable getEditableUserProfileFields(@Header("Authorization") String authorization, @Url String url); diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 721a8d084..4b5502ffc 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -807,7 +807,7 @@ class ConversationInfoActivity : } Conversation.ConversationType.ROOM_GROUP_CALL, Conversation.ConversationType.ROOM_PUBLIC_CALL -> { - binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!, true) + binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!, false, viewThemeUtils) } Conversation.ConversationType.ROOM_SYSTEM -> { diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt index b2bb236a6..7a02bdead 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt @@ -43,6 +43,7 @@ import com.nextcloud.talk.extensions.loadConversationAvatar import com.nextcloud.talk.extensions.loadSystemAvatar import com.nextcloud.talk.extensions.loadUserAvatar import com.nextcloud.talk.models.json.conversations.Conversation +import com.nextcloud.talk.models.json.conversations.RoomOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.repositories.conversations.ConversationsRepository import com.nextcloud.talk.utils.ApiUtils @@ -95,7 +96,7 @@ class ConversationInfoEditActivity : conversationUser = extras?.getParcelable(BundleKeys.KEY_USER_ENTITY)!! conversationToken = extras.getString(BundleKeys.KEY_ROOM_TOKEN)!! - if (intent.hasExtra(BundleKeys.KEY_ACTIVE_CONVERSATION)) { + if (conversation == null && intent.hasExtra(BundleKeys.KEY_ACTIVE_CONVERSATION)) { conversation = Parcels.unwrap(extras.getParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION)) } @@ -290,19 +291,20 @@ class ConversationInfoEditActivity : ) // upload file - ncApi.uploadAvatar( + ncApi.uploadConversationAvatar( credentials, ApiUtils.getUrlForConversationAvatar(1, conversationUser.baseUrl, conversation!!.token), filePart ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Observer { + .subscribe(object : Observer { override fun onSubscribe(d: Disposable) { // unused atm } - override fun onNext(genericOverall: GenericOverall) { + override fun onNext(roomOverall: RoomOverall) { + conversation = roomOverall.ocs!!.data loadConversationAvatar() } @@ -322,18 +324,19 @@ class ConversationInfoEditActivity : } private fun deleteAvatar() { - ncApi.deleteAvatar( + ncApi.deleteConversationAvatar( credentials, ApiUtils.getUrlForConversationAvatar(1, conversationUser.baseUrl, conversationToken) ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Observer { + .subscribe(object : Observer { override fun onSubscribe(d: Disposable) { // unused atm } - override fun onNext(genericOverall: GenericOverall) { + override fun onNext(roomOverall: RoomOverall) { + conversation = roomOverall.ocs!!.data loadConversationAvatar() } @@ -359,7 +362,7 @@ class ConversationInfoEditActivity : } Conversation.ConversationType.ROOM_GROUP_CALL, Conversation.ConversationType.ROOM_PUBLIC_CALL -> { - binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!, true) + binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!, false, viewThemeUtils) } Conversation.ConversationType.ROOM_SYSTEM -> { diff --git a/app/src/main/java/com/nextcloud/talk/extensions/ImageViewExtensions.kt b/app/src/main/java/com/nextcloud/talk/extensions/ImageViewExtensions.kt index 9b9f1be2a..ba550484c 100644 --- a/app/src/main/java/com/nextcloud/talk/extensions/ImageViewExtensions.kt +++ b/app/src/main/java/com/nextcloud/talk/extensions/ImageViewExtensions.kt @@ -55,11 +55,10 @@ private const val TAG = "ImageViewExtensions" fun ImageView.loadConversationAvatar( user: User, conversation: Conversation, - ignoreCache: Boolean + ignoreCache: Boolean, + viewThemeUtils: ViewThemeUtils? ): io.reactivex.disposables .Disposable { - var finalIgnoreCache = ignoreCache - val imageRequestUri = ApiUtils.getUrlForConversationAvatarWithVersion( 1, user.baseUrl, @@ -67,13 +66,21 @@ fun ImageView.loadConversationAvatar( conversation.avatarVersion ) - if (conversation.avatarVersion.isNullOrEmpty()) { - finalIgnoreCache = true + if (conversation.avatarVersion.isNullOrEmpty() && viewThemeUtils != null) { + when (conversation.type) { + Conversation.ConversationType.ROOM_GROUP_CALL -> + return loadDefaultGroupCallAvatar(viewThemeUtils) + + Conversation.ConversationType.ROOM_PUBLIC_CALL -> + return loadDefaultPublicCallAvatar(viewThemeUtils) + + else -> {} + } } // these placeholders are only used when the request fails completely. The server also return default avatars // when no own images are set. (although these default avatars can not be themed for the android app..) - val placeholder = + val errorPlaceholder = when (conversation.type) { Conversation.ConversationType.ROOM_GROUP_CALL -> ContextCompat.getDrawable(context, R.drawable.ic_circular_group) @@ -84,7 +91,7 @@ fun ImageView.loadConversationAvatar( else -> ContextCompat.getDrawable(context, R.drawable.account_circle_96dp) } - return loadAvatarInternal(user, imageRequestUri, finalIgnoreCache, placeholder) + return loadAvatarInternal(user, imageRequestUri, ignoreCache, errorPlaceholder) } fun ImageView.loadUserAvatar( @@ -108,7 +115,7 @@ private fun ImageView.loadAvatarInternal( user: User?, url: String, ignoreCache: Boolean, - placeholder: Drawable? + errorPlaceholder: Drawable? ): io.reactivex.disposables .Disposable { val cachePolicy = if (ignoreCache) { @@ -143,8 +150,8 @@ private fun ImageView.loadAvatarInternal( ) } transformations(CircleCropTransformation()) - error(placeholder ?: ContextCompat.getDrawable(context, R.drawable.account_circle_96dp)) - fallback(placeholder ?: ContextCompat.getDrawable(context, R.drawable.account_circle_96dp)) + error(errorPlaceholder ?: ContextCompat.getDrawable(context, R.drawable.account_circle_96dp)) + fallback(errorPlaceholder ?: ContextCompat.getDrawable(context, R.drawable.account_circle_96dp)) listener(onError = { _, result -> Log.w(TAG, "Can't load avatar with URL: $url", result.throwable) }) @@ -274,6 +281,15 @@ fun ImageView.loadDefaultGroupCallAvatar(viewThemeUtils: ViewThemeUtils): io.rea return loadUserAvatar(data) } +fun ImageView.loadDefaultPublicCallAvatar(viewThemeUtils: ViewThemeUtils): io.reactivex.disposables.Disposable { + val data: Any = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + viewThemeUtils.talk.themePlaceholderAvatar(this, R.drawable.ic_avatar_link) as Any + } else { + R.drawable.ic_circular_link + } + return loadUserAvatar(data) +} + fun ImageView.loadMailAvatar(viewThemeUtils: ViewThemeUtils): io.reactivex.disposables.Disposable { val data: Any = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { viewThemeUtils.talk.themePlaceholderAvatar(this, R.drawable.ic_avatar_mail) as Any diff --git a/app/src/main/res/drawable/ic_avatar_link.xml b/app/src/main/res/drawable/ic_avatar_link.xml new file mode 100644 index 000000000..21e7d94dd --- /dev/null +++ b/app/src/main/res/drawable/ic_avatar_link.xml @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file