adding some grid view related UI improvements
This commit is contained in:
parent
6c96ac12de
commit
448b24da60
|
@ -63,7 +63,7 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.github.SimpleMobileTools:Simple-Commons:ee9863c9c5'
|
implementation 'com.github.SimpleMobileTools:Simple-Commons:ed36316a16'
|
||||||
implementation 'com.github.Stericson:RootTools:df729dcb13'
|
implementation 'com.github.Stericson:RootTools:df729dcb13'
|
||||||
implementation 'com.github.Stericson:RootShell:1.6'
|
implementation 'com.github.Stericson:RootShell:1.6'
|
||||||
implementation 'com.alexvasilkov:gesture-views:2.5.2'
|
implementation 'com.alexvasilkov:gesture-views:2.5.2'
|
||||||
|
|
|
@ -170,7 +170,7 @@ class DecompressActivity : SimpleActivity() {
|
||||||
|
|
||||||
val lastModified = if (isOreoPlus()) zipEntry.lastModifiedTime.toMillis() else 0
|
val lastModified = if (isOreoPlus()) zipEntry.lastModifiedTime.toMillis() else 0
|
||||||
val filename = zipEntry.name.removeSuffix("/")
|
val filename = zipEntry.name.removeSuffix("/")
|
||||||
val listItem = ListItem(filename, filename.getFilenameFromPath(), zipEntry.isDirectory, 0, 0L, lastModified, false)
|
val listItem = ListItem(filename, filename.getFilenameFromPath(), zipEntry.isDirectory, 0, 0L, lastModified, false, false)
|
||||||
allFiles.add(listItem)
|
allFiles.add(listItem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,7 +333,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||||
private fun getListItemsFromFileDirItems(fileDirItems: ArrayList<FileDirItem>): ArrayList<ListItem> {
|
private fun getListItemsFromFileDirItems(fileDirItems: ArrayList<FileDirItem>): ArrayList<ListItem> {
|
||||||
val listItems = ArrayList<ListItem>()
|
val listItems = ArrayList<ListItem>()
|
||||||
fileDirItems.forEach {
|
fileDirItems.forEach {
|
||||||
val listItem = ListItem(it.path, it.name, false, 0, it.size, it.modified, false)
|
val listItem = ListItem(it.path, it.name, false, 0, it.size, it.modified, false, false)
|
||||||
listItems.add(listItem)
|
listItems.add(listItem)
|
||||||
}
|
}
|
||||||
return listItems
|
return listItems
|
||||||
|
|
|
@ -41,11 +41,11 @@ import com.simplemobiletools.filemanager.pro.helpers.*
|
||||||
import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener
|
import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener
|
||||||
import com.simplemobiletools.filemanager.pro.models.ListItem
|
import com.simplemobiletools.filemanager.pro.models.ListItem
|
||||||
import com.stericson.RootTools.RootTools
|
import com.stericson.RootTools.RootTools
|
||||||
import kotlinx.android.synthetic.main.item_file_dir_grid.view.*
|
|
||||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.*
|
import kotlinx.android.synthetic.main.item_file_dir_list.view.*
|
||||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_frame
|
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_frame
|
||||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_icon
|
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_icon
|
||||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name
|
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name
|
||||||
|
import kotlinx.android.synthetic.main.item_file_grid.view.*
|
||||||
import kotlinx.android.synthetic.main.item_section.view.*
|
import kotlinx.android.synthetic.main.item_section.view.*
|
||||||
import java.io.BufferedInputStream
|
import java.io.BufferedInputStream
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
|
@ -61,8 +61,10 @@ class ItemsAdapter(
|
||||||
) :
|
) :
|
||||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
|
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||||
|
|
||||||
private val TYPE_FILE_DIR = 1
|
private val TYPE_FILE = 1
|
||||||
private val TYPE_SECTION = 2
|
private val TYPE_DIR = 2
|
||||||
|
private val TYPE_SECTION = 3
|
||||||
|
private val TYPE_GRID_TYPE_DIVIDER = 4
|
||||||
private lateinit var fileDrawable: Drawable
|
private lateinit var fileDrawable: Drawable
|
||||||
private lateinit var folderDrawable: Drawable
|
private lateinit var folderDrawable: Drawable
|
||||||
private var fileDrawables = HashMap<String, Drawable>()
|
private var fileDrawables = HashMap<String, Drawable>()
|
||||||
|
@ -129,9 +131,9 @@ class ItemsAdapter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSelectableItemCount() = listItems.filter { !it.isSectionTitle }.size
|
override fun getSelectableItemCount() = listItems.filter { !it.isSectionTitle && !it.isGridTypeDivider }.size
|
||||||
|
|
||||||
override fun getIsItemSelectable(position: Int) = !listItems[position].isSectionTitle
|
override fun getIsItemSelectable(position: Int) = !listItems[position].isSectionTitle && !listItems[position].isGridTypeDivider
|
||||||
|
|
||||||
override fun getItemSelectionKey(position: Int) = listItems.getOrNull(position)?.path?.hashCode()
|
override fun getItemSelectionKey(position: Int) = listItems.getOrNull(position)?.path?.hashCode()
|
||||||
|
|
||||||
|
@ -147,21 +149,28 @@ class ItemsAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
override fun getItemViewType(position: Int): Int {
|
||||||
return if (listItems[position].isSectionTitle) {
|
return when {
|
||||||
TYPE_SECTION
|
listItems[position].isGridTypeDivider -> TYPE_GRID_TYPE_DIVIDER
|
||||||
} else {
|
listItems[position].isSectionTitle -> TYPE_SECTION
|
||||||
TYPE_FILE_DIR
|
listItems[position].mIsDirectory -> TYPE_DIR
|
||||||
|
else -> TYPE_FILE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
val layout = if (viewType == TYPE_SECTION) {
|
val layout = if (viewType == TYPE_SECTION) {
|
||||||
R.layout.item_section
|
R.layout.item_section
|
||||||
|
} else if (viewType == TYPE_GRID_TYPE_DIVIDER) {
|
||||||
|
R.layout.item_empty
|
||||||
} else {
|
} else {
|
||||||
if (isListViewType) {
|
if (isListViewType) {
|
||||||
R.layout.item_file_dir_list
|
R.layout.item_file_dir_list
|
||||||
} else {
|
} else {
|
||||||
R.layout.item_file_dir_grid
|
if (viewType == TYPE_DIR) {
|
||||||
|
R.layout.item_dir_grid
|
||||||
|
} else {
|
||||||
|
R.layout.item_file_grid
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return createViewHolder(layout, parent)
|
return createViewHolder(layout, parent)
|
||||||
|
@ -789,6 +798,8 @@ class ItemsAdapter(
|
||||||
|
|
||||||
fun isASectionTitle(position: Int) = listItems.getOrNull(position)?.isSectionTitle ?: false
|
fun isASectionTitle(position: Int) = listItems.getOrNull(position)?.isSectionTitle ?: false
|
||||||
|
|
||||||
|
fun isGridTypeDivider(position: Int) = listItems.getOrNull(position)?.isGridTypeDivider ?: false
|
||||||
|
|
||||||
override fun onViewRecycled(holder: ViewHolder) {
|
override fun onViewRecycled(holder: ViewHolder) {
|
||||||
super.onViewRecycled(holder)
|
super.onViewRecycled(holder)
|
||||||
if (!activity.isDestroyed && !activity.isFinishing) {
|
if (!activity.isDestroyed && !activity.isFinishing) {
|
||||||
|
@ -804,11 +815,10 @@ class ItemsAdapter(
|
||||||
view.apply {
|
view.apply {
|
||||||
if (listItem.isSectionTitle) {
|
if (listItem.isSectionTitle) {
|
||||||
item_icon.setImageDrawable(folderDrawable)
|
item_icon.setImageDrawable(folderDrawable)
|
||||||
|
|
||||||
item_section.text = if (textToHighlight.isEmpty()) listItem.mName else listItem.mName.highlightTextPart(textToHighlight, adjustedPrimaryColor)
|
item_section.text = if (textToHighlight.isEmpty()) listItem.mName else listItem.mName.highlightTextPart(textToHighlight, adjustedPrimaryColor)
|
||||||
item_section.setTextColor(textColor)
|
item_section.setTextColor(textColor)
|
||||||
item_section.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
item_section.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
||||||
} else {
|
} else if (!listItem.isGridTypeDivider) {
|
||||||
item_frame.isSelected = isSelected
|
item_frame.isSelected = isSelected
|
||||||
val fileName = listItem.name
|
val fileName = listItem.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)
|
||||||
|
|
|
@ -102,6 +102,17 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||||
|
|
||||||
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
|
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
|
||||||
listItems.sort()
|
listItems.sort()
|
||||||
|
|
||||||
|
if (context!!.config.getFolderViewType(currentPath) == VIEW_TYPE_GRID && listItems.none { it.isSectionTitle }) {
|
||||||
|
if (listItems.any { it.mIsDirectory } && listItems.any { !it.mIsDirectory }) {
|
||||||
|
val firstFileIndex = listItems.indexOfFirst { !it.mIsDirectory }
|
||||||
|
if (firstFileIndex != -1) {
|
||||||
|
val sectionTitle = ListItem("", "", false, 0, 0, 0, false, true)
|
||||||
|
listItems.add(firstFileIndex, sectionTitle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
activity?.runOnUiThread {
|
activity?.runOnUiThread {
|
||||||
activity?.invalidateOptionsMenu()
|
activity?.invalidateOptionsMenu()
|
||||||
addItems(listItems, forceRefresh)
|
addItems(listItems, forceRefresh)
|
||||||
|
@ -241,13 +252,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||||
lastModified = file.lastModified()
|
lastModified = file.lastModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
return ListItem(curPath, curName, isDirectory, children, size, lastModified, false)
|
return ListItem(curPath, curName, isDirectory, children, size, lastModified, false, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getListItemsFromFileDirItems(fileDirItems: ArrayList<FileDirItem>): ArrayList<ListItem> {
|
private fun getListItemsFromFileDirItems(fileDirItems: ArrayList<FileDirItem>): ArrayList<ListItem> {
|
||||||
val listItems = ArrayList<ListItem>()
|
val listItems = ArrayList<ListItem>()
|
||||||
fileDirItems.forEach {
|
fileDirItems.forEach {
|
||||||
val listItem = ListItem(it.path, it.name, it.isDirectory, it.children, it.size, it.modified, false)
|
val listItem = ListItem(it.path, it.name, it.isDirectory, it.children, it.size, it.modified, false, false)
|
||||||
listItems.add(listItem)
|
listItems.add(listItem)
|
||||||
}
|
}
|
||||||
return listItems
|
return listItems
|
||||||
|
@ -303,13 +314,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||||
files.forEach {
|
files.forEach {
|
||||||
val parent = it.mPath.getParentPath()
|
val parent = it.mPath.getParentPath()
|
||||||
if (!it.isDirectory && parent != previousParent && context != null) {
|
if (!it.isDirectory && parent != previousParent && context != null) {
|
||||||
val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true)
|
val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true, false)
|
||||||
listItems.add(sectionTitle)
|
listItems.add(sectionTitle)
|
||||||
previousParent = parent
|
previousParent = parent
|
||||||
}
|
}
|
||||||
|
|
||||||
if (it.isDirectory) {
|
if (it.isDirectory) {
|
||||||
val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true)
|
val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true, false)
|
||||||
listItems.add(sectionTitle)
|
listItems.add(sectionTitle)
|
||||||
previousParent = parent
|
previousParent = parent
|
||||||
}
|
}
|
||||||
|
@ -418,7 +429,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||||
|
|
||||||
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
||||||
override fun getSpanSize(position: Int): Int {
|
override fun getSpanSize(position: Int): Int {
|
||||||
return if (getRecyclerAdapter()?.isASectionTitle(position) == true) {
|
return if (getRecyclerAdapter()?.isASectionTitle(position) == true || getRecyclerAdapter()?.isGridTypeDivider(position) == true) {
|
||||||
layoutManager.spanCount
|
layoutManager.spanCount
|
||||||
} else {
|
} else {
|
||||||
1
|
1
|
||||||
|
|
|
@ -142,7 +142,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||||
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
|
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
|
||||||
val size = cursor.getLongValue(FileColumns.SIZE)
|
val size = cursor.getLongValue(FileColumns.SIZE)
|
||||||
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
|
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
|
||||||
val fileDirItem = ListItem(path, name, false, 0, size, modified, false)
|
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
|
||||||
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
|
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
|
||||||
listItems.add(fileDirItem)
|
listItems.add(fileDirItem)
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ class RootHelpers(val activity: Activity) {
|
||||||
val file = File(path, line)
|
val file = File(path, line)
|
||||||
val fullLine = fullLines.firstOrNull { it.endsWith(" $line") }
|
val fullLine = fullLines.firstOrNull { it.endsWith(" $line") }
|
||||||
val isDirectory = fullLine?.startsWith('d') ?: file.isDirectory
|
val isDirectory = fullLine?.startsWith('d') ?: file.isDirectory
|
||||||
val fileDirItem = ListItem(file.absolutePath, line, isDirectory, 0, 0, 0, false)
|
val fileDirItem = ListItem(file.absolutePath, line, isDirectory, 0, 0, 0, false, false)
|
||||||
files.add(fileDirItem)
|
files.add(fileDirItem)
|
||||||
super.commandOutput(id, line)
|
super.commandOutput(id, line)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,5 +3,7 @@ package com.simplemobiletools.filemanager.pro.models
|
||||||
import com.simplemobiletools.commons.models.FileDirItem
|
import com.simplemobiletools.commons.models.FileDirItem
|
||||||
|
|
||||||
// isSectionTitle is used only at search results for showing the current folders path
|
// isSectionTitle is used only at search results for showing the current folders path
|
||||||
data class ListItem(val mPath: String, val mName: String = "", var mIsDirectory: Boolean = false, var mChildren: Int = 0, var mSize: Long = 0L, var mModified: Long = 0L,
|
data class ListItem(
|
||||||
var isSectionTitle: Boolean) : FileDirItem(mPath, mName, mIsDirectory, mChildren, mSize, mModified)
|
val mPath: String, val mName: String = "", var mIsDirectory: Boolean = false, var mChildren: Int = 0, var mSize: Long = 0L, var mModified: Long = 0L,
|
||||||
|
var isSectionTitle: Boolean, val isGridTypeDivider: Boolean
|
||||||
|
) : FileDirItem(mPath, mName, mIsDirectory, mChildren, mSize, mModified)
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/item_frame"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:foreground="@drawable/selector"
|
||||||
|
android:paddingStart="@dimen/small_margin"
|
||||||
|
android:paddingTop="@dimen/tiny_margin"
|
||||||
|
android:paddingEnd="@dimen/small_margin"
|
||||||
|
android:paddingBottom="@dimen/tiny_margin">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/item_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="@dimen/medium_margin">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/item_icon"
|
||||||
|
android:layout_width="@dimen/grid_view_icon_size"
|
||||||
|
android:layout_height="@dimen/grid_view_icon_size"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:adjustViewBounds="true"
|
||||||
|
android:src="@drawable/ic_folder_vector" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/item_name"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/item_icon"
|
||||||
|
android:ellipsize="middle"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:paddingStart="@dimen/small_margin"
|
||||||
|
android:paddingEnd="@dimen/small_margin"
|
||||||
|
android:singleLine="true"
|
||||||
|
tools:text="Directory" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/item_check"
|
||||||
|
android:layout_width="@dimen/selection_check_size"
|
||||||
|
android:layout_height="@dimen/selection_check_size"
|
||||||
|
android:layout_alignEnd="@+id/item_icon"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_margin="@dimen/small_margin"
|
||||||
|
android:background="@drawable/circle_background"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:padding="@dimen/tiny_margin"
|
||||||
|
android:src="@drawable/ic_check_vector"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
</FrameLayout>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/item_frame"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
|
@ -17,7 +17,7 @@
|
||||||
android:id="@+id/item_holder"
|
android:id="@+id/item_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="@dimen/activity_margin">
|
android:layout_marginBottom="@dimen/normal_margin">
|
||||||
|
|
||||||
<com.simplemobiletools.filemanager.pro.views.MySquareImageView
|
<com.simplemobiletools.filemanager.pro.views.MySquareImageView
|
||||||
android:id="@+id/item_icon"
|
android:id="@+id/item_icon"
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
android:padding="@dimen/small_margin"
|
android:padding="@dimen/small_margin"
|
||||||
android:src="@drawable/ic_folder_vector" />
|
android:src="@drawable/ic_file_generic" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/item_name"
|
android:id="@+id/item_name"
|
|
@ -1,4 +1,4 @@
|
||||||
<resources>
|
<resources>
|
||||||
<dimen name="grid_view_icon_size">60dp</dimen>
|
<dimen name="grid_view_icon_size">50dp</dimen>
|
||||||
<dimen name="storage_free_space_text_size">46sp</dimen>
|
<dimen name="storage_free_space_text_size">46sp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue