From b2f59ccb6c1f7b6566114a0f4ec57d34dc0e306b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 12:21:00 +0200 Subject: [PATCH] Merge 'SharedItemsListAdapter' and 'SharedItemsGridAdapter' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 31 ++--- .../adapters/SharedItemsAdapter.kt | 50 ++++++++ .../adapters/SharedItemsGridAdapter.kt | 105 ---------------- .../adapters/SharedItemsGridViewHolder.kt | 20 +++ .../adapters/SharedItemsListAdapter.kt | 119 ------------------ .../adapters/SharedItemsListViewHolder.kt | 43 +++++++ .../adapters/SharedItemsViewHolder.kt | 100 +++++++++++++++ .../shareditems/model/SharedMediaItems.kt | 3 +- .../viewmodels/SharedItemsViewModel.kt | 3 +- 9 files changed, 227 insertions(+), 247 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt delete mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt delete mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 2582c7729..b8cd07968 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -12,17 +12,16 @@ import androidx.recyclerview.widget.RecyclerView import autodagger.AutoInjector import com.google.android.material.tabs.TabLayout import com.nextcloud.talk.R -import com.nextcloud.talk.shareditems.adapters.SharedItemsGridAdapter -import com.nextcloud.talk.shareditems.adapters.SharedItemsListAdapter import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.ActivitySharedItemsBinding import com.nextcloud.talk.models.database.UserEntity +import com.nextcloud.talk.shareditems.adapters.SharedItemsAdapter import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY -import com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -70,24 +69,18 @@ class SharedItemsActivity : AppCompatActivity() { viewModel.sharedItems.observe(this) { Log.d(TAG, "Items received: $it") - if (viewModel.currentItemType == SharedItemType.MEDIA) { - val adapter = SharedItemsGridAdapter() - adapter.items = it.items - adapter.authHeader = it.authHeader - binding.imageRecycler.adapter = adapter - - val layoutManager = GridLayoutManager(this, SPAN_COUNT) - binding.imageRecycler.layoutManager = layoutManager + val showGrid = viewModel.currentItemType == SharedItemType.MEDIA + val layoutManager = if (showGrid) { + GridLayoutManager(this, SPAN_COUNT) } else { - val adapter = SharedItemsListAdapter() - adapter.items = it.items - adapter.authHeader = it.authHeader - binding.imageRecycler.adapter = adapter - - val layoutManager = LinearLayoutManager(this) - layoutManager.orientation = LinearLayoutManager.VERTICAL - binding.imageRecycler.layoutManager = layoutManager + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) } + + val adapter = SharedItemsAdapter(showGrid, userEntity.username, userEntity.token).apply { + items = it.items + } + binding.imageRecycler.adapter = adapter + binding.imageRecycler.layoutManager = layoutManager } binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt new file mode 100644 index 000000000..d3516ebdb --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -0,0 +1,50 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.talk.databinding.SharedItemGridBinding +import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedItem + +class SharedItemsAdapter( + private val showGrid: Boolean, + private val userName: String, + private val userToken: String +) : RecyclerView.Adapter() { + + var items: List = emptyList() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SharedItemsViewHolder { + + return if (showGrid) { + SharedItemsGridViewHolder( + SharedItemGridBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + userName, + userToken + ) + } else { + SharedItemsListViewHolder( + SharedItemListBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + userName, + userToken + ) + } + } + + override fun onBindViewHolder(holder: SharedItemsViewHolder, position: Int) { + holder.onBind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt deleted file mode 100644 index 29134f172..000000000 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.nextcloud.talk.shareditems.adapters - -import android.net.Uri -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.controller.ControllerListener -import com.facebook.drawee.interfaces.DraweeController -import com.facebook.drawee.view.SimpleDraweeView -import com.facebook.imagepipeline.common.RotationOptions -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.ImageRequestBuilder -import com.nextcloud.talk.databinding.SharedItemGridBinding -import com.nextcloud.talk.shareditems.model.SharedItem -import com.nextcloud.talk.utils.DrawableUtils -import com.nextcloud.talk.utils.FileViewerUtils - -class SharedItemsGridAdapter : RecyclerView.Adapter() { - - companion object { - private val TAG = SharedItemsGridAdapter::class.simpleName - } - - class ViewHolder(val binding: SharedItemGridBinding, itemView: View) : RecyclerView.ViewHolder(itemView) - - var authHeader: Map = emptyMap() - var items: List = emptyList() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = SharedItemGridBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(binding, binding.root) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - - val currentItem = items[position] - - if (currentItem.previewAvailable == true) { - val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(currentItem.previewLink)) - .setProgressiveRenderingEnabled(true) - .setRotationOptions(RotationOptions.autoRotate()) - .disableDiskCache() - .setHeaders(authHeader) - .build() - - val listener: ControllerListener = object : BaseControllerListener() { - override fun onFailure(id: String, e: Throwable) { - Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) - setStaticMimetypeImage(currentItem, holder) - } - } - - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.binding.image.controller) - .setAutoPlayAnimations(true) - .setImageRequest(imageRequest) - .setControllerListener(listener) - .build() - holder.binding.image.controller = draweeController - } else { - setStaticMimetypeImage(currentItem, holder) - } - - val fileViewerUtils = FileViewerUtils(holder.binding.image.context, currentItem.userEntity) - - holder.binding.image.setOnClickListener { - fileViewerUtils.openFile( - FileViewerUtils.FileInfo(currentItem.id, currentItem.name, currentItem.fileSize), - currentItem.path, - currentItem.link, - currentItem.mimeType, - FileViewerUtils.ProgressUi( - holder.binding.progressBar, - null, - it as SimpleDraweeView - ) - ) - } - - fileViewerUtils.resumeToUpdateViewsByProgress( - currentItem.name, - currentItem.id, - currentItem.mimeType, - FileViewerUtils.ProgressUi(holder.binding.progressBar, null, holder.binding.image) - ) - } - - private fun setStaticMimetypeImage( - currentItem: SharedItem, - holder: ViewHolder - ) { - val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(currentItem.mimeType) - val drawable = ContextCompat.getDrawable(holder.binding.image.context, drawableResourceId) - holder.binding.image.hierarchy.setPlaceholderImage(drawable) - } - - override fun getItemCount(): Int { - return items.size - } -} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt new file mode 100644 index 000000000..a2792671a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt @@ -0,0 +1,20 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.view.View +import android.widget.ProgressBar +import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.databinding.SharedItemGridBinding + +class SharedItemsGridViewHolder( + override val binding: SharedItemGridBinding, + userName: String, + userToken: String +) : SharedItemsViewHolder(binding, userName, userToken) { + + override val image: SimpleDraweeView + get() = binding.image + override val clickTarget: View + get() = binding.image + override val progressBar: ProgressBar + get() = binding.progressBar +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt deleted file mode 100644 index 7b5bbd6e7..000000000 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt +++ /dev/null @@ -1,119 +0,0 @@ -package com.nextcloud.talk.shareditems.adapters - -import android.net.Uri -import android.text.format.Formatter -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.controller.ControllerListener -import com.facebook.drawee.interfaces.DraweeController -import com.facebook.imagepipeline.common.RotationOptions -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.ImageRequestBuilder -import com.nextcloud.talk.databinding.SharedItemListBinding -import com.nextcloud.talk.shareditems.model.SharedItem -import com.nextcloud.talk.utils.DateUtils -import com.nextcloud.talk.utils.DrawableUtils -import com.nextcloud.talk.utils.FileViewerUtils -import com.nextcloud.talk.utils.FileViewerUtils.ProgressUi - -class SharedItemsListAdapter : RecyclerView.Adapter() { - - companion object { - private val TAG = SharedItemsListAdapter::class.simpleName - private const val ONE_SECOND_IN_MILLIS = 1000 - } - - class ViewHolder(val binding: SharedItemListBinding, itemView: View) : RecyclerView.ViewHolder(itemView) - - var authHeader: Map = emptyMap() - var items: List = emptyList() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = SharedItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(binding, binding.root) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - - val currentItem = items[position] - - holder.binding.fileName.text = currentItem.name - holder.binding.fileSize.text = currentItem.fileSize?.let { - Formatter.formatShortFileSize( - holder.binding.fileSize.context, - it - ) - } - holder.binding.fileDate.text = DateUtils.getLocalDateTimeStringFromTimestamp( - currentItem.date * ONE_SECOND_IN_MILLIS - ) - - if (currentItem.previewAvailable == true) { - val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(currentItem.previewLink)) - .setProgressiveRenderingEnabled(true) - .setRotationOptions(RotationOptions.autoRotate()) - .disableDiskCache() - .setHeaders(authHeader) - .build() - - val listener: ControllerListener = object : BaseControllerListener() { - override fun onFailure(id: String, e: Throwable) { - Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) - setStaticMimetypeImage(currentItem, holder) - } - } - - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.binding.fileImage.controller) - .setAutoPlayAnimations(true) - .setImageRequest(imageRequest) - .setControllerListener(listener) - .build() - holder.binding.fileImage.controller = draweeController - } else { - setStaticMimetypeImage(currentItem, holder) - } - - val fileViewerUtils = FileViewerUtils(holder.binding.fileImage.context, currentItem.userEntity) - - holder.binding.fileItem.setOnClickListener { - fileViewerUtils.openFile( - FileViewerUtils.FileInfo(currentItem.id, currentItem.name, currentItem.fileSize), - currentItem.path, - currentItem.link, - currentItem.mimeType, - ProgressUi( - holder.binding.progressBar, - null, - holder.binding.fileImage - ) - ) - } - - fileViewerUtils.resumeToUpdateViewsByProgress( - currentItem.name, - currentItem.id, - currentItem.mimeType, - ProgressUi(holder.binding.progressBar, null, holder.binding.fileImage) - ) - } - - private fun setStaticMimetypeImage( - currentItem: SharedItem, - holder: ViewHolder - ) { - val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(currentItem.mimeType) - val drawable = ContextCompat.getDrawable(holder.binding.fileImage.context, drawableResourceId) - holder.binding.fileImage.hierarchy.setPlaceholderImage(drawable) - } - - override fun getItemCount(): Int { - return items.size - } -} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt new file mode 100644 index 000000000..e7b2fbbf2 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -0,0 +1,43 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.text.format.Formatter +import android.view.View +import android.widget.ProgressBar +import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.utils.DateUtils + +class SharedItemsListViewHolder( + override val binding: SharedItemListBinding, + userName: String, + userToken: String +) : SharedItemsViewHolder(binding, userName, userToken) { + + override val image: SimpleDraweeView + get() = binding.fileImage + override val clickTarget: View + get() = binding.fileItem + override val progressBar: ProgressBar + get() = binding.progressBar + + override fun onBind(item: SharedItem) { + + super.onBind(item) + + binding.fileName.text = item.name + binding.fileSize.text = item.fileSize?.let { + Formatter.formatShortFileSize( + binding.fileSize.context, + it + ) + } + binding.fileDate.text = DateUtils.getLocalDateTimeStringFromTimestamp( + item.date * ONE_SECOND_IN_MILLIS + ) + } + + companion object { + private const val ONE_SECOND_IN_MILLIS = 1000 + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt new file mode 100644 index 000000000..159345ab0 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -0,0 +1,100 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.graphics.drawable.Drawable +import android.net.Uri +import android.util.Log +import android.view.View +import android.widget.ProgressBar +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.drawee.controller.BaseControllerListener +import com.facebook.drawee.controller.ControllerListener +import com.facebook.drawee.interfaces.DraweeController +import com.facebook.drawee.view.SimpleDraweeView +import com.facebook.imagepipeline.common.RotationOptions +import com.facebook.imagepipeline.image.ImageInfo +import com.facebook.imagepipeline.request.ImageRequestBuilder +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.DrawableUtils +import com.nextcloud.talk.utils.FileViewerUtils + +abstract class SharedItemsViewHolder( + open val binding: ViewBinding, + userName: String, + userToken: String +) : RecyclerView.ViewHolder(binding.root) { + + companion object { + private val TAG = SharedItemsViewHolder::class.simpleName + } + + abstract val image: SimpleDraweeView + abstract val clickTarget: View + abstract val progressBar: ProgressBar + + private val authHeader = mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) + + open fun onBind(item: SharedItem) { + image.hierarchy.setPlaceholderImage(staticImage(item.mimeType, image)) + if (item.previewAvailable == true) { + image.controller = configurePreview(item) + } + + val fileViewerUtils = FileViewerUtils(image.context, item.userEntity) + + clickTarget.setOnClickListener { + fileViewerUtils.openFile( + FileViewerUtils.FileInfo(item.id, item.name, item.fileSize), + item.path, + item.link, + item.mimeType, + FileViewerUtils.ProgressUi( + progressBar, + null, + image + ) + ) + } + + fileViewerUtils.resumeToUpdateViewsByProgress( + item.name, + item.id, + item.mimeType, + FileViewerUtils.ProgressUi(progressBar, null, image) + ) + } + + private fun configurePreview(item: SharedItem): DraweeController { + + val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(item.previewLink)) + .setProgressiveRenderingEnabled(true) + .setRotationOptions(RotationOptions.autoRotate()) + .disableDiskCache() + .setHeaders(authHeader) + .build() + + val listener: ControllerListener = object : BaseControllerListener() { + override fun onFailure(id: String, e: Throwable) { + Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) + } + } + + return Fresco.newDraweeControllerBuilder() + .setOldController(image.controller) + .setAutoPlayAnimations(true) + .setImageRequest(imageRequest) + .setControllerListener(listener) + .build() + } + + private fun staticImage( + mimeType: String?, + image: SimpleDraweeView + ): Drawable { + val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimeType) + return ContextCompat.getDrawable(image.context, drawableResourceId)!! + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt index 7d4fd1ed3..ea70050ba 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt @@ -3,6 +3,5 @@ package com.nextcloud.talk.shareditems.model class SharedMediaItems( val items: List, var lastSeenId: Int?, - var moreItemsExisting: Boolean, - val authHeader: Map + var moreItemsExisting: Boolean ) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 23bf6028e..9c7f04cd5 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -88,8 +88,7 @@ class SharedItemsViewModel @Inject constructor( SharedMediaItems( oldItems + newSharedItems!!.items, newSharedItems!!.lastSeenId, - newSharedItems!!.moreItemsExisting, - newSharedItems!!.authHeader + newSharedItems!!.moreItemsExisting ) } }