Move some chat and conversation info to ImageView

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-10-24 22:37:30 +02:00
parent 124c2951d9
commit 561f7bff69
4 changed files with 63 additions and 69 deletions

View File

@ -23,9 +23,9 @@ package com.nextcloud.talk.controllers
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Parcelable import android.os.Parcelable
@ -45,7 +45,6 @@ import android.widget.ImageButton
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.TextView import android.widget.TextView
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
import androidx.emoji.text.EmojiCompat import androidx.emoji.text.EmojiCompat
import androidx.emoji.widget.EmojiEditText import androidx.emoji.widget.EmojiEditText
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -53,15 +52,12 @@ import androidx.recyclerview.widget.RecyclerView
import autodagger.AutoInjector import autodagger.AutoInjector
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import coil.target.Target
import coil.transform.CircleCropTransformation
import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler 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.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.R
import com.nextcloud.talk.activities.MagicCallActivity import com.nextcloud.talk.activities.MagicCallActivity
import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder 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.conversations.RoomsOverall
import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.generic.GenericOverall
import com.nextcloud.talk.models.json.mention.Mention 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.presenters.MentionAutocompletePresenter
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.ConductorRemapping
@ -115,6 +112,7 @@ import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
import org.koin.android.ext.android.inject
import org.parceler.Parcels import org.parceler.Parcels
import retrofit2.HttpException import retrofit2.HttpException
import retrofit2.Response import retrofit2.Response
@ -194,6 +192,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
var lobbyTimerHandler: Handler? = null var lobbyTimerHandler: Handler? = null
val roomJoined: Boolean = false val roomJoined: Boolean = false
val imageLoader: coil.ImageLoader by inject()
init { init {
setHasOptionsMenu(true) setHasOptionsMenu(true)
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@ -320,29 +320,26 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
) )
.toInt() .toInt()
val imageRequest = DisplayUtils.getImageRequestForUrl( avatarSize.let {
ApiUtils.getUrlForAvatarWithNameAndPixels( val target = object : Target {
override fun onSuccess(result: Drawable) {
super.onSuccess(result)
actionBar?.setIcon(result)
}
}
// change lifecycle owner once we move to MVVM
val avatarRequest = Images().getRequestForUrl(
imageLoader, context, ApiUtils.getUrlForAvatarWithNameAndPixels(
conversationUser?.baseUrl, conversationUser?.baseUrl,
currentConversation?.name, avatarSize / 2 currentConversation?.name, avatarSize / 2
), null ), conversationUser!!, target, null,
) CircleCropTransformation()
);
val imagePipeline = Fresco.getImagePipeline() imageLoader.load(avatarRequest)
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)
} }
} }
override fun onFailureImpl(dataSource: DataSource<CloseableReference<CloseableImage>>) {}
}, UiThreadImmediateExecutorService.getInstance())
}
} }
override fun onViewBound(view: View) { override fun onViewBound(view: View) {
@ -537,7 +534,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
private fun checkReadOnlyState() { private fun checkReadOnlyState() {
if (currentConversation != null && conversationUser != null) { if (currentConversation != null && conversationUser != null) {
if (currentConversation?.shouldShowLobby(conversationUser if (currentConversation?.shouldShowLobby(
conversationUser
) == true || currentConversation?.conversationReadOnlyState != null && currentConversation?.conversationReadOnlyState == Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY ) == true || currentConversation?.conversationReadOnlyState != null && currentConversation?.conversationReadOnlyState == Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY
) { ) {
@ -566,7 +564,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
} }
private fun checkLobbyState() { private fun checkLobbyState() {
if (currentConversation != null && conversationUser != null && currentConversation?.isLobbyViewApplicable(conversationUser if (currentConversation != null && conversationUser != null && currentConversation?.isLobbyViewApplicable(
conversationUser
) == true ) == true
) { ) {
@ -1033,7 +1032,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
} }
if (currentConversation != null && conversationUser != null && currentConversation!! if (currentConversation != null && conversationUser != null && currentConversation!!
.shouldShowLobby(conversationUser)) { .shouldShowLobby(conversationUser)
) {
return return
} }
@ -1484,7 +1484,8 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
conversationIntent.putExtras(bundle) conversationIntent.putExtras(bundle)
if (roomOverall != null && roomOverall.ocs != null && roomOverall.ocs.data != if (roomOverall != null && roomOverall.ocs != null && roomOverall.ocs.data !=
null && roomOverall.ocs.data.token != null) { null && roomOverall.ocs.data.token != null
) {
ConductorRemapping.remapChatController( ConductorRemapping.remapChatController(
router, conversationUser.id, router, conversationUser.id,
roomOverall.ocs.data.token!!, bundle, false roomOverall.ocs.data.token!!, bundle, false

View File

@ -29,6 +29,7 @@ import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
@ -40,14 +41,14 @@ import androidx.work.WorkManager
import autodagger.AutoInjector import autodagger.AutoInjector
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import coil.api.load
import coil.transform.CircleCropTransformation
import com.afollestad.materialdialogs.LayoutMode.WRAP_CONTENT import com.afollestad.materialdialogs.LayoutMode.WRAP_CONTENT
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.datetime.dateTimePicker import com.afollestad.materialdialogs.datetime.dateTimePicker
import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler 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
import com.nextcloud.talk.R.string import com.nextcloud.talk.R.string
import com.nextcloud.talk.adapters.items.UserItem 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.database.UserEntity
import com.nextcloud.talk.models.json.conversations.Conversation 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
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.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.conversations.RoomOverall
import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter
import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.generic.GenericOverall
@ -134,7 +138,7 @@ class ConversationInfoController(args: Bundle) : BaseController(),
@BindView(R.id.start_time_preferences) @BindView(R.id.start_time_preferences)
lateinit var startTimeView: MaterialStandardPreference lateinit var startTimeView: MaterialStandardPreference
@BindView(R.id.avatar_image) @BindView(R.id.avatar_image)
lateinit var conversationAvatarImageView: SimpleDraweeView lateinit var conversationAvatarImageView: ImageView
@BindView(R.id.display_name_text) @BindView(R.id.display_name_text)
lateinit var conversationDisplayName: EmojiTextView lateinit var conversationDisplayName: EmojiTextView
@BindView(R.id.participants_list_category) @BindView(R.id.participants_list_category)
@ -254,7 +258,7 @@ class ConversationInfoController(args: Bundle) : BaseController(),
private fun setupWebinaryView() { private fun setupWebinaryView() {
if (conversationUser!!.hasSpreedFeatureCapability("webinary-lobby") && (conversation!!.type if (conversationUser!!.hasSpreedFeatureCapability("webinary-lobby") && (conversation!!.type
== Conversation.ConversationType.GROUP_CONVERSATION || conversation!!.type == == Conversation.ConversationType.GROUP_CONVERSATION || conversation!!.type ==
Conversation.ConversationType.PUBLIC_CONVERSATION) && conversation!!.canModerate( PUBLIC_CONVERSATION) && conversation!!.canModerate(
conversationUser conversationUser
) )
) { ) {
@ -827,45 +831,35 @@ class ConversationInfoController(args: Bundle) : BaseController(),
private fun loadConversationAvatar() { private fun loadConversationAvatar() {
when (conversation!!.type) { when (conversation!!.type) {
Conversation.ConversationType.ONE_TO_ONE_CONVERSATION -> if (!TextUtils.isEmpty ONE_TO_ONE_CONVERSATION -> if (!TextUtils.isEmpty
(conversation!!.name) (conversation!!.name)
) { ) {
val draweeController = Fresco.newDraweeControllerBuilder() conversationAvatarImageView.load(ApiUtils.getUrlForAvatarWithName(
.setOldController(conversationAvatarImageView.controller)
.setAutoPlayAnimations(true)
.setImageRequest(
DisplayUtils.getImageRequestForUrl(
ApiUtils.getUrlForAvatarWithName(
conversationUser!!.baseUrl, conversationUser!!.baseUrl,
conversation!!.name, R.dimen.avatar_size_big conversation!!.name, R.dimen.avatar_size_big
), null )) {
) transformations(CircleCropTransformation())
)
.build()
conversationAvatarImageView.controller = draweeController
} }
Conversation.ConversationType.GROUP_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage( }
DisplayUtils GROUP_CONVERSATION -> {
.getRoundedBitmapDrawableFromVectorDrawableResource( conversationAvatarImageView.load(R.drawable.ic_people_group_white_24px) {
resources, transformations(CircleCropTransformation())
R.drawable.ic_people_group_white_24px }
) }
) PUBLIC_CONVERSATION -> {
Conversation.ConversationType.PUBLIC_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage( conversationAvatarImageView.load(R.drawable.ic_link_white_24px) {
DisplayUtils transformations(CircleCropTransformation())
.getRoundedBitmapDrawableFromVectorDrawableResource( }
resources, }
R.drawable.ic_link_white_24px
) SYSTEM_CONVERSATION -> {
)
Conversation.ConversationType.SYSTEM_CONVERSATION -> {
val layers = arrayOfNulls<Drawable>(2) val layers = arrayOfNulls<Drawable>(2)
layers[0] = context.getDrawable(R.drawable.ic_launcher_background) layers[0] = context.getDrawable(R.drawable.ic_launcher_background)
layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground) layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground)
val layerDrawable = LayerDrawable(layers) val layerDrawable = LayerDrawable(layers)
conversationAvatarImageView.hierarchy.setPlaceholderImage( conversationAvatarImageView.load(layerDrawable) {
DisplayUtils.getRoundedDrawable(layerDrawable) transformations(CircleCropTransformation())
) }
} }
else -> { else -> {

View File

@ -72,7 +72,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemClickListener
import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemLongClickListener import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemLongClickListener
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import eu.davidea.flexibleadapter.items.IFlexible 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.dataStateView
import kotlinx.android.synthetic.main.controller_conversations_rv.view.floatingActionButton import kotlinx.android.synthetic.main.controller_conversations_rv.view.floatingActionButton
import kotlinx.android.synthetic.main.controller_conversations_rv.view.recyclerView import kotlinx.android.synthetic.main.controller_conversations_rv.view.recyclerView

View File

@ -65,12 +65,12 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/margin_between_elements" /> android:layout_marginTop="@dimen/margin_between_elements" />
<com.facebook.drawee.view.SimpleDraweeView <ImageView
android:id="@+id/avatar_image" android:id="@+id/avatar_image"
android:layout_width="@dimen/avatar_size_big" android:layout_width="@dimen/avatar_size_big"
android:layout_height="@dimen/avatar_size_big" android:layout_height="@dimen/avatar_size_big"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
apc:roundAsCircle="true" /> />
</RelativeLayout> </RelativeLayout>
</com.yarolegovich.mp.MaterialPreferenceCategory> </com.yarolegovich.mp.MaterialPreferenceCategory>