updating Commons with AndroidX and recyclerview-selector

This commit is contained in:
tibbi
2018-10-09 23:09:52 +02:00
parent 1fa30b26d0
commit f00f0e1e60
18 changed files with 139 additions and 123 deletions

View File

@ -22,7 +22,7 @@ android {
buildTypes { buildTypes {
debug { debug {
applicationIdSuffix ".debug" applicationIdSuffix ".debug"
} }
release { release {
minifyEnabled true minifyEnabled true
@ -42,7 +42,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:4.8.8' implementation 'com.simplemobiletools:commons:4.9.18'
implementation files('../libs/RootTools.jar') implementation files('../libs/RootTools.jar')
} }

View File

@ -99,7 +99,7 @@
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/> android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<provider <provider
android:name="android.support.v4.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
android:exported="false" android:exported="false"
android:grantUriPermissions="true"> android:grantUriPermissions="true">

View File

@ -37,6 +37,7 @@ class FavoritesActivity : SimpleActivity(), RefreshRecyclerViewListener {
ManageFavoritesAdapter(this, favorites, this, manage_favorites_list) { }.apply { ManageFavoritesAdapter(this, favorites, this, manage_favorites_list) { }.apply {
manage_favorites_list.adapter = this manage_favorites_list.adapter = this
initSelectionTracker()
} }
} }

View File

@ -8,10 +8,10 @@ import android.content.Intent
import android.media.RingtoneManager import android.media.RingtoneManager
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.support.v4.view.MenuItemCompat
import android.support.v7.widget.SearchView
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
@ -26,7 +26,7 @@ import com.simplemobiletools.filemanager.fragments.ItemsFragment
import com.simplemobiletools.filemanager.helpers.RootHelpers import com.simplemobiletools.filemanager.helpers.RootHelpers
import com.stericson.RootTools.RootTools import com.stericson.RootTools.RootTools
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.items_fragment.* import kotlinx.android.synthetic.main.items_fragment.view.*
import java.io.File import java.io.File
import java.util.* import java.util.*
@ -258,7 +258,7 @@ class MainActivity : SimpleActivity() {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (fragment.breadcrumbs.childCount <= 1) { if (fragment.mView.breadcrumbs.childCount <= 1) {
if (!wasBackJustPressed) { if (!wasBackJustPressed) {
wasBackJustPressed = true wasBackJustPressed = true
toast(R.string.press_back_again) toast(R.string.press_back_again)
@ -269,8 +269,8 @@ class MainActivity : SimpleActivity() {
finish() finish()
} }
} else { } else {
fragment.breadcrumbs.removeBreadcrumb() fragment.mView.breadcrumbs.removeBreadcrumb()
openPath(fragment.breadcrumbs.getLastItem().path) openPath(fragment.mView.breadcrumbs.getLastItem().path)
} }
} }

View File

@ -4,10 +4,10 @@ import android.app.SearchManager
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.support.v4.view.MenuItemCompat
import android.support.v7.widget.SearchView
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
@ -62,7 +62,7 @@ class ReadTextActivity : SimpleActivity() {
(searchMenuItem!!.actionView as SearchView).apply { (searchMenuItem!!.actionView as SearchView).apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName)) setSearchableInfo(searchManager.getSearchableInfo(componentName))
isSubmitButtonEnabled = false isSubmitButtonEnabled = false
setOnQueryTextListener(object : android.support.v7.widget.SearchView.OnQueryTextListener { setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String) = false override fun onQueryTextSubmit(query: String) = false
override fun onQueryTextChange(newText: String): Boolean { override fun onQueryTextChange(newText: String): Boolean {

View File

@ -17,6 +17,7 @@ import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE
import com.simplemobiletools.commons.helpers.CONFLICT_SKIP import com.simplemobiletools.commons.helpers.CONFLICT_SKIP
import com.simplemobiletools.commons.helpers.FileDirItemKeyProvider
import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
@ -50,7 +51,6 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
var adjustedPrimaryColor = activity.getAdjustedPrimaryColor() var adjustedPrimaryColor = activity.getAdjustedPrimaryColor()
init { init {
setupDragListener(true)
initDrawables() initDrawables()
} }
@ -59,7 +59,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
override fun prepareActionMode(menu: Menu) { override fun prepareActionMode(menu: Menu) {
menu.apply { menu.apply {
findItem(R.id.cab_rename).isVisible = isOneItemSelected() findItem(R.id.cab_rename).isVisible = isOneItemSelected()
findItem(R.id.cab_decompress).isVisible = getSelectedMedia().map { it.path }.any { it.isZipFile() } findItem(R.id.cab_decompress).isVisible = getSelectedFileDirItems().map { it.path }.any { it.isZipFile() }
findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent
findItem(R.id.cab_copy_path).isVisible = isOneItemSelected() findItem(R.id.cab_copy_path).isVisible = isOneItemSelected()
findItem(R.id.cab_open_with).isVisible = isOneFileSelected() findItem(R.id.cab_open_with).isVisible = isOneFileSelected()
@ -70,14 +70,8 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
} }
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {
if (selectedPositions.isEmpty()) { if (getSelectedKeys().isEmpty) {
return return
} }
@ -105,18 +99,24 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
override fun getIsItemSelectable(position: Int) = true override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = fileDirItems[position].path
override fun getItemSelectionKeyProvider() = FileDirItemKeyProvider(fileDirItems)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.list_item, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.list_item, parent)
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val fileDirItem = fileDirItems[position] val fileDirItem = fileDirItems[position]
val view = holder.bindView(fileDirItem, true, true) { itemView, layoutPosition -> holder.bindView(fileDirItem, true, true) { itemView, layoutPosition ->
setupView(itemView, fileDirItem) setupView(itemView, fileDirItem, isKeySelected(fileDirItem.path))
} }
bindViewHolder(holder, position, view) bindViewHolder(holder)
} }
override fun getItemCount() = fileDirItems.size override fun getItemCount() = fileDirItems.size
private fun getItemWithKey(key: String): FileDirItem? = fileDirItems.firstOrNull { it.path == key }
fun initDrawables() { 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)
@ -124,12 +124,12 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
fileDrawable.alpha = 180 fileDrawable.alpha = 180
} }
private fun isOneFileSelected() = isOneItemSelected() && !fileDirItems[selectedPositions.first()].isDirectory private fun isOneFileSelected() = isOneItemSelected() && getItemWithKey(getSelectedKeys().first())?.isDirectory == false
private fun checkHideBtnVisibility(menu: Menu) { private fun checkHideBtnVisibility(menu: Menu) {
var hiddenCnt = 0 var hiddenCnt = 0
var unhiddenCnt = 0 var unhiddenCnt = 0
selectedPositions.mapNotNull { fileDirItems.getOrNull(it)?.name }.forEach { getSelectedFileDirItems().map { it.name }.forEach {
if (it.startsWith(".")) { if (it.startsWith(".")) {
hiddenCnt++ hiddenCnt++
} else { } else {
@ -142,14 +142,14 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun confirmSelection() { private fun confirmSelection() {
if (selectedPositions.isNotEmpty()) { if (!getSelectedKeys().isEmpty) {
val paths = getSelectedMedia().filter { !it.isDirectory }.map { it.path } as ArrayList<String> val paths = getSelectedFileDirItems().filter { !it.isDirectory }.map { it.path } as ArrayList<String>
listener?.selectedPaths(paths) listener?.selectedPaths(paths)
} }
} }
private fun displayRenameDialog() { private fun displayRenameDialog() {
val oldPath = getSelectedMedia()[0].path val oldPath = getSelectedFileDirItems()[0].path
RenameItemDialog(activity, oldPath) { RenameItemDialog(activity, oldPath) {
activity.config.moveFavorite(oldPath, it) activity.config.moveFavorite(oldPath, it)
activity.runOnUiThread { activity.runOnUiThread {
@ -160,17 +160,16 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun showProperties() { private fun showProperties() {
if (selectedPositions.size <= 1) { if (getSelectedKeys().size() <= 1) {
PropertiesDialog(activity, fileDirItems[selectedPositions.first()].path, activity.config.shouldShowHidden) PropertiesDialog(activity, getFirstSelectedItemPath(), activity.config.shouldShowHidden)
} else { } else {
val paths = ArrayList<String>() val paths = getSelectedFileDirItems().map { it.path }
selectedPositions.forEach { paths.add(fileDirItems[it].path) }
PropertiesDialog(activity, paths, activity.config.shouldShowHidden) PropertiesDialog(activity, paths, activity.config.shouldShowHidden)
} }
} }
private fun shareFiles() { private fun shareFiles() {
val selectedItems = getSelectedMedia() val selectedItems = getSelectedFileDirItems()
val paths = ArrayList<String>(selectedItems.size) val paths = ArrayList<String>(selectedItems.size)
selectedItems.forEach { selectedItems.forEach {
addFileUris(it.path, paths) addFileUris(it.path, paths)
@ -180,7 +179,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
private fun toggleFileVisibility(hide: Boolean) { private fun toggleFileVisibility(hide: Boolean) {
Thread { Thread {
getSelectedMedia().forEach { getSelectedFileDirItems().forEach {
activity.toggleItemVisibility(it.path, hide) activity.toggleItemVisibility(it.path, hide)
} }
activity.runOnUiThread { activity.runOnUiThread {
@ -194,7 +193,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
if (activity.getIsPathDirectory(path)) { if (activity.getIsPathDirectory(path)) {
val shouldShowHidden = activity.config.shouldShowHidden val shouldShowHidden = activity.config.shouldShowHidden
if (path.startsWith(OTG_PATH)) { if (path.startsWith(OTG_PATH)) {
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith(".") }?.forEach { activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
addFileUris(it.uri.toString(), paths) addFileUris(it.uri.toString(), paths)
} }
} else { } else {
@ -208,19 +207,18 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun copyPath() { private fun copyPath() {
val path = getSelectedMedia().first().path val clip = ClipData.newPlainText(activity.getString(R.string.app_name), getFirstSelectedItemPath())
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
finishActMode() finishActMode()
activity.toast(R.string.path_copied) activity.toast(R.string.path_copied)
} }
private fun setAs() { private fun setAs() {
activity.setAs(getSelectedMedia().first().path) activity.setAs(getFirstSelectedItemPath())
} }
private fun openWith() { private fun openWith() {
activity.tryOpenPathIntent(getSelectedMedia().first().path, true) activity.tryOpenPathIntent(getFirstSelectedItemPath(), true)
} }
private fun openAs() { private fun openAs() {
@ -233,16 +231,12 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
RadioItem(OPEN_AS_OTHER, res.getString(R.string.other_file))) RadioItem(OPEN_AS_OTHER, res.getString(R.string.other_file)))
RadioGroupDialog(activity, items) { RadioGroupDialog(activity, items) {
activity.tryOpenPathIntent(getSelectedMedia().first().path, false, it as Int) activity.tryOpenPathIntent(getFirstSelectedItemPath(), false, it as Int)
} }
} }
private fun copyMoveTo(isCopyOperation: Boolean) { private fun copyMoveTo(isCopyOperation: Boolean) {
val files = ArrayList<FileDirItem>() val files = getSelectedFileDirItems()
selectedPositions.forEach {
files.add(fileDirItems[it])
}
val firstFile = files[0] val firstFile = files[0]
val source = if (firstFile.isDirectory) firstFile.path else firstFile.getParentPath() val source = if (firstFile.isDirectory) firstFile.path else firstFile.getParentPath()
FilePickerDialog(activity, source, false, activity.config.shouldShowHidden, true) { FilePickerDialog(activity, source, false, activity.config.shouldShowHidden, true) {
@ -277,7 +271,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun compressSelection() { private fun compressSelection() {
val firstPath = fileDirItems[selectedPositions.first()].path val firstPath = getFirstSelectedItemPath()
if (firstPath.startsWith(OTG_PATH)) { if (firstPath.startsWith(OTG_PATH)) {
activity.toast(R.string.unknown_error_occurred) activity.toast(R.string.unknown_error_occurred)
return return
@ -286,7 +280,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
CompressAsDialog(activity, firstPath) { CompressAsDialog(activity, firstPath) {
activity.handleSAFDialog(firstPath) { activity.handleSAFDialog(firstPath) {
activity.toast(R.string.compressing) activity.toast(R.string.compressing)
val paths = selectedPositions.map { fileDirItems[it].path } val paths = getSelectedFileDirItems().map { it.path }
Thread { Thread {
if (compressPaths(paths, it)) { if (compressPaths(paths, it)) {
activity.runOnUiThread { activity.runOnUiThread {
@ -303,14 +297,14 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun decompressSelection() { private fun decompressSelection() {
val firstPath = fileDirItems[selectedPositions.first()].path val firstPath = getFirstSelectedItemPath()
if (firstPath.startsWith(OTG_PATH)) { if (firstPath.startsWith(OTG_PATH)) {
activity.toast(R.string.unknown_error_occurred) activity.toast(R.string.unknown_error_occurred)
return return
} }
activity.handleSAFDialog(firstPath) { activity.handleSAFDialog(firstPath) {
val paths = selectedPositions.map { fileDirItems[it].path }.filter { it.isZipFile() } val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
tryDecompressingPaths(paths) { tryDecompressingPaths(paths) {
if (it) { if (it) {
activity.toast(R.string.decompression_successful) activity.toast(R.string.decompression_successful)
@ -476,7 +470,8 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun askConfirmDelete() { private fun askConfirmDelete() {
val items = resources.getQuantityString(R.plurals.delete_items, selectedPositions.size, selectedPositions.size) val selectionSize = getSelectedKeys().size()
val items = resources.getQuantityString(R.plurals.delete_items, selectionSize, selectionSize)
val question = String.format(resources.getString(R.string.deletion_confirmation), items) val question = String.format(resources.getString(R.string.deletion_confirmation), items)
ConfirmationDialog(activity, question) { ConfirmationDialog(activity, question) {
deleteFiles() deleteFiles()
@ -484,37 +479,50 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
} }
private fun deleteFiles() { private fun deleteFiles() {
if (selectedPositions.isEmpty()) { val selectedKeys = getSelectedKeys()
if (selectedKeys.isEmpty) {
return return
} }
val files = ArrayList<FileDirItem>(selectedPositions.size) val SAFPath = getFirstSelectedItemPath()
val removeFiles = ArrayList<FileDirItem>(selectedPositions.size)
val SAFPath = fileDirItems[selectedPositions.first()].path
if (activity.isPathOnRoot(SAFPath) && !RootTools.isRootAvailable()) { if (activity.isPathOnRoot(SAFPath) && !RootTools.isRootAvailable()) {
activity.toast(R.string.rooted_device_only) activity.toast(R.string.rooted_device_only)
return return
} }
activity.handleSAFDialog(SAFPath) { activity.handleSAFDialog(SAFPath) {
selectedPositions.sortedDescending().forEach { val files = ArrayList<FileDirItem>(selectedKeys.size())
val file = fileDirItems[it] val positions = ArrayList<Int>()
files.add(file) getSelectedKeys().forEach {
removeFiles.add(file) activity.config.removeFavorite(it)
activity.config.removeFavorite(file.path) val key = it
val position = fileDirItems.indexOfFirst { it.path == key }
if (position != -1) {
positions.add(position)
files.add(fileDirItems[position])
}
} }
fileDirItems.removeAll(removeFiles) positions.sortDescending()
removeSelectedItems(positions)
listener?.deleteFiles(files) listener?.deleteFiles(files)
removeSelectedItems() positions.forEach {
fileDirItems.removeAt(it)
}
} }
} }
private fun getSelectedMedia(): List<FileDirItem> { private fun getFirstSelectedItemPath() = getSelectedFileDirItems().first().path
val selectedMedia = ArrayList<FileDirItem>(selectedPositions.size)
selectedPositions.forEach { selectedMedia.add(fileDirItems[it]) } private fun getSelectedFileDirItems(): ArrayList<FileDirItem> {
return selectedMedia val selectedKeys = getSelectedKeys()
val selectedFileDirItems = ArrayList<FileDirItem>(selectedKeys.size())
selectedKeys.forEach {
getItemWithKey(it)?.apply {
selectedFileDirItems.add(this)
}
}
return selectedFileDirItems
} }
fun updateItems(newItems: ArrayList<FileDirItem>, highlightText: String = "") { fun updateItems(newItems: ArrayList<FileDirItem>, highlightText: String = "") {
@ -534,12 +542,13 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList<FileD
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isActivityDestroyed()) { if (!activity.isActivityDestroyed()) {
Glide.with(activity).clear(holder.itemView?.item_icon!!) Glide.with(activity).clear(holder.itemView.item_icon!!)
} }
} }
private fun setupView(view: View, fileDirItem: FileDirItem) { private fun setupView(view: View, fileDirItem: FileDirItem, isSelected: Boolean) {
view.apply { view.apply {
item_frame.isSelected = isSelected
val fileName = fileDirItem.name val fileName = fileDirItem.name
item_name.text = if (textToHighlight.isEmpty()) fileName else fileName.highlightTextPart(textToHighlight, adjustedPrimaryColor) item_name.text = if (textToHighlight.isEmpty()) fileName else fileName.highlightTextPart(textToHighlight, adjustedPrimaryColor)
item_name.setTextColor(textColor) item_name.setTextColor(textColor)

View File

@ -5,31 +5,21 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.helpers.StringListKeyProvider
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.extensions.config import com.simplemobiletools.filemanager.extensions.config
import kotlinx.android.synthetic.main.item_manage_favorite.view.* import kotlinx.android.synthetic.main.item_manage_favorite.view.*
import java.util.*
class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?, class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
private val config = activity.config private val config = activity.config
init {
setupDragListener(true)
}
override fun getActionMenuId() = R.menu.cab_remove_only override fun getActionMenuId() = R.menu.cab_remove_only
override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.manage_favorite_holder?.isSelected = select
}
override fun actionItemPressed(id: Int) { override fun actionItemPressed(id: Int) {
when (id) { when (id) {
R.id.cab_remove -> removeSelection() R.id.cab_remove -> removeSelection()
@ -40,38 +30,53 @@ class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayL
override fun getIsItemSelectable(position: Int) = true override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = favorites[position]
override fun getItemSelectionKeyProvider() = StringListKeyProvider(favorites)
override fun prepareActionMode(menu: Menu) {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_favorite, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_favorite, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val favorite = favorites[position] val favorite = favorites[position]
val view = holder.bindView(favorite, true, true) { itemView, layoutPosition -> holder.bindView(favorite, true, true) { itemView, layoutPosition ->
setupView(itemView, favorite) setupView(itemView, favorite, isKeySelected(favorite))
} }
bindViewHolder(holder, position, view) bindViewHolder(holder)
} }
override fun getItemCount() = favorites.size override fun getItemCount() = favorites.size
private fun setupView(view: View, favorite: String) { private fun setupView(view: View, favorite: String, isSelected: Boolean) {
view.apply { view.apply {
manage_favorite_title.apply { manage_favorite_title.apply {
text = favorite text = favorite
setTextColor(config.textColor) setTextColor(config.textColor)
} }
manage_favorite_holder?.isSelected = isSelected
} }
} }
private fun removeSelection() { private fun removeSelection() {
val removeFavorites = ArrayList<String>(selectedPositions.size) val selectedKeys = getSelectedKeys()
val removeFavorites = ArrayList<String>(selectedKeys.size())
selectedPositions.sortedDescending().forEach { val positions = java.util.ArrayList<Int>()
val favorite = favorites[it] getSelectedKeys().forEach {
removeFavorites.add(favorite) val key = it
config.removeFavorite(favorite) val position = favorites.indexOfFirst { it == key }
if (position != -1) {
positions.add(position)
removeFavorites.add(key)
config.removeFavorite(key)
}
} }
positions.sortDescending()
removeSelectedItems(positions)
favorites.removeAll(removeFavorites) favorites.removeAll(removeFavorites)
removeSelectedItems()
if (favorites.isEmpty()) { if (favorites.isEmpty()) {
listener?.refreshItems() listener?.refreshItems()
} }

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.filemanager.dialogs package com.simplemobiletools.filemanager.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity 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.*
@ -17,7 +17,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val path: String = "
view.sorting_dialog_use_for_this_folder.isChecked = config.hasCustomSorting(path) view.sorting_dialog_use_for_this_folder.isChecked = config.hasCustomSorting(path)
AlertDialog.Builder(activity) AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.create().apply { .create().apply {
activity.setupDialogStuff(view, this, R.string.sort_by) activity.setupDialogStuff(view, this, R.string.sort_by)

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.filemanager.dialogs package com.simplemobiletools.filemanager.dialogs
import android.support.v7.app.AlertDialog
import android.view.View import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity 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.*

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.filemanager.dialogs package com.simplemobiletools.filemanager.dialogs
import android.support.v7.app.AlertDialog
import android.view.View import android.view.View
import androidx.appcompat.app.AlertDialog
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

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.filemanager.dialogs package com.simplemobiletools.filemanager.dialogs
import android.support.v7.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity 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

View File

@ -3,7 +3,7 @@ package com.simplemobiletools.filemanager.extensions
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.support.v4.content.FileProvider import androidx.core.content.FileProvider
import com.simplemobiletools.commons.R import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*

View File

@ -2,11 +2,10 @@ package com.simplemobiletools.filemanager.fragments
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.StoragePickerDialog import com.simplemobiletools.commons.dialogs.StoragePickerDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -14,6 +13,7 @@ import com.simplemobiletools.commons.helpers.OTG_PATH
import com.simplemobiletools.commons.helpers.SORT_BY_SIZE import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
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.MyLinearLayoutManager
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
@ -25,7 +25,6 @@ import com.simplemobiletools.filemanager.extensions.tryOpenPathIntent
import com.simplemobiletools.filemanager.helpers.PATH import com.simplemobiletools.filemanager.helpers.PATH
import com.simplemobiletools.filemanager.helpers.RootHelpers import com.simplemobiletools.filemanager.helpers.RootHelpers
import com.simplemobiletools.filemanager.interfaces.ItemOperationsListener import com.simplemobiletools.filemanager.interfaces.ItemOperationsListener
import kotlinx.android.synthetic.main.items_fragment.*
import kotlinx.android.synthetic.main.items_fragment.view.* import kotlinx.android.synthetic.main.items_fragment.view.*
import java.io.File import java.io.File
import java.util.HashMap import java.util.HashMap
@ -46,7 +45,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
private var storedItems = ArrayList<FileDirItem>() private var storedItems = ArrayList<FileDirItem>()
private var storedTextColor = 0 private var storedTextColor = 0
private lateinit var mView: View lateinit var mView: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mView = inflater.inflate(R.layout.items_fragment, container, false)!! mView = inflater.inflate(R.layout.items_fragment, container, false)!!
@ -91,8 +90,8 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
storedTextColor = newTextColor storedTextColor = newTextColor
} }
items_fastscroller.updateBubbleColors() mView.items_fastscroller.updateBubbleColors()
items_fastscroller.allowBubbleDisplay = context!!.config.showInfoBubble mView.items_fastscroller.allowBubbleDisplay = context!!.config.showInfoBubble
if (!isFirstResume) { if (!isFirstResume) {
refreshItems() refreshItems()
} }
@ -121,7 +120,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
realPath = "/" realPath = "/"
} }
scrollStates[currentPath] = getScrollState() scrollStates[currentPath] = getScrollState()!!
currentPath = realPath currentPath = realPath
showHidden = context!!.config.shouldShowHidden showHidden = context!!.config.shouldShowHidden
getItems(currentPath) { originalPath, fileDirItems -> getItems(currentPath) { originalPath, fileDirItems ->
@ -153,9 +152,10 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
}.apply { }.apply {
addVerticalDividers(true) addVerticalDividers(true)
items_list.adapter = this items_list.adapter = this
initSelectionTracker()
} }
items_fastscroller.allowBubbleDisplay = context.config.showInfoBubble items_fastscroller.allowBubbleDisplay = context.config.showInfoBubble
items_fastscroller.setViews(items_list, items_swipe_refresh) { items_fastscroller.setViews(items_list, mView.items_swipe_refresh) {
items_fastscroller.updateBubbleText(storedItems.getOrNull(it)?.getBubbleText() ?: "") items_fastscroller.updateBubbleText(storedItems.getOrNull(it)?.getBubbleText() ?: "")
} }
@ -169,7 +169,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
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 MyLinearLayoutManager)
private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<FileDirItem>) -> Unit) { private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<FileDirItem>) -> Unit) {
skipItemUpdating = false skipItemUpdating = false
@ -280,15 +280,16 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
} }
} }
private fun getRecyclerAdapter() = items_list.adapter as? ItemsAdapter private fun getRecyclerAdapter() = mView.items_list.adapter as? ItemsAdapter
override fun breadcrumbClicked(id: Int) { override fun breadcrumbClicked(id: Int) {
if (id == 0) { if (id == 0) {
StoragePickerDialog(activity as SimpleActivity, currentPath) { StoragePickerDialog(activity as SimpleActivity, currentPath) {
getRecyclerAdapter()?.finishActMode()
openPath(it) openPath(it)
} }
} else { } else {
val item = breadcrumbs.getChildAt(id).tag as FileDirItem val item = mView.breadcrumbs.getChildAt(id).tag as FileDirItem
openPath(item.path) openPath(item.path)
} }
} }

View File

@ -11,15 +11,15 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clipToPadding="false" android:clipToPadding="false"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/> app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/manage_favorites_placeholder" android:id="@+id/manage_favorites_placeholder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/small_margin"
android:layout_marginTop="@dimen/activity_margin" android:layout_marginTop="@dimen/activity_margin"
android:layout_marginBottom="@dimen/small_margin"
android:gravity="center" android:gravity="center"
android:lineSpacingExtra="@dimen/tiny_margin" android:lineSpacingExtra="@dimen/tiny_margin"
android:paddingLeft="@dimen/activity_margin" android:paddingLeft="@dimen/activity_margin"

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/items_holder" android:id="@+id/items_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/items_swipe_refresh" android:id="@+id/items_swipe_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -29,23 +29,23 @@
android:layout_below="@+id/breadcrumbs" android:layout_below="@+id/breadcrumbs"
android:clipToPadding="false" android:clipToPadding="false"
android:scrollbars="none" android:scrollbars="none"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/> app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
<com.simplemobiletools.commons.views.FastScroller <com.simplemobiletools.commons.views.FastScroller
android:id="@+id/items_fastscroller" android:id="@+id/items_fastscroller"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@+id/breadcrumbs"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_below="@+id/breadcrumbs" android:paddingStart="@dimen/normal_margin"
android:paddingLeft="@dimen/normal_margin" android:paddingLeft="@dimen/normal_margin">
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical"/> <include layout="@layout/fastscroller_handle_vertical"/>
</com.simplemobiletools.commons.views.FastScroller> </com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout> </RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.simplemobiletools.commons.views.MyFloatingActionButton <com.simplemobiletools.commons.views.MyFloatingActionButton
android:id="@+id/items_fab" android:id="@+id/items_fab"
@ -55,4 +55,4 @@
android:layout_margin="@dimen/activity_margin" android:layout_margin="@dimen/activity_margin"
android:src="@drawable/ic_plus"/> android:src="@drawable/ic_plus"/>
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -5,7 +5,7 @@
android:id="@+id/search" android:id="@+id/search"
android:icon="@drawable/ic_search" android:icon="@drawable/ic_search"
android:title="@string/search" android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"/> app:showAsAction="collapseActionView|ifRoom"/>
<item <item
android:id="@+id/go_home" android:id="@+id/go_home"

View File

@ -5,7 +5,7 @@
android:id="@+id/search" android:id="@+id/search"
android:icon="@drawable/ic_search" android:icon="@drawable/ic_search"
android:title="@string/search" android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"/> app:showAsAction="collapseActionView|ifRoom"/>
<item <item
android:id="@+id/menu_save" android:id="@+id/menu_save"

View File

@ -4,8 +4,8 @@ buildscript {
ext.kotlin_version = '1.2.71' ext.kotlin_version = '1.2.71'
repositories { repositories {
jcenter()
google() google()
jcenter()
} }
dependencies { dependencies {
@ -19,8 +19,8 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
jcenter()
google() google()
jcenter()
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
} }
} }