diff --git a/app/build.gradle b/app/build.gradle index 578c4a33..78028ce3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { buildTypes { debug { - applicationIdSuffix ".debug" + applicationIdSuffix ".debug" } release { minifyEnabled true @@ -42,7 +42,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:4.8.8' + implementation 'com.simplemobiletools:commons:4.9.18' implementation files('../libs/RootTools.jar') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8f9c9838..73cac9e2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -99,7 +99,7 @@ android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/> diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/FavoritesActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/FavoritesActivity.kt index 91e85cf5..4f3084d0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/FavoritesActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/FavoritesActivity.kt @@ -37,6 +37,7 @@ class FavoritesActivity : SimpleActivity(), RefreshRecyclerViewListener { ManageFavoritesAdapter(this, favorites, this, manage_favorites_list) { }.apply { manage_favorites_list.adapter = this + initSelectionTracker() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt index cd7d9a0d..897fee25 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt @@ -8,10 +8,10 @@ import android.content.Intent import android.media.RingtoneManager import android.os.Bundle import android.os.Handler -import android.support.v4.view.MenuItemCompat -import android.support.v7.widget.SearchView import android.view.Menu import android.view.MenuItem +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuItemCompat import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* @@ -26,7 +26,7 @@ import com.simplemobiletools.filemanager.fragments.ItemsFragment import com.simplemobiletools.filemanager.helpers.RootHelpers import com.stericson.RootTools.RootTools 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.util.* @@ -258,7 +258,7 @@ class MainActivity : SimpleActivity() { } override fun onBackPressed() { - if (fragment.breadcrumbs.childCount <= 1) { + if (fragment.mView.breadcrumbs.childCount <= 1) { if (!wasBackJustPressed) { wasBackJustPressed = true toast(R.string.press_back_again) @@ -269,8 +269,8 @@ class MainActivity : SimpleActivity() { finish() } } else { - fragment.breadcrumbs.removeBreadcrumb() - openPath(fragment.breadcrumbs.getLastItem().path) + fragment.mView.breadcrumbs.removeBreadcrumb() + openPath(fragment.mView.breadcrumbs.getLastItem().path) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/ReadTextActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/ReadTextActivity.kt index 1819d222..e1b0ef94 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/ReadTextActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/ReadTextActivity.kt @@ -4,10 +4,10 @@ import android.app.SearchManager import android.content.Context import android.net.Uri import android.os.Bundle -import android.support.v4.view.MenuItemCompat -import android.support.v7.widget.SearchView import android.view.Menu import android.view.MenuItem +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuItemCompat import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.REAL_FILE_PATH @@ -62,7 +62,7 @@ class ReadTextActivity : SimpleActivity() { (searchMenuItem!!.actionView as SearchView).apply { setSearchableInfo(searchManager.getSearchableInfo(componentName)) isSubmitButtonEnabled = false - setOnQueryTextListener(object : android.support.v7.widget.SearchView.OnQueryTextListener { + setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String) = false override fun onQueryTextChange(newText: String): Boolean { diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt index 86d05652..1684ae03 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt @@ -17,6 +17,7 @@ import com.simplemobiletools.commons.dialogs.* import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE import com.simplemobiletools.commons.helpers.CONFLICT_SKIP +import com.simplemobiletools.commons.helpers.FileDirItemKeyProvider import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.RadioItem @@ -50,7 +51,6 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList - setupView(itemView, fileDirItem) + holder.bindView(fileDirItem, true, true) { itemView, layoutPosition -> + setupView(itemView, fileDirItem, isKeySelected(fileDirItem.path)) } - bindViewHolder(holder, position, view) + bindViewHolder(holder) } override fun getItemCount() = fileDirItems.size + private fun getItemWithKey(key: String): FileDirItem? = fileDirItems.firstOrNull { it.path == key } + fun initDrawables() { folderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_folder, textColor) fileDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_file, textColor) @@ -124,12 +124,12 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList + if (!getSelectedKeys().isEmpty) { + val paths = getSelectedFileDirItems().filter { !it.isDirectory }.map { it.path } as ArrayList listener?.selectedPaths(paths) } } private fun displayRenameDialog() { - val oldPath = getSelectedMedia()[0].path + val oldPath = getSelectedFileDirItems()[0].path RenameItemDialog(activity, oldPath) { activity.config.moveFavorite(oldPath, it) activity.runOnUiThread { @@ -160,17 +160,16 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList() - selectedPositions.forEach { paths.add(fileDirItems[it].path) } + val paths = getSelectedFileDirItems().map { it.path } PropertiesDialog(activity, paths, activity.config.shouldShowHidden) } } private fun shareFiles() { - val selectedItems = getSelectedMedia() + val selectedItems = getSelectedFileDirItems() val paths = ArrayList(selectedItems.size) selectedItems.forEach { addFileUris(it.path, paths) @@ -180,7 +179,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList() - selectedPositions.forEach { - files.add(fileDirItems[it]) - } - + val files = getSelectedFileDirItems() val firstFile = files[0] val source = if (firstFile.isDirectory) firstFile.path else firstFile.getParentPath() FilePickerDialog(activity, source, false, activity.config.shouldShowHidden, true) { @@ -277,7 +271,7 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList(selectedPositions.size) - val removeFiles = ArrayList(selectedPositions.size) - val SAFPath = fileDirItems[selectedPositions.first()].path - + val SAFPath = getFirstSelectedItemPath() if (activity.isPathOnRoot(SAFPath) && !RootTools.isRootAvailable()) { activity.toast(R.string.rooted_device_only) return } activity.handleSAFDialog(SAFPath) { - selectedPositions.sortedDescending().forEach { - val file = fileDirItems[it] - files.add(file) - removeFiles.add(file) - activity.config.removeFavorite(file.path) + val files = ArrayList(selectedKeys.size()) + val positions = ArrayList() + getSelectedKeys().forEach { + activity.config.removeFavorite(it) + 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) - removeSelectedItems() + positions.forEach { + fileDirItems.removeAt(it) + } } } - private fun getSelectedMedia(): List { - val selectedMedia = ArrayList(selectedPositions.size) - selectedPositions.forEach { selectedMedia.add(fileDirItems[it]) } - return selectedMedia + private fun getFirstSelectedItemPath() = getSelectedFileDirItems().first().path + + private fun getSelectedFileDirItems(): ArrayList { + val selectedKeys = getSelectedKeys() + val selectedFileDirItems = ArrayList(selectedKeys.size()) + selectedKeys.forEach { + getItemWithKey(it)?.apply { + selectedFileDirItems.add(this) + } + } + return selectedFileDirItems } fun updateItems(newItems: ArrayList, highlightText: String = "") { @@ -534,12 +542,13 @@ class ItemsAdapter(activity: SimpleActivity, var fileDirItems: MutableList, val listener: RefreshRecyclerViewListener?, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { private val config = activity.config - init { - setupDragListener(true) - } - 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) { when (id) { R.id.cab_remove -> removeSelection() @@ -40,38 +30,53 @@ class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayL 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 onBindViewHolder(holder: ViewHolder, position: Int) { val favorite = favorites[position] - val view = holder.bindView(favorite, true, true) { itemView, layoutPosition -> - setupView(itemView, favorite) + holder.bindView(favorite, true, true) { itemView, layoutPosition -> + setupView(itemView, favorite, isKeySelected(favorite)) } - bindViewHolder(holder, position, view) + bindViewHolder(holder) } override fun getItemCount() = favorites.size - private fun setupView(view: View, favorite: String) { + private fun setupView(view: View, favorite: String, isSelected: Boolean) { view.apply { manage_favorite_title.apply { text = favorite setTextColor(config.textColor) } + + manage_favorite_holder?.isSelected = isSelected } } private fun removeSelection() { - val removeFavorites = ArrayList(selectedPositions.size) - - selectedPositions.sortedDescending().forEach { - val favorite = favorites[it] - removeFavorites.add(favorite) - config.removeFavorite(favorite) + val selectedKeys = getSelectedKeys() + val removeFavorites = ArrayList(selectedKeys.size()) + val positions = java.util.ArrayList() + getSelectedKeys().forEach { + val key = it + 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) - removeSelectedItems() if (favorites.isEmpty()) { listener?.refreshItems() } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/ChangeSortingDialog.kt index 96ed956f..a34db848 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/ChangeSortingDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/ChangeSortingDialog.kt @@ -1,6 +1,6 @@ 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.extensions.setupDialogStuff 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) AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this, R.string.sort_by) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CompressAsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CompressAsDialog.kt index c0828778..76a072c5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CompressAsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CompressAsDialog.kt @@ -1,7 +1,7 @@ package com.simplemobiletools.filemanager.dialogs -import android.support.v7.app.AlertDialog import android.view.View +import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.extensions.* diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt index d46770bb..f68f5248 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt @@ -1,7 +1,7 @@ package com.simplemobiletools.filemanager.dialogs -import android.support.v7.app.AlertDialog import android.view.View +import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.activities.SimpleActivity diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/SaveAsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/SaveAsDialog.kt index 5d858a6c..925b0fc5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/SaveAsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/SaveAsDialog.kt @@ -1,6 +1,6 @@ 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.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/Activity.kt index 18f84b9d..6e0f0428 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/Activity.kt @@ -3,7 +3,7 @@ package com.simplemobiletools.filemanager.extensions import android.app.Activity import android.content.Intent import android.net.Uri -import android.support.v4.content.FileProvider +import androidx.core.content.FileProvider import com.simplemobiletools.commons.R import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt index 9d86b8c9..8d8f7b11 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt @@ -2,11 +2,10 @@ package com.simplemobiletools.filemanager.fragments import android.os.Bundle import android.os.Parcelable -import android.support.v4.app.Fragment -import android.support.v7.widget.LinearLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.dialogs.StoragePickerDialog 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.models.FileDirItem import com.simplemobiletools.commons.views.Breadcrumbs +import com.simplemobiletools.commons.views.MyLinearLayoutManager import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.activities.MainActivity 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.RootHelpers import com.simplemobiletools.filemanager.interfaces.ItemOperationsListener -import kotlinx.android.synthetic.main.items_fragment.* import kotlinx.android.synthetic.main.items_fragment.view.* import java.io.File import java.util.HashMap @@ -46,7 +45,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb private var storedItems = ArrayList() private var storedTextColor = 0 - private lateinit var mView: View + lateinit var mView: View override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { mView = inflater.inflate(R.layout.items_fragment, container, false)!! @@ -91,8 +90,8 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb storedTextColor = newTextColor } - items_fastscroller.updateBubbleColors() - items_fastscroller.allowBubbleDisplay = context!!.config.showInfoBubble + mView.items_fastscroller.updateBubbleColors() + mView.items_fastscroller.allowBubbleDisplay = context!!.config.showInfoBubble if (!isFirstResume) { refreshItems() } @@ -121,7 +120,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb realPath = "/" } - scrollStates[currentPath] = getScrollState() + scrollStates[currentPath] = getScrollState()!! currentPath = realPath showHidden = context!!.config.shouldShowHidden getItems(currentPath) { originalPath, fileDirItems -> @@ -153,9 +152,10 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb }.apply { addVerticalDividers(true) items_list.adapter = this + initSelectionTracker() } 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() ?: "") } @@ -169,7 +169,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb 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) -> Unit) { 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) { if (id == 0) { StoragePickerDialog(activity as SimpleActivity, currentPath) { + getRecyclerAdapter()?.finishActMode() openPath(it) } } else { - val item = breadcrumbs.getChildAt(id).tag as FileDirItem + val item = mView.breadcrumbs.getChildAt(id).tag as FileDirItem openPath(item.path) } } diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml index b7269764..4a772db1 100644 --- a/app/src/main/res/layout/activity_favorites.xml +++ b/app/src/main/res/layout/activity_favorites.xml @@ -11,15 +11,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - app:layoutManager="android.support.v7.widget.LinearLayoutManager"/> + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/> - - @@ -29,23 +29,23 @@ android:layout_below="@+id/breadcrumbs" android:clipToPadding="false" android:scrollbars="none" - app:layoutManager="android.support.v7.widget.LinearLayoutManager"/> + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/> + android:paddingStart="@dimen/normal_margin" + android:paddingLeft="@dimen/normal_margin"> - + - + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index f6fee237..162fec75 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -5,7 +5,7 @@ android:id="@+id/search" android:icon="@drawable/ic_search" android:title="@string/search" - app:actionViewClass="android.support.v7.widget.SearchView" + app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="collapseActionView|ifRoom"/>