mirror of
https://github.com/SimpleMobileTools/Simple-File-Manager.git
synced 2025-06-05 22:09:15 +02:00
update the ItemsAdapter to the new RecyclerViewAdapter
This commit is contained in:
@@ -46,7 +46,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.simplemobiletools:commons:2.38.6'
|
compile 'com.simplemobiletools:commons:2.39.10'
|
||||||
compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'
|
compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'
|
||||||
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.1.51'
|
ext.kotlin_version = '1.1.60'
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
package com.simplemobiletools.filemanager.activities
|
package com.simplemobiletools.filemanager.activities
|
||||||
|
|
||||||
import android.graphics.PorterDuff
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
||||||
|
import com.simplemobiletools.commons.extensions.applyColorFilter
|
||||||
import com.simplemobiletools.commons.extensions.beVisibleIf
|
import com.simplemobiletools.commons.extensions.beVisibleIf
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
import com.simplemobiletools.filemanager.extensions.config
|
import com.simplemobiletools.filemanager.extensions.config
|
||||||
@@ -31,7 +31,7 @@ class FavoritesActivity : SimpleActivity() {
|
|||||||
setTextColor(config.textColor)
|
setTextColor(config.textColor)
|
||||||
}
|
}
|
||||||
favorite_icon.apply {
|
favorite_icon.apply {
|
||||||
setColorFilter(config.textColor, PorterDuff.Mode.SRC_IN)
|
applyColorFilter(config.textColor)
|
||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
config.removeFavorite(favorite)
|
config.removeFavorite(favorite)
|
||||||
updateFavorites()
|
updateFavorites()
|
||||||
|
@@ -5,24 +5,22 @@ import android.content.ClipboardManager
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
|
||||||
import android.support.v7.view.ActionMode
|
|
||||||
import android.support.v7.widget.RecyclerView
|
|
||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
import android.view.*
|
import android.view.Menu
|
||||||
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback
|
import android.view.View
|
||||||
import com.bignerdranch.android.multiselector.MultiSelector
|
import android.view.ViewGroup
|
||||||
import com.bignerdranch.android.multiselector.SwappingHolder
|
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||||
import com.bumptech.glide.request.RequestOptions
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||||
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
||||||
import com.simplemobiletools.commons.dialogs.PropertiesDialog
|
import com.simplemobiletools.commons.dialogs.PropertiesDialog
|
||||||
import com.simplemobiletools.commons.dialogs.RenameItemDialog
|
import com.simplemobiletools.commons.dialogs.RenameItemDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.models.FileDirItem
|
import com.simplemobiletools.commons.models.FileDirItem
|
||||||
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
import com.simplemobiletools.filemanager.BuildConfig
|
import com.simplemobiletools.filemanager.BuildConfig
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
||||||
@@ -38,53 +36,67 @@ import java.util.zip.ZipEntry
|
|||||||
import java.util.zip.ZipFile
|
import java.util.zip.ZipFile
|
||||||
import java.util.zip.ZipOutputStream
|
import java.util.zip.ZipOutputStream
|
||||||
|
|
||||||
class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDirItem>, val listener: ItemOperationsListener?, val isPickMultipleIntent: Boolean,
|
class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileDirItem>, val listener: ItemOperationsListener?, recyclerView: MyRecyclerView,
|
||||||
val itemClick: (FileDirItem) -> Unit) : RecyclerView.Adapter<ItemsAdapter.ViewHolder>() {
|
val isPickMultipleIntent: Boolean, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
|
||||||
private var textColor = activity.config.textColor
|
|
||||||
|
|
||||||
private val multiSelector = MultiSelector()
|
|
||||||
private val config = activity.config
|
private val config = activity.config
|
||||||
|
|
||||||
private var actMode: ActionMode? = null
|
|
||||||
private var itemViews = SparseArray<View>()
|
|
||||||
private val selectedPositions = HashSet<Int>()
|
|
||||||
|
|
||||||
lateinit private var folderDrawable: Drawable
|
lateinit private var folderDrawable: Drawable
|
||||||
lateinit private var fileDrawable: Drawable
|
lateinit private var fileDrawable: Drawable
|
||||||
|
|
||||||
fun toggleItemSelection(select: Boolean, pos: Int) {
|
|
||||||
if (select) {
|
|
||||||
if (itemViews[pos] != null) {
|
|
||||||
selectedPositions.add(pos)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
selectedPositions.remove(pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
itemViews[pos]?.item_frame?.isSelected = select
|
|
||||||
|
|
||||||
if (selectedPositions.isEmpty()) {
|
|
||||||
actMode?.finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
updateTitle(selectedPositions.size)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateTitle(cnt: Int) {
|
|
||||||
actMode?.title = "$cnt / ${mItems.size}"
|
|
||||||
actMode?.invalidate()
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
selectableItemCount = fileDirItems.count()
|
||||||
initDrawables()
|
initDrawables()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateTextColor(color: Int) {
|
override fun getActionMenuId() = R.menu.cab
|
||||||
textColor = color
|
|
||||||
initDrawables()
|
override fun prepareActionMode(menu: Menu) {
|
||||||
|
menu.apply {
|
||||||
|
findItem(R.id.cab_rename).isVisible = isOneItemSelected()
|
||||||
|
findItem(R.id.cab_decompress).isVisible = getSelectedMedia().map { it.path }.any { it.isZipFile() }
|
||||||
|
findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent
|
||||||
|
findItem(R.id.cab_copy_path).isVisible = isOneItemSelected()
|
||||||
|
findItem(R.id.cab_open_with).isVisible = isOneFileSelected()
|
||||||
|
findItem(R.id.cab_set_as).isVisible = isOneFileSelected()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun prepareItemSelection(view: View) {}
|
||||||
|
|
||||||
|
override fun markItemSelection(select: Boolean, view: View?) {
|
||||||
|
view?.item_frame?.isSelected = select
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun actionItemPressed(id: Int) {
|
||||||
|
when (id) {
|
||||||
|
R.id.cab_confirm_selection -> confirmSelection()
|
||||||
|
R.id.cab_rename -> displayRenameDialog()
|
||||||
|
R.id.cab_properties -> showProperties()
|
||||||
|
R.id.cab_share -> shareFiles()
|
||||||
|
R.id.cab_copy_path -> copyPath()
|
||||||
|
R.id.cab_set_as -> setAs()
|
||||||
|
R.id.cab_open_with -> openWith()
|
||||||
|
R.id.cab_copy_to -> copyMoveTo(true)
|
||||||
|
R.id.cab_move_to -> copyMoveTo(false)
|
||||||
|
R.id.cab_compress -> compressSelection()
|
||||||
|
R.id.cab_decompress -> decompressSelection()
|
||||||
|
R.id.cab_select_all -> selectAll()
|
||||||
|
R.id.cab_delete -> askConfirmDelete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.list_item, parent)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
|
||||||
|
val fileDirItem = fileDirItems[position]
|
||||||
|
val view = holder.bindView(fileDirItem) {
|
||||||
|
setupView(it, fileDirItem)
|
||||||
|
}
|
||||||
|
bindViewHolder(holder, position, view)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount() = fileDirItems.size
|
||||||
|
|
||||||
private fun initDrawables() {
|
private fun initDrawables() {
|
||||||
folderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_folder, textColor)
|
folderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_folder, textColor)
|
||||||
fileDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_file, textColor)
|
fileDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_file, textColor)
|
||||||
@@ -92,67 +104,9 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
fileDrawable.alpha = 180
|
fileDrawable.alpha = 180
|
||||||
}
|
}
|
||||||
|
|
||||||
private val adapterListener = object : MyAdapterListener {
|
private fun isOneItemSelected() = selectedPositions.size == 1
|
||||||
override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
|
|
||||||
toggleItemSelection(select, position)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getSelectedPositions() = selectedPositions
|
private fun isOneFileSelected() = isOneItemSelected() && !fileDirItems[selectedPositions.first()].isDirectory
|
||||||
}
|
|
||||||
|
|
||||||
private val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) {
|
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
|
||||||
when (item.itemId) {
|
|
||||||
R.id.cab_confirm_selection -> confirmSelection()
|
|
||||||
R.id.cab_rename -> displayRenameDialog()
|
|
||||||
R.id.cab_properties -> showProperties()
|
|
||||||
R.id.cab_share -> shareFiles()
|
|
||||||
R.id.cab_copy_path -> copyPath()
|
|
||||||
R.id.cab_set_as -> setAs()
|
|
||||||
R.id.cab_open_with -> openWith()
|
|
||||||
R.id.cab_copy_to -> copyMoveTo(true)
|
|
||||||
R.id.cab_move_to -> copyMoveTo(false)
|
|
||||||
R.id.cab_compress -> compressSelection()
|
|
||||||
R.id.cab_decompress -> decompressSelection()
|
|
||||||
R.id.cab_select_all -> selectAll()
|
|
||||||
R.id.cab_delete -> askConfirmDelete()
|
|
||||||
else -> return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateActionMode(actionMode: ActionMode?, menu: Menu?): Boolean {
|
|
||||||
super.onCreateActionMode(actionMode, menu)
|
|
||||||
actMode = actionMode
|
|
||||||
activity.menuInflater.inflate(R.menu.cab, menu)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPrepareActionMode(actionMode: ActionMode?, menu: Menu): Boolean {
|
|
||||||
menu.apply {
|
|
||||||
findItem(R.id.cab_rename).isVisible = isOneItemSelected()
|
|
||||||
findItem(R.id.cab_decompress).isVisible = getSelectedMedia().map { it.path }.any { it.isZipFile() }
|
|
||||||
findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent
|
|
||||||
findItem(R.id.cab_copy_path).isVisible = isOneItemSelected()
|
|
||||||
findItem(R.id.cab_open_with).isVisible = isOneFileSelected()
|
|
||||||
findItem(R.id.cab_set_as).isVisible = isOneFileSelected()
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyActionMode(actionMode: ActionMode?) {
|
|
||||||
super.onDestroyActionMode(actionMode)
|
|
||||||
selectedPositions.forEach {
|
|
||||||
itemViews[it]?.isSelected = false
|
|
||||||
}
|
|
||||||
selectedPositions.clear()
|
|
||||||
actMode = null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isOneItemSelected() = selectedPositions.size == 1
|
|
||||||
|
|
||||||
private fun isOneFileSelected() = isOneItemSelected() && !mItems[selectedPositions.first()].isDirectory
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun confirmSelection() {
|
private fun confirmSelection() {
|
||||||
val paths = getSelectedMedia().filter { !it.isDirectory }.map { it.path } as ArrayList<String>
|
val paths = getSelectedMedia().filter { !it.isDirectory }.map { it.path } as ArrayList<String>
|
||||||
@@ -163,17 +117,17 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
RenameItemDialog(activity, getSelectedMedia()[0].path) {
|
RenameItemDialog(activity, getSelectedMedia()[0].path) {
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
listener?.refreshItems()
|
listener?.refreshItems()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showProperties() {
|
private fun showProperties() {
|
||||||
if (selectedPositions.size <= 1) {
|
if (selectedPositions.size <= 1) {
|
||||||
PropertiesDialog(activity, mItems[selectedPositions.first()].path, config.shouldShowHidden)
|
PropertiesDialog(activity, fileDirItems[selectedPositions.first()].path, config.shouldShowHidden)
|
||||||
} else {
|
} else {
|
||||||
val paths = ArrayList<String>()
|
val paths = ArrayList<String>()
|
||||||
selectedPositions.forEach { paths.add(mItems[it].path) }
|
selectedPositions.forEach { paths.add(fileDirItems[it].path) }
|
||||||
PropertiesDialog(activity, paths, config.shouldShowHidden)
|
PropertiesDialog(activity, paths, config.shouldShowHidden)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,7 +155,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
val path = getSelectedMedia().first().path
|
val path = getSelectedMedia().first().path
|
||||||
val clip = ClipData.newPlainText(activity.getString(R.string.app_name), path)
|
val clip = ClipData.newPlainText(activity.getString(R.string.app_name), path)
|
||||||
(activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).primaryClip = clip
|
(activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).primaryClip = clip
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
activity.toast(R.string.path_copied)
|
activity.toast(R.string.path_copied)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +171,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
|
|
||||||
private fun copyMoveTo(isCopyOperation: Boolean) {
|
private fun copyMoveTo(isCopyOperation: Boolean) {
|
||||||
val files = ArrayList<File>()
|
val files = ArrayList<File>()
|
||||||
selectedPositions.forEach { files.add(File(mItems[it].path)) }
|
selectedPositions.forEach { files.add(File(fileDirItems[it].path)) }
|
||||||
|
|
||||||
val source = if (files[0].isFile) files[0].parent else files[0].absolutePath
|
val source = if (files[0].isFile) files[0].parent else files[0].absolutePath
|
||||||
FilePickerDialog(activity, source, false, config.shouldShowHidden, true) {
|
FilePickerDialog(activity, source, false, config.shouldShowHidden, true) {
|
||||||
@@ -226,7 +180,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
} else {
|
} else {
|
||||||
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false) {
|
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false) {
|
||||||
listener?.refreshItems()
|
listener?.refreshItems()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -250,7 +204,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
|
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
listener?.refreshItems()
|
listener?.refreshItems()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
}).start()
|
}).start()
|
||||||
}
|
}
|
||||||
@@ -259,17 +213,17 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
if (selectedPositions.isEmpty())
|
if (selectedPositions.isEmpty())
|
||||||
return
|
return
|
||||||
|
|
||||||
val firstPath = mItems[selectedPositions.first()].path
|
val firstPath = fileDirItems[selectedPositions.first()].path
|
||||||
CompressAsDialog(activity, firstPath) {
|
CompressAsDialog(activity, firstPath) {
|
||||||
activity.handleSAFDialog(File(firstPath)) {
|
activity.handleSAFDialog(File(firstPath)) {
|
||||||
activity.toast(R.string.compressing)
|
activity.toast(R.string.compressing)
|
||||||
val paths = selectedPositions.map { mItems[it].path }
|
val paths = selectedPositions.map { fileDirItems[it].path }
|
||||||
Thread({
|
Thread({
|
||||||
if (zipPaths(paths, it)) {
|
if (zipPaths(paths, it)) {
|
||||||
activity.toast(R.string.compression_successful)
|
activity.toast(R.string.compression_successful)
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
listener?.refreshItems()
|
listener?.refreshItems()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
activity.toast(R.string.compressing_failed)
|
activity.toast(R.string.compressing_failed)
|
||||||
@@ -283,16 +237,16 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
if (selectedPositions.isEmpty())
|
if (selectedPositions.isEmpty())
|
||||||
return
|
return
|
||||||
|
|
||||||
val firstPath = mItems[selectedPositions.first()].path
|
val firstPath = fileDirItems[selectedPositions.first()].path
|
||||||
activity.handleSAFDialog(File(firstPath)) {
|
activity.handleSAFDialog(File(firstPath)) {
|
||||||
activity.toast(R.string.decompressing)
|
activity.toast(R.string.decompressing)
|
||||||
val paths = selectedPositions.map { mItems[it].path }.filter { it.isZipFile() }
|
val paths = selectedPositions.map { fileDirItems[it].path }.filter { it.isZipFile() }
|
||||||
Thread({
|
Thread({
|
||||||
if (unzipPaths(paths)) {
|
if (unzipPaths(paths)) {
|
||||||
activity.toast(R.string.decompression_successful)
|
activity.toast(R.string.decompression_successful)
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
listener?.refreshItems()
|
listener?.refreshItems()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
activity.toast(R.string.decompressing_failed)
|
activity.toast(R.string.decompressing_failed)
|
||||||
@@ -384,19 +338,10 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectAll() {
|
|
||||||
val cnt = mItems.size
|
|
||||||
for (i in 0 until cnt) {
|
|
||||||
selectedPositions.add(i)
|
|
||||||
notifyItemChanged(i)
|
|
||||||
}
|
|
||||||
updateTitle(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun askConfirmDelete() {
|
private fun askConfirmDelete() {
|
||||||
ConfirmationDialog(activity) {
|
ConfirmationDialog(activity) {
|
||||||
deleteFiles()
|
deleteFiles()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,16 +352,16 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
val files = ArrayList<File>(selectedPositions.size)
|
val files = ArrayList<File>(selectedPositions.size)
|
||||||
val removeFiles = ArrayList<FileDirItem>(selectedPositions.size)
|
val removeFiles = ArrayList<FileDirItem>(selectedPositions.size)
|
||||||
|
|
||||||
activity.handleSAFDialog(File(mItems[selectedPositions.first()].path)) {
|
activity.handleSAFDialog(File(fileDirItems[selectedPositions.first()].path)) {
|
||||||
selectedPositions.sortedDescending().forEach {
|
selectedPositions.sortedDescending().forEach {
|
||||||
val file = mItems[it]
|
val file = fileDirItems[it]
|
||||||
files.add(File(file.path))
|
files.add(File(file.path))
|
||||||
removeFiles.add(file)
|
removeFiles.add(file)
|
||||||
notifyItemRemoved(it)
|
notifyItemRemoved(it)
|
||||||
itemViews.put(it, null)
|
itemViews.put(it, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
mItems.removeAll(removeFiles)
|
fileDirItems.removeAll(removeFiles)
|
||||||
selectedPositions.clear()
|
selectedPositions.clear()
|
||||||
listener?.deleteFiles(files)
|
listener?.deleteFiles(files)
|
||||||
|
|
||||||
@@ -435,138 +380,48 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
|
|
||||||
private fun getSelectedMedia(): List<FileDirItem> {
|
private fun getSelectedMedia(): List<FileDirItem> {
|
||||||
val selectedMedia = ArrayList<FileDirItem>(selectedPositions.size)
|
val selectedMedia = ArrayList<FileDirItem>(selectedPositions.size)
|
||||||
selectedPositions.forEach { selectedMedia.add(mItems[it]) }
|
selectedPositions.forEach { selectedMedia.add(fileDirItems[it]) }
|
||||||
return selectedMedia
|
return selectedMedia
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateItems(newItems: MutableList<FileDirItem>) {
|
fun updateItems(newItems: MutableList<FileDirItem>) {
|
||||||
mItems = newItems
|
fileDirItems = newItems
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
actMode?.finish()
|
finishActMode()
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
|
|
||||||
val view = LayoutInflater.from(parent?.context).inflate(R.layout.list_item, parent, false)
|
|
||||||
return ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, listener, itemClick)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
||||||
itemViews.put(position, holder.bindView(mItems[position], fileDrawable, folderDrawable, textColor))
|
|
||||||
toggleItemSelection(selectedPositions.contains(position), position)
|
|
||||||
holder.itemView.tag = holder
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewRecycled(holder: ViewHolder?) {
|
override fun onViewRecycled(holder: ViewHolder?) {
|
||||||
super.onViewRecycled(holder)
|
super.onViewRecycled(holder)
|
||||||
holder?.stopLoad()
|
if (!activity.isActivityDestroyed()) {
|
||||||
}
|
Glide.with(activity).clear(holder?.itemView?.item_icon)
|
||||||
|
|
||||||
override fun getItemCount() = mItems.size
|
|
||||||
|
|
||||||
fun selectItem(pos: Int) {
|
|
||||||
toggleItemSelection(true, pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun selectRange(from: Int, to: Int, min: Int, max: Int) {
|
|
||||||
if (from == to) {
|
|
||||||
(min..max).filter { it != from }
|
|
||||||
.forEach { toggleItemSelection(false, it) }
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (to < from) {
|
|
||||||
for (i in to..from)
|
|
||||||
toggleItemSelection(true, i)
|
|
||||||
|
|
||||||
if (min > -1 && min < to) {
|
|
||||||
(min until to).filter { it != from }
|
|
||||||
.forEach { toggleItemSelection(false, it) }
|
|
||||||
}
|
|
||||||
if (max > -1) {
|
|
||||||
for (i in from + 1..max)
|
|
||||||
toggleItemSelection(false, i)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i in from..to)
|
|
||||||
toggleItemSelection(true, i)
|
|
||||||
|
|
||||||
if (max > -1 && max > to) {
|
|
||||||
(to + 1..max).filter { it != from }
|
|
||||||
.forEach { toggleItemSelection(false, it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (min > -1) {
|
|
||||||
for (i in min until from)
|
|
||||||
toggleItemSelection(false, i)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ViewHolder(val view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
|
private fun setupView(view: View, fileDirItem: FileDirItem) {
|
||||||
val multiSelector: MultiSelector, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> (Unit)) : SwappingHolder(view, MultiSelector()) {
|
view.apply {
|
||||||
fun bindView(fileDirItem: FileDirItem, fileDrawable: Drawable, folderDrawable: Drawable, textColor: Int): View {
|
item_name.text = fileDirItem.name
|
||||||
itemView.apply {
|
item_name.setTextColor(textColor)
|
||||||
item_name.text = fileDirItem.name
|
item_details.setTextColor(textColor)
|
||||||
item_name.setTextColor(textColor)
|
|
||||||
item_details.setTextColor(textColor)
|
|
||||||
|
|
||||||
if (fileDirItem.isDirectory) {
|
if (fileDirItem.isDirectory) {
|
||||||
item_icon.setImageDrawable(folderDrawable)
|
item_icon.setImageDrawable(folderDrawable)
|
||||||
item_details.text = getChildrenCnt(fileDirItem)
|
item_details.text = getChildrenCnt(fileDirItem)
|
||||||
} else {
|
|
||||||
val options = RequestOptions()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
|
||||||
.error(fileDrawable)
|
|
||||||
.centerCrop()
|
|
||||||
|
|
||||||
val path = fileDirItem.path
|
|
||||||
Glide.with(activity).load(path).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(item_icon)
|
|
||||||
item_details.text = fileDirItem.size.formatSize()
|
|
||||||
}
|
|
||||||
|
|
||||||
setOnClickListener { viewClicked(fileDirItem) }
|
|
||||||
setOnLongClickListener { viewLongClicked(); true }
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemView
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getChildrenCnt(item: FileDirItem): String {
|
|
||||||
val children = item.children
|
|
||||||
return activity.resources.getQuantityString(R.plurals.items, children, children)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun viewClicked(fileDirItem: FileDirItem) {
|
|
||||||
if (multiSelector.isSelectable) {
|
|
||||||
val isSelected = adapterListener.getSelectedPositions().contains(adapterPosition)
|
|
||||||
adapterListener.toggleItemSelectionAdapter(!isSelected, adapterPosition)
|
|
||||||
} else {
|
} else {
|
||||||
itemClick(fileDirItem)
|
val options = RequestOptions()
|
||||||
}
|
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||||
}
|
.error(fileDrawable)
|
||||||
|
.centerCrop()
|
||||||
|
|
||||||
private fun viewLongClicked() {
|
val path = fileDirItem.path
|
||||||
if (listener != null) {
|
Glide.with(activity).load(path).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(item_icon)
|
||||||
if (!multiSelector.isSelectable) {
|
item_details.text = fileDirItem.size.formatSize()
|
||||||
activity.startSupportActionMode(multiSelectorCallback)
|
|
||||||
adapterListener.toggleItemSelectionAdapter(true, adapterPosition)
|
|
||||||
}
|
|
||||||
|
|
||||||
listener.itemLongClicked(adapterPosition)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun stopLoad() {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && !activity.isDestroyed) {
|
|
||||||
Glide.with(activity).clear(view.item_icon)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MyAdapterListener {
|
private fun getChildrenCnt(item: FileDirItem): String {
|
||||||
fun toggleItemSelectionAdapter(select: Boolean, position: Int)
|
val children = item.children
|
||||||
|
return activity.resources.getQuantityString(R.plurals.items, children, children)
|
||||||
fun getSelectedPositions(): HashSet<Int>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ItemOperationsListener {
|
interface ItemOperationsListener {
|
||||||
@@ -574,8 +429,6 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDir
|
|||||||
|
|
||||||
fun deleteFiles(files: ArrayList<File>)
|
fun deleteFiles(files: ArrayList<File>)
|
||||||
|
|
||||||
fun itemLongClicked(position: Int)
|
|
||||||
|
|
||||||
fun selectedPaths(paths: ArrayList<String>)
|
fun selectedPaths(paths: ArrayList<String>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package com.simplemobiletools.filemanager.dialogs
|
|||||||
|
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
@@ -9,7 +10,7 @@ import com.simplemobiletools.filemanager.activities.SimpleActivity
|
|||||||
import com.simplemobiletools.filemanager.extensions.config
|
import com.simplemobiletools.filemanager.extensions.config
|
||||||
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
|
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
|
||||||
|
|
||||||
class ChangeSortingDialog(val activity: SimpleActivity, val path: String = "", val callback: () -> Unit) {
|
class ChangeSortingDialog(val activity: BaseSimpleActivity, val path: String = "", val callback: () -> Unit) {
|
||||||
private var currSorting = 0
|
private var currSorting = 0
|
||||||
private var config = activity.config
|
private var config = activity.config
|
||||||
private var view = LayoutInflater.from(activity).inflate(R.layout.dialog_change_sorting, null)
|
private var view = LayoutInflater.from(activity).inflate(R.layout.dialog_change_sorting, null)
|
||||||
|
@@ -3,15 +3,15 @@ package com.simplemobiletools.filemanager.dialogs
|
|||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
|
||||||
import com.simplemobiletools.filemanager.extensions.config
|
import com.simplemobiletools.filemanager.extensions.config
|
||||||
import kotlinx.android.synthetic.main.dialog_compress_as.view.*
|
import kotlinx.android.synthetic.main.dialog_compress_as.view.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class CompressAsDialog(val activity: SimpleActivity, val path: String, val callback: (destination: String) -> Unit) {
|
class CompressAsDialog(val activity: BaseSimpleActivity, val path: String, val callback: (destination: String) -> Unit) {
|
||||||
private val view = activity.layoutInflater.inflate(R.layout.dialog_compress_as, null)
|
private val view = activity.layoutInflater.inflate(R.layout.dialog_compress_as, null)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@@ -3,6 +3,7 @@ package com.simplemobiletools.filemanager.dialogs
|
|||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
||||||
@@ -10,7 +11,7 @@ import kotlinx.android.synthetic.main.dialog_create_new.view.*
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val callback: (success: Boolean) -> Unit) {
|
class CreateNewItemDialog(val activity: BaseSimpleActivity, val path: String, val callback: (success: Boolean) -> Unit) {
|
||||||
private val view = activity.layoutInflater.inflate(R.layout.dialog_create_new, null)
|
private val view = activity.layoutInflater.inflate(R.layout.dialog_create_new, null)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@@ -3,6 +3,7 @@ package com.simplemobiletools.filemanager.dialogs
|
|||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||||
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
import com.simplemobiletools.commons.dialogs.FilePickerDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
@@ -11,7 +12,7 @@ import com.simplemobiletools.filemanager.activities.SimpleActivity
|
|||||||
import kotlinx.android.synthetic.main.dialog_save_as.view.*
|
import kotlinx.android.synthetic.main.dialog_save_as.view.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class SaveAsDialog(val activity: SimpleActivity, var path: String, val callback: (savePath: String) -> Unit) {
|
class SaveAsDialog(val activity: BaseSimpleActivity, var path: String, val callback: (savePath: String) -> Unit) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (path.isEmpty()) {
|
if (path.isEmpty()) {
|
||||||
|
@@ -13,7 +13,6 @@ import com.simplemobiletools.commons.dialogs.StoragePickerDialog
|
|||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.models.FileDirItem
|
import com.simplemobiletools.commons.models.FileDirItem
|
||||||
import com.simplemobiletools.commons.views.Breadcrumbs
|
import com.simplemobiletools.commons.views.Breadcrumbs
|
||||||
import com.simplemobiletools.commons.views.MyScalableRecyclerView
|
|
||||||
import com.simplemobiletools.filemanager.R
|
import com.simplemobiletools.filemanager.R
|
||||||
import com.simplemobiletools.filemanager.activities.MainActivity
|
import com.simplemobiletools.filemanager.activities.MainActivity
|
||||||
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
import com.simplemobiletools.filemanager.activities.SimpleActivity
|
||||||
@@ -132,20 +131,17 @@ class ItemsFragment : Fragment(), ItemsAdapter.ItemOperationsListener, Breadcrum
|
|||||||
storedItems = items
|
storedItems = items
|
||||||
val currAdapter = items_list.adapter
|
val currAdapter = items_list.adapter
|
||||||
if (currAdapter == null) {
|
if (currAdapter == null) {
|
||||||
items_list.apply {
|
val adapter = ItemsAdapter(activity as SimpleActivity, storedItems, this@ItemsFragment, items_list, isPickMultipleIntent) {
|
||||||
this.adapter = ItemsAdapter(activity as SimpleActivity, storedItems, this@ItemsFragment, isPickMultipleIntent) {
|
itemClicked(it as FileDirItem)
|
||||||
itemClicked(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
DividerItemDecoration(context, DividerItemDecoration.VERTICAL).apply {
|
|
||||||
setDrawable(context.resources.getDrawable(com.simplemobiletools.commons.R.drawable.divider))
|
|
||||||
addItemDecoration(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
isDragSelectionEnabled = true
|
|
||||||
}
|
}
|
||||||
|
adapter.setupDragListener(true)
|
||||||
|
|
||||||
|
DividerItemDecoration(context, DividerItemDecoration.VERTICAL).apply {
|
||||||
|
setDrawable(context.resources.getDrawable(com.simplemobiletools.commons.R.drawable.divider))
|
||||||
|
items_list.addItemDecoration(this)
|
||||||
|
}
|
||||||
|
items_list.adapter = adapter
|
||||||
items_fastscroller.setViews(items_list, items_swipe_refresh)
|
items_fastscroller.setViews(items_list, items_swipe_refresh)
|
||||||
setupRecyclerViewListener()
|
|
||||||
} else {
|
} else {
|
||||||
(currAdapter as ItemsAdapter).updateItems(storedItems)
|
(currAdapter as ItemsAdapter).updateItems(storedItems)
|
||||||
|
|
||||||
@@ -160,28 +156,6 @@ class ItemsFragment : Fragment(), ItemsAdapter.ItemOperationsListener, Breadcrum
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupRecyclerViewListener() {
|
|
||||||
mView.items_list?.listener = object : MyScalableRecyclerView.MyScalableRecyclerViewListener {
|
|
||||||
override fun zoomIn() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun zoomOut() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun selectItem(position: Int) {
|
|
||||||
getRecyclerAdapter().selectItem(position)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) {
|
|
||||||
getRecyclerAdapter().selectRange(initialSelection, lastDraggedIndex, minReached, maxReached)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getRecyclerAdapter() = (items_list.adapter as ItemsAdapter)
|
|
||||||
|
|
||||||
fun getScrollState() = getRecyclerLayoutManager().onSaveInstanceState()
|
fun getScrollState() = getRecyclerLayoutManager().onSaveInstanceState()
|
||||||
|
|
||||||
private fun getRecyclerLayoutManager() = (mView.items_list.layoutManager as LinearLayoutManager)
|
private fun getRecyclerLayoutManager() = (mView.items_list.layoutManager as LinearLayoutManager)
|
||||||
@@ -288,10 +262,6 @@ class ItemsFragment : Fragment(), ItemsAdapter.ItemOperationsListener, Breadcrum
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun itemLongClicked(position: Int) {
|
|
||||||
items_list.setDragSelectActive(position)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun selectedPaths(paths: ArrayList<String>) {
|
override fun selectedPaths(paths: ArrayList<String>) {
|
||||||
(activity as MainActivity).pickedPaths(paths)
|
(activity as MainActivity).pickedPaths(paths)
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="@dimen/activity_margin"/>
|
android:padding="@dimen/activity_margin"/>
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyScalableRecyclerView
|
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
android:id="@+id/items_list"
|
android:id="@+id/items_list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@@ -1,10 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/item_frame"
|
android:id="@+id/item_frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
android:foreground="@drawable/selector">
|
android:foreground="@drawable/selector">
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
@@ -30,7 +33,7 @@
|
|||||||
android:maxLines="3"
|
android:maxLines="3"
|
||||||
android:paddingLeft="@dimen/small_margin"
|
android:paddingLeft="@dimen/small_margin"
|
||||||
android:paddingTop="@dimen/small_margin"
|
android:paddingTop="@dimen/small_margin"
|
||||||
android:text="Directory"/>
|
tools:text="Directory"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/item_details"
|
android:id="@+id/item_details"
|
||||||
@@ -39,8 +42,8 @@
|
|||||||
android:layout_below="@+id/item_name"
|
android:layout_below="@+id/item_name"
|
||||||
android:layout_toRightOf="@+id/item_icon"
|
android:layout_toRightOf="@+id/item_icon"
|
||||||
android:paddingLeft="@dimen/small_margin"
|
android:paddingLeft="@dimen/small_margin"
|
||||||
android:text="1 KB"
|
android:textSize="@dimen/smaller_text_size"
|
||||||
android:textSize="@dimen/smaller_text_size"/>
|
tools:text="1 KB"/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
Reference in New Issue
Block a user