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.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<CloseableReference<CloseableImage>>) {}
}, 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

View File

@ -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<Drawable>(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 -> {

View File

@ -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

View File

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