From 561f7bff69eac50d67144a3ea73ef4dcc7aca59c Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 24 Oct 2019 22:37:30 +0200 Subject: [PATCH] Move some chat and conversation info to ImageView Signed-off-by: Mario Danic --- .../talk/controllers/ChatController.kt | 61 ++++++++--------- .../controllers/ConversationInfoController.kt | 66 +++++++++---------- .../ConversationsListView.kt | 1 - .../layout/controller_conversation_info.xml | 4 +- 4 files changed, 63 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 81ef833f4..a490b68ef 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -23,9 +23,9 @@ package com.nextcloud.talk.controllers import android.content.Context import android.content.Intent import android.content.res.Resources -import android.graphics.Bitmap import android.graphics.PorterDuff import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler import android.os.Parcelable @@ -45,7 +45,6 @@ import android.widget.ImageButton import android.widget.ProgressBar import android.widget.RelativeLayout import android.widget.TextView -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.emoji.text.EmojiCompat import androidx.emoji.widget.EmojiEditText import androidx.recyclerview.widget.LinearLayoutManager @@ -53,15 +52,12 @@ import androidx.recyclerview.widget.RecyclerView import autodagger.AutoInjector import butterknife.BindView import butterknife.OnClick +import coil.target.Target +import coil.transform.CircleCropTransformation import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler -import com.facebook.common.executors.UiThreadImmediateExecutorService -import com.facebook.common.references.CloseableReference -import com.facebook.datasource.DataSource import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber -import com.facebook.imagepipeline.image.CloseableImage import com.nextcloud.talk.R import com.nextcloud.talk.activities.MagicCallActivity import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder @@ -84,6 +80,7 @@ import com.nextcloud.talk.models.json.conversations.RoomOverall import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.mention.Mention +import com.nextcloud.talk.newarch.utils.Images import com.nextcloud.talk.presenters.MentionAutocompletePresenter import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ConductorRemapping @@ -115,6 +112,7 @@ import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.koin.android.ext.android.inject import org.parceler.Parcels import retrofit2.HttpException import retrofit2.Response @@ -194,6 +192,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter var lobbyTimerHandler: Handler? = null val roomJoined: Boolean = false + val imageLoader: coil.ImageLoader by inject() + init { setHasOptionsMenu(true) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) @@ -320,28 +320,25 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter ) .toInt() - val imageRequest = DisplayUtils.getImageRequestForUrl( - ApiUtils.getUrlForAvatarWithNameAndPixels( - conversationUser?.baseUrl, - currentConversation?.name, avatarSize / 2 - ), null - ) - - val imagePipeline = Fresco.getImagePipeline() - val dataSource = imagePipeline.fetchDecodedImage(imageRequest, null) - - dataSource.subscribe(object : BaseBitmapDataSubscriber() { - override fun onNewResultImpl(bitmap: Bitmap?) { - if (actionBar != null && bitmap != null && resources != null) { - val roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(resources!!, bitmap) - roundedBitmapDrawable.isCircular = true - roundedBitmapDrawable.setAntiAlias(true) - actionBar?.setIcon(roundedBitmapDrawable) + avatarSize.let { + val target = object : Target { + override fun onSuccess(result: Drawable) { + super.onSuccess(result) + actionBar?.setIcon(result) } } - override fun onFailureImpl(dataSource: DataSource>) {} - }, UiThreadImmediateExecutorService.getInstance()) + // change lifecycle owner once we move to MVVM + val avatarRequest = Images().getRequestForUrl( + imageLoader, context, ApiUtils.getUrlForAvatarWithNameAndPixels( + conversationUser?.baseUrl, + currentConversation?.name, avatarSize / 2 + ), conversationUser!!, target, null, + CircleCropTransformation() + ); + + imageLoader.load(avatarRequest) + } } } @@ -537,7 +534,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter private fun checkReadOnlyState() { if (currentConversation != null && conversationUser != null) { - if (currentConversation?.shouldShowLobby(conversationUser + if (currentConversation?.shouldShowLobby( + conversationUser ) == true || currentConversation?.conversationReadOnlyState != null && currentConversation?.conversationReadOnlyState == Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY ) { @@ -566,7 +564,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter } private fun checkLobbyState() { - if (currentConversation != null && conversationUser != null && currentConversation?.isLobbyViewApplicable(conversationUser + if (currentConversation != null && conversationUser != null && currentConversation?.isLobbyViewApplicable( + conversationUser ) == true ) { @@ -1033,7 +1032,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter } if (currentConversation != null && conversationUser != null && currentConversation!! - .shouldShowLobby(conversationUser)) { + .shouldShowLobby(conversationUser) + ) { return } @@ -1484,7 +1484,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter conversationIntent.putExtras(bundle) if (roomOverall != null && roomOverall.ocs != null && roomOverall.ocs.data != - null && roomOverall.ocs.data.token != null) { + null && roomOverall.ocs.data.token != null + ) { ConductorRemapping.remapChatController( router, conversationUser.id, roomOverall.ocs.data.token!!, bundle, false diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index 9160f013b..1af4092ce 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -29,6 +29,7 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView import androidx.appcompat.widget.SwitchCompat @@ -40,14 +41,14 @@ import androidx.work.WorkManager import autodagger.AutoInjector import butterknife.BindView import butterknife.OnClick +import coil.api.load +import coil.transform.CircleCropTransformation import com.afollestad.materialdialogs.LayoutMode.WRAP_CONTENT import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.datetime.dateTimePicker import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.view.SimpleDraweeView import com.nextcloud.talk.R import com.nextcloud.talk.R.string import com.nextcloud.talk.adapters.items.UserItem @@ -63,7 +64,10 @@ import com.nextcloud.talk.jobs.LeaveConversationWorker import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType +import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.GROUP_CONVERSATION +import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.ONE_TO_ONE_CONVERSATION import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.PUBLIC_CONVERSATION +import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.SYSTEM_CONVERSATION import com.nextcloud.talk.models.json.conversations.RoomOverall import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter import com.nextcloud.talk.models.json.generic.GenericOverall @@ -134,7 +138,7 @@ class ConversationInfoController(args: Bundle) : BaseController(), @BindView(R.id.start_time_preferences) lateinit var startTimeView: MaterialStandardPreference @BindView(R.id.avatar_image) - lateinit var conversationAvatarImageView: SimpleDraweeView + lateinit var conversationAvatarImageView: ImageView @BindView(R.id.display_name_text) lateinit var conversationDisplayName: EmojiTextView @BindView(R.id.participants_list_category) @@ -254,7 +258,7 @@ class ConversationInfoController(args: Bundle) : BaseController(), private fun setupWebinaryView() { if (conversationUser!!.hasSpreedFeatureCapability("webinary-lobby") && (conversation!!.type == Conversation.ConversationType.GROUP_CONVERSATION || conversation!!.type == - Conversation.ConversationType.PUBLIC_CONVERSATION) && conversation!!.canModerate( + PUBLIC_CONVERSATION) && conversation!!.canModerate( conversationUser ) ) { @@ -827,45 +831,35 @@ class ConversationInfoController(args: Bundle) : BaseController(), private fun loadConversationAvatar() { when (conversation!!.type) { - Conversation.ConversationType.ONE_TO_ONE_CONVERSATION -> if (!TextUtils.isEmpty + ONE_TO_ONE_CONVERSATION -> if (!TextUtils.isEmpty (conversation!!.name) ) { - val draweeController = Fresco.newDraweeControllerBuilder() - .setOldController(conversationAvatarImageView.controller) - .setAutoPlayAnimations(true) - .setImageRequest( - DisplayUtils.getImageRequestForUrl( - ApiUtils.getUrlForAvatarWithName( - conversationUser!!.baseUrl, - conversation!!.name, R.dimen.avatar_size_big - ), null - ) - ) - .build() - conversationAvatarImageView.controller = draweeController + conversationAvatarImageView.load(ApiUtils.getUrlForAvatarWithName( + conversationUser!!.baseUrl, + conversation!!.name, R.dimen.avatar_size_big + )) { + transformations(CircleCropTransformation()) + } } - Conversation.ConversationType.GROUP_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage( - DisplayUtils - .getRoundedBitmapDrawableFromVectorDrawableResource( - resources, - R.drawable.ic_people_group_white_24px - ) - ) - Conversation.ConversationType.PUBLIC_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage( - DisplayUtils - .getRoundedBitmapDrawableFromVectorDrawableResource( - resources, - R.drawable.ic_link_white_24px - ) - ) - Conversation.ConversationType.SYSTEM_CONVERSATION -> { + GROUP_CONVERSATION -> { + conversationAvatarImageView.load(R.drawable.ic_people_group_white_24px) { + transformations(CircleCropTransformation()) + } + } + PUBLIC_CONVERSATION -> { + conversationAvatarImageView.load(R.drawable.ic_link_white_24px) { + transformations(CircleCropTransformation()) + } + } + + SYSTEM_CONVERSATION -> { val layers = arrayOfNulls(2) layers[0] = context.getDrawable(R.drawable.ic_launcher_background) layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground) val layerDrawable = LayerDrawable(layers) - conversationAvatarImageView.hierarchy.setPlaceholderImage( - DisplayUtils.getRoundedDrawable(layerDrawable) - ) + conversationAvatarImageView.load(layerDrawable) { + transformations(CircleCropTransformation()) + } } else -> { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index a3e330d13..dd64cbdf1 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -72,7 +72,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemClickListener import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemLongClickListener import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager import eu.davidea.flexibleadapter.items.IFlexible -import kotlinx.android.synthetic.main.controller_conversations_rv.view.* import kotlinx.android.synthetic.main.controller_conversations_rv.view.dataStateView import kotlinx.android.synthetic.main.controller_conversations_rv.view.floatingActionButton import kotlinx.android.synthetic.main.controller_conversations_rv.view.recyclerView diff --git a/app/src/main/res/layout/controller_conversation_info.xml b/app/src/main/res/layout/controller_conversation_info.xml index 0578f7f50..df93d1c9c 100644 --- a/app/src/main/res/layout/controller_conversation_info.xml +++ b/app/src/main/res/layout/controller_conversation_info.xml @@ -65,12 +65,12 @@ android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/margin_between_elements" /> - + />