mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-23 04:35:01 +01:00
Move some chat and conversation info to ImageView
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
124c2951d9
commit
561f7bff69
@ -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,28 +320,25 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
|
|||||||
)
|
)
|
||||||
.toInt()
|
.toInt()
|
||||||
|
|
||||||
val imageRequest = DisplayUtils.getImageRequestForUrl(
|
avatarSize.let {
|
||||||
ApiUtils.getUrlForAvatarWithNameAndPixels(
|
val target = object : Target {
|
||||||
conversationUser?.baseUrl,
|
override fun onSuccess(result: Drawable) {
|
||||||
currentConversation?.name, avatarSize / 2
|
super.onSuccess(result)
|
||||||
), null
|
actionBar?.setIcon(result)
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailureImpl(dataSource: DataSource<CloseableReference<CloseableImage>>) {}
|
// change lifecycle owner once we move to MVVM
|
||||||
}, UiThreadImmediateExecutorService.getInstance())
|
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() {
|
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
|
||||||
|
@ -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)
|
conversationUser!!.baseUrl,
|
||||||
.setAutoPlayAnimations(true)
|
conversation!!.name, R.dimen.avatar_size_big
|
||||||
.setImageRequest(
|
)) {
|
||||||
DisplayUtils.getImageRequestForUrl(
|
transformations(CircleCropTransformation())
|
||||||
ApiUtils.getUrlForAvatarWithName(
|
}
|
||||||
conversationUser!!.baseUrl,
|
|
||||||
conversation!!.name, R.dimen.avatar_size_big
|
|
||||||
), null
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.build()
|
|
||||||
conversationAvatarImageView.controller = draweeController
|
|
||||||
}
|
}
|
||||||
Conversation.ConversationType.GROUP_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage(
|
GROUP_CONVERSATION -> {
|
||||||
DisplayUtils
|
conversationAvatarImageView.load(R.drawable.ic_people_group_white_24px) {
|
||||||
.getRoundedBitmapDrawableFromVectorDrawableResource(
|
transformations(CircleCropTransformation())
|
||||||
resources,
|
}
|
||||||
R.drawable.ic_people_group_white_24px
|
}
|
||||||
)
|
PUBLIC_CONVERSATION -> {
|
||||||
)
|
conversationAvatarImageView.load(R.drawable.ic_link_white_24px) {
|
||||||
Conversation.ConversationType.PUBLIC_CONVERSATION -> conversationAvatarImageView.hierarchy.setPlaceholderImage(
|
transformations(CircleCropTransformation())
|
||||||
DisplayUtils
|
}
|
||||||
.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 -> {
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user