Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor grid adapter #22

Merged
merged 2 commits into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.omh.android.storage.api.domain.model.OmhFile
import com.omh.android.storage.sample.databinding.ActivityFilesFoldersBinding
import com.omh.android.storage.sample.presentation.file_viewer.adapter.FileGridAdapter

class FileViewerActivity : AppCompatActivity() {
class FileViewerActivity : AppCompatActivity(), FileGridAdapter.GridItemListener{

private lateinit var tvSortByName: TextView
private lateinit var rvFilesAndFolders: RecyclerView
Expand Down Expand Up @@ -39,10 +40,14 @@ class FileViewerActivity : AppCompatActivity() {
tvSortByName.setOnClickListener {
// viewModel.sortByName()
}
rvGridAdapter = FileGridAdapter()
rvGridAdapter = FileGridAdapter(this)
rvFilesAndFolders.setHasFixedSize(true)
rvFilesAndFolders.layoutManager = GridLayoutManager(this, 2)
rvFilesAndFolders.adapter = rvGridAdapter
}

override fun onFileClicked(file: OmhFile) {
// TODO: Implement click listener
}

}
Original file line number Diff line number Diff line change
@@ -1,81 +1,106 @@
package com.omh.android.storage.sample.presentation.file_viewer.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil.ItemCallback
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.omh.android.storage.api.domain.model.OmhFile
import com.omh.android.storage.api.domain.model.OmhFileType
import com.omh.android.storage.sample.R
import com.omh.android.storage.sample.databinding.RvItemFilefolderGridBinding
import com.omh.android.storage.sample.databinding.FileGridAdapterBinding

class FileGridAdapter : RecyclerView.Adapter<FileGridAdapter.FileGridViewHolder>() {
class FileGridAdapter(
private val listener: GridItemListener
) : ListAdapter<OmhFile, FileGridAdapter.FileGridViewHolder>(DiffCallBack()) {

private val files = mutableListOf<OmhFile>()
private class DiffCallBack : ItemCallback<OmhFile>() {

override fun areItemsTheSame(oldItem: OmhFile, newItem: OmhFile) = oldItem.id == newItem.id

override fun areContentsTheSame(oldItem: OmhFile, newItem: OmhFile) = oldItem == newItem
}

interface GridItemListener {

fun onFileClicked(file: OmhFile)
}

class FileGridViewHolder(
binding: RvItemFilefolderGridBinding
private val binding: FileGridAdapterBinding
) : RecyclerView.ViewHolder(binding.root) {

private val fileIcon: ImageView = binding.ivFileGridItem
private val fileName: TextView = binding.tvFileFolderGridItemName

private fun loadFileImage(url: String) {
Glide.with(itemView)
.asBitmap()
.load(url)
.centerCrop()
.placeholder(R.mipmap.ic_launcher)
.into(fileIcon)
companion object {

private const val URL_DOCUMENT =
"https://drive-thirdparty.googleusercontent.com/32/type/application/vnd.google-apps.document"
private const val URL_SHEET =
"https://drive-thirdparty.googleusercontent.com/32/type/application/vnd.google-apps.spreadsheet"
private const val URL_PDF =
"https://drive-thirdparty.googleusercontent.com/32/type/application/pdf"
private const val URL_PNG =
"https://drive-thirdparty.googleusercontent.com/32/type/image/png"
private const val URL_ZIP =
"https://drive-thirdparty.googleusercontent.com/32/type/application/zip"
private const val URL_OTHER = "https://static.thenounproject.com/png/3482632-200.png"
}

fun bind(file: OmhFile) {
fileName.text = file.name
fun bind(file: OmhFile, listener: GridItemListener) {
val context = binding.root.context
val iconLink = getFileIconUrl(file.fileType)

val iconLink = when (file.fileType) {
OmhFileType.PDF -> "https://drive-thirdparty.googleusercontent.com/32/type/application/pdf"
with(binding) {
fileName.text = file.name
loadFileIcon(context, iconLink, fileIcon)
root.setOnClickListener { listener.onFileClicked(file) }
}
}

OmhFileType.DOCUMENT,
OmhFileType.MICROSOFT_WORD,
OmhFileType.OPEN_DOCUMENT_TEXT -> "https://drive-thirdparty.googleusercontent.com/32/type/application/vnd.google-apps.document"
private fun getFileIconUrl(fileType: OmhFileType) = when (fileType) {
OmhFileType.PDF -> URL_PDF

OmhFileType.SPREADSHEET,
OmhFileType.MICROSOFT_EXCEL,
OmhFileType.OPEN_DOCUMENT_SPREADSHEET -> "https://drive-thirdparty.googleusercontent.com/32/type/application/vnd.google-apps.spreadsheet"
OmhFileType.DOCUMENT,
OmhFileType.MICROSOFT_WORD,
OmhFileType.OPEN_DOCUMENT_TEXT -> URL_DOCUMENT

OmhFileType.PNG -> "https://drive-thirdparty.googleusercontent.com/32/type/image/png"
OmhFileType.SPREADSHEET,
OmhFileType.MICROSOFT_EXCEL,
OmhFileType.OPEN_DOCUMENT_SPREADSHEET -> URL_SHEET

OmhFileType.ZIP -> "https://drive-thirdparty.googleusercontent.com/32/type/application/zip"
OmhFileType.PNG -> URL_PNG

else -> "https://static.thenounproject.com/png/3482632-200.png"
}
OmhFileType.ZIP -> URL_ZIP

loadFileImage(iconLink)
else -> URL_OTHER
}

private fun loadFileIcon(
context: Context,
iconUrl: String,
imageView: ImageView
) {
Glide.with(context)
.asBitmap()
.load(iconUrl)
.centerCrop()
.placeholder(R.mipmap.ic_launcher)
.into(imageView)
}
}

override fun getItemCount() = files.size

override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): FileGridViewHolder = FileGridViewHolder(
RvItemFilefolderGridBinding.inflate(
) = FileGridViewHolder(
FileGridAdapterBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
)

override fun onBindViewHolder(holder: FileGridViewHolder, position: Int) {
holder.bind(files[position])
holder.bind(getItem(position), listener)
}

fun addAll(items: List<OmhFile>) {
files.clear()
files.addAll(items)
notifyDataSetChanged()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@
android:padding="16dp">

<FrameLayout
android:id="@+id/flIconPanelGridItem"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@drawable/rounded_for_grid">

<ImageView
android:id="@+id/ivFileGridItem"
android:id="@+id/fileIcon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
Expand All @@ -23,25 +22,15 @@

</FrameLayout>

<ImageView
android:id="@+id/ivFolderGridItem"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_horizontal"
android:visibility="gone"
tools:ignore="ContentDescription"
tools:scaleType="centerCrop"
tools:srcCompat="@mipmap/ic_launcher" />

<TextView
android:id="@+id/tvFileFolderGridItemName"
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:ellipsize="end"
android:maxLines="1"
android:textSize="17sp"
android:textStyle="bold"
tools:text="File/Folder Name" />
tools:text="File Name" />

</LinearLayout>