6.6.3 - Alpha - 使用异步加载方式一定程度提升文件管理器列表滑动流畅性
This commit is contained in:
@@ -8,7 +8,8 @@
|
|||||||
"console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_"
|
"console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_"
|
||||||
],
|
],
|
||||||
"improvement": [
|
"improvement": [
|
||||||
"打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_"
|
"打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_",
|
||||||
|
"使用异步加载方式一定程度提升文件管理器列表滑动流畅性"
|
||||||
],
|
],
|
||||||
"dependency": [
|
"dependency": [
|
||||||
"升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2"
|
"升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2"
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开
|
|||||||
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
||||||
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
||||||
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
||||||
|
* `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性
|
||||||
* `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_
|
* `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_
|
||||||
|
|
||||||
# v6.6.2
|
# v6.6.2
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开
|
|||||||
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
||||||
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
||||||
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
||||||
|
* `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性
|
||||||
* `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_
|
* `优化` 部分依赖或本地库版本调整 _[`CHANGELOG.md`](http://project.autojs6.com/blob/master/app/src/main/assets-app/doc/CHANGELOG.md#v663)_
|
||||||
|
|
||||||
# v6.6.2
|
# v6.6.2
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
||||||
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
||||||
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
||||||
|
* `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性
|
||||||
* `依赖` 升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2
|
* `依赖` 升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2
|
||||||
|
|
||||||
# v6.6.2
|
# v6.6.2
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
* `修复` 部分设备代码编辑器空行显示方框字符的问题
|
||||||
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
* `修复` console.setContentTextColor 方法导致日志字体颜色丢失默认值的问题 _[`issue #346`](http://issues.autojs6.com/346)_
|
||||||
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
* `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_
|
||||||
|
* `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性
|
||||||
* `依赖` 升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2
|
* `依赖` 升级 Gradle 版本 8.14-rc-1 -> 8.14-rc-2
|
||||||
|
|
||||||
# v6.6.2
|
# v6.6.2
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.PopupMenu
|
import android.widget.PopupMenu
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearSmoothScroller
|
import androidx.recyclerview.widget.LinearSmoothScroller
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
|
import io.reactivex.Completable
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
@@ -132,32 +132,32 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun init() {
|
private fun init() {
|
||||||
Log.d(LOG_TAG, "item bg = " + Integer.toHexString(ContextCompat.getColor(context, R.color.item_background)))
|
|
||||||
ExplorerViewBinding.inflate(LayoutInflater.from(context), this, true).also { binding ->
|
ExplorerViewBinding.inflate(LayoutInflater.from(context), this, true).also { binding ->
|
||||||
this.binding = binding
|
this.binding = binding
|
||||||
explorerItemListView = initExplorerItemListView(binding.explorerItemList)
|
binding.explorerItemList.also {
|
||||||
mProjectToolbar = binding.projectToolbar
|
this.explorerItemListView = it
|
||||||
|
it.adapter = mExplorerAdapter
|
||||||
|
it.setHasFixedSize(true)
|
||||||
|
it.layoutManager = WrapContentGridLayoutManger(this.context, 2).also { manager ->
|
||||||
|
manager.setDebugInfo(ExplorerView::class.java.simpleName)
|
||||||
|
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
||||||
|
override fun getSpanSize(position: Int) = when {
|
||||||
|
position > positionOfCategoryDir && position < positionOfCategoryFile() -> {
|
||||||
|
mDirectorySpanSize // For directories
|
||||||
|
}
|
||||||
|
else -> 2 // For files and category
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
binding.projectToolbar.also {
|
||||||
|
mProjectToolbar = it
|
||||||
|
}
|
||||||
}
|
}
|
||||||
restoreSortConfig()
|
restoreSortConfig()
|
||||||
setOnRefreshListener(this)
|
setOnRefreshListener(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initExplorerItemListView(explorerItemListView: RecyclerView) = explorerItemListView.also {
|
|
||||||
it.adapter = mExplorerAdapter
|
|
||||||
it.setItemViewCacheSize(4)
|
|
||||||
it.layoutManager = WrapContentGridLayoutManger(context, 2).also { manager ->
|
|
||||||
manager.setDebugInfo("ExplorerView")
|
|
||||||
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
|
||||||
override fun getSpanSize(position: Int) = when {
|
|
||||||
position > positionOfCategoryDir && position < positionOfCategoryFile() -> {
|
|
||||||
mDirectorySpanSize // For directories
|
|
||||||
}
|
|
||||||
else -> 2 // For files and category
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
fun onExplorerChange(event: ExplorerChangeEvent) {
|
fun onExplorerChange(event: ExplorerChangeEvent) {
|
||||||
Log.d(LOG_TAG, "on explorer change: $event")
|
Log.d(LOG_TAG, "on explorer change: $event")
|
||||||
@@ -589,6 +589,11 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onViewRecycled(holder: BindableViewHolder<Any>) {
|
||||||
|
super.onViewRecycled(holder)
|
||||||
|
holder.onViewRecycled()
|
||||||
|
}
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
override fun getItemViewType(position: Int): Int {
|
||||||
val positionOfCategoryFile = positionOfCategoryFile()
|
val positionOfCategoryFile = positionOfCategoryFile()
|
||||||
return when {
|
return when {
|
||||||
@@ -639,15 +644,19 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
|
|
||||||
private val globalAppContext by lazy { GlobalAppContext.get() }
|
private val globalAppContext by lazy { GlobalAppContext.get() }
|
||||||
|
|
||||||
|
private val mFirstChar: FirstCharView
|
||||||
|
|
||||||
private val mName: TextView
|
private val mName: TextView
|
||||||
private val mFileDate: TextView
|
private val mFileDate: TextView
|
||||||
private val mFileSize: TextView
|
private val mFileSize: TextView
|
||||||
private val mOptions: View
|
|
||||||
|
private val mActionIconContainer: View
|
||||||
private val mInstall: View
|
private val mInstall: View
|
||||||
private val mRun: View
|
private val mRun: View
|
||||||
private val mEdit: View
|
private val mEdit: View
|
||||||
private val mInfo: View
|
private val mInfo: View
|
||||||
private val mFirstChar: FirstCharView
|
|
||||||
|
private val mOptions: View
|
||||||
|
|
||||||
private lateinit var mExplorerItem: ExplorerItem
|
private lateinit var mExplorerItem: ExplorerItem
|
||||||
|
|
||||||
@@ -655,25 +664,20 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
val explorerFileBinding = ExplorerFileBinding.bind(itemView)
|
val explorerFileBinding = ExplorerFileBinding.bind(itemView)
|
||||||
val firstCharIconBinding = ExplorerFirstCharIconBinding.bind(itemView)
|
val firstCharIconBinding = ExplorerFirstCharIconBinding.bind(itemView)
|
||||||
|
|
||||||
|
mFirstChar = firstCharIconBinding.firstChar
|
||||||
|
|
||||||
mName = explorerFileBinding.name
|
mName = explorerFileBinding.name
|
||||||
mFileDate = explorerFileBinding.scriptFileDate
|
mFileDate = explorerFileBinding.scriptFileDate
|
||||||
mFileSize = explorerFileBinding.scriptFileSize
|
mFileSize = explorerFileBinding.scriptFileSize
|
||||||
mFirstChar = firstCharIconBinding.firstChar
|
|
||||||
|
|
||||||
mRun = explorerFileBinding.run
|
mActionIconContainer = explorerFileBinding.actionIconContainer
|
||||||
mRun.setOnClickListener { withItemSelected { run() } }
|
|
||||||
|
|
||||||
mEdit = explorerFileBinding.edit
|
mRun = explorerFileBinding.run.apply { setOnClickListener { withItemSelected { run() } } }
|
||||||
mEdit.setOnClickListener { withItemSelected { edit() } }
|
mEdit = explorerFileBinding.edit.apply { setOnClickListener { withItemSelected { edit() } } }
|
||||||
|
mInfo = explorerFileBinding.info.apply { setOnClickListener { withItemSelected { showInfo() } } }
|
||||||
|
mInstall = explorerFileBinding.install.apply { setOnClickListener { withItemSelected { install() } } }
|
||||||
|
|
||||||
mInfo = explorerFileBinding.info
|
mOptions = explorerFileBinding.more.apply { setOnClickListener { withItemSelected { showOptionsMenu() } } }
|
||||||
mInfo.setOnClickListener { withItemSelected { showInfo() } }
|
|
||||||
|
|
||||||
mInstall = explorerFileBinding.install
|
|
||||||
mInstall.setOnClickListener { withItemSelected { install() } }
|
|
||||||
|
|
||||||
mOptions = explorerFileBinding.more
|
|
||||||
mOptions.setOnClickListener { withItemSelected { showOptionsMenu() } }
|
|
||||||
|
|
||||||
explorerFileBinding.item.setOnClickListener { withItemSelected { onItemClick() } }
|
explorerFileBinding.item.setOnClickListener { withItemSelected { onItemClick() } }
|
||||||
}
|
}
|
||||||
@@ -683,54 +687,117 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
if (item !is ExplorerItem) return
|
if (item !is ExplorerItem) return
|
||||||
mExplorerItem = item
|
mExplorerItem = item
|
||||||
|
|
||||||
mName.text = ExplorerViewHelper.getDisplayName(context, item)
|
|
||||||
mFileDate.text = PFile.getFullDateString(item.lastModified())
|
|
||||||
mFileSize.text = PFiles.getHumanReadableSize(item.size)
|
|
||||||
|
|
||||||
setFirstChar(item)
|
setFirstChar(item)
|
||||||
|
|
||||||
updateVisibility(mEdit, item.isTextEditable || item.isExternalEditable)
|
setTextWith(mName) { ExplorerViewHelper.getDisplayName(context, item) }
|
||||||
updateVisibility(mRun, item.isExecutable || item.isMediaPlayable)
|
setTextWith(mFileDate) { PFile.getFullDateString(item.lastModified()) }
|
||||||
updateVisibility(mInstall, item.isInstallable)
|
setTextWith(mFileSize) { PFiles.getHumanReadableSize(item.size) }
|
||||||
updateVisibility(mInfo, item.isInstallable || item.isMediaMenu || item.isMediaPlayable)
|
|
||||||
|
|
||||||
when /* listOf(mEdit, mRun, mInstall, mInfo).filter { it.isVisible }.size > 2 */ {
|
Observable.fromCallable {
|
||||||
listOf(mEdit, mRun, mInfo).all { it.isVisible } -> {
|
val shouldEditShow = item.isTextEditable || item.isExternalEditable
|
||||||
mInfo.isVisible = false
|
val shouldRunShow = item.isExecutable || item.isMediaPlayable
|
||||||
}
|
val shouldInstallShow = item.isInstallable
|
||||||
listOf(mEdit, mInstall, mInfo).all { it.isVisible } -> {
|
|
||||||
mInfo.isVisible = false
|
val alreadyHasTwoImportantIcons = shouldEditShow && (shouldRunShow || shouldInstallShow)
|
||||||
}
|
val shouldInfoShow = !alreadyHasTwoImportantIcons && (item.isInstallable || item.isMediaMenu || item.isMediaPlayable)
|
||||||
// listOf(mEdit, mRun, mInstall).all { it.isVisible } -> { /* Should not happen. */ }
|
|
||||||
// listOf(mRun, mInstall, mInfo).all { it.isVisible } -> { /* Should not happen. */ }
|
listOf(shouldEditShow, shouldRunShow, shouldInstallShow, shouldInfoShow)
|
||||||
// listOf(mEdit, mRun, mInstall, mInfo).all { it.isVisible } -> { /* Should not happen. */ }
|
|
||||||
}
|
}
|
||||||
|
.subscribeOn(Schedulers.computation())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe { list ->
|
||||||
|
val (shouldEditShow, shouldRunShow, shouldInstallShow, shouldInfoShow) = list
|
||||||
|
if (shouldEditShow || shouldRunShow || shouldInstallShow || shouldInfoShow) {
|
||||||
|
setVisibilityIf(mEdit, shouldEditShow)
|
||||||
|
setVisibilityIf(mRun, shouldRunShow)
|
||||||
|
setVisibilityIf(mInstall, shouldInstallShow)
|
||||||
|
setVisibilityIf(mInfo, shouldInfoShow)
|
||||||
|
setVisibilityIf(mActionIconContainer, true)
|
||||||
|
} else {
|
||||||
|
setVisibilityIf(mActionIconContainer, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateVisibility(view: View, visible: Boolean) {
|
private fun setTextWith(textView: TextView, callable: () -> CharSequence) {
|
||||||
val visibility = if (visible) View.VISIBLE else View.GONE
|
Observable.fromCallable(callable)
|
||||||
|
.subscribeOn(Schedulers.computation())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe { text -> textView.text = text }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setVisibilityWith(view: View, callable: () -> Boolean) {
|
||||||
|
Observable.fromCallable(callable)
|
||||||
|
.subscribeOn(Schedulers.computation())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe { isVisible ->
|
||||||
|
if (view.isVisible != isVisible) {
|
||||||
|
view.isVisible = isVisible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setVisibilityIf(view: View, visibility: Int) {
|
||||||
if (view.visibility != visibility) {
|
if (view.visibility != visibility) {
|
||||||
view.visibility = visibility
|
view.visibility = visibility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setVisibilityIf(view: View, visible: Boolean) {
|
||||||
|
setVisibilityIf(view, if (visible) VISIBLE else GONE)
|
||||||
|
}
|
||||||
|
|
||||||
private fun setFirstChar(item: ExplorerItem) {
|
private fun setFirstChar(item: ExplorerItem) {
|
||||||
mFirstChar.setIcon(ExplorerViewHelper.getIcon(item))
|
Observable.fromCallable { ExplorerViewHelper.getIcon(item) }
|
||||||
when (item.type) {
|
.subscribeOn(Schedulers.io())
|
||||||
FileUtils.TYPE.JAVASCRIPT, FileUtils.TYPE.AUTO -> {
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
val themeColorForContrast = ColorUtils.adjustColorForContrast(context.getColor(R.color.item_background_dark), ThemeColorManagerCompat.getColorPrimary(), 1.15)
|
.subscribe { icon ->
|
||||||
mFirstChar
|
mFirstChar.setIcon(icon)
|
||||||
.setIconTextColorByThemeColorLuminance()
|
|
||||||
.setStrokeColor(themeColorForContrast)
|
val actions = when (item.type) {
|
||||||
.setFillColor(themeColorForContrast)
|
FileUtils.TYPE.JAVASCRIPT, FileUtils.TYPE.AUTO -> {
|
||||||
|
Observable.fromCallable {
|
||||||
|
ColorUtils.adjustColorForContrast(
|
||||||
|
context.getColor(R.color.item_background_dark),
|
||||||
|
ThemeColorManagerCompat.getColorPrimary(),
|
||||||
|
1.15
|
||||||
|
)
|
||||||
|
}.map { themeColorForContrast ->
|
||||||
|
listOf(
|
||||||
|
{ mFirstChar.setIconTextColorByThemeColorLuminance() },
|
||||||
|
{ mFirstChar.setStrokeColor(themeColorForContrast) },
|
||||||
|
{ mFirstChar.setFillColor(themeColorForContrast) },
|
||||||
|
{ mFirstChar.visibility = VISIBLE },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> Observable.just(
|
||||||
|
listOf(
|
||||||
|
{ mFirstChar.setIconTextColorDayNight() },
|
||||||
|
{ mFirstChar.setStrokeColorDayNight() },
|
||||||
|
{ mFirstChar.setFillTransparent() },
|
||||||
|
{ mFirstChar.visibility = VISIBLE },
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.subscribeOn(Schedulers.computation())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.flatMapCompletable { list ->
|
||||||
|
Observable.fromIterable(list)
|
||||||
|
.flatMapCompletable { action -> Completable.fromAction { action.invoke() } }
|
||||||
|
}
|
||||||
|
.subscribe()
|
||||||
}
|
}
|
||||||
else -> {
|
}
|
||||||
mFirstChar
|
|
||||||
.setIconTextColorDayNight()
|
override fun onViewRecycled() {
|
||||||
.setStrokeColorDayNight()
|
super.onViewRecycled()
|
||||||
.setFillTransparent()
|
mName.text = null
|
||||||
}
|
mFileDate.text = null
|
||||||
}
|
mFileSize.text = null
|
||||||
|
setVisibilityIf(mFirstChar, INVISIBLE)
|
||||||
|
setVisibilityIf(mActionIconContainer, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onItemClick() {
|
private fun onItemClick() {
|
||||||
@@ -848,7 +915,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
mName.text = ExplorerViewHelper.getDisplayName(context, data)
|
mName.text = ExplorerViewHelper.getDisplayName(context, data)
|
||||||
mDirDate.text = PFile.getFullDateString(data.lastModified())
|
mDirDate.text = PFile.getFullDateString(data.lastModified())
|
||||||
mIcon.setImageResource(ExplorerViewHelper.getIconRes(data))
|
mIcon.setImageResource(ExplorerViewHelper.getIconRes(data))
|
||||||
mOptions.visibility = if (data is ExplorerSamplePage) View.GONE else View.VISIBLE
|
mOptions.visibility = if (data is ExplorerSamplePage) GONE else VISIBLE
|
||||||
mExplorerPage = data
|
mExplorerPage = data
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -930,14 +997,14 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
|
|
||||||
val currentSortType = if (mIsDir) explorerItemManager.dirSortType else explorerItemManager.fileSortType
|
val currentSortType = if (mIsDir) explorerItemManager.dirSortType else explorerItemManager.fileSortType
|
||||||
when (currentSortType) {
|
when (currentSortType) {
|
||||||
ExplorerItemManager.SORT_TYPE_DATE -> popupMenu.menu.findItem(R.id.action_sort_by_date).setChecked(true)
|
ExplorerItemManager.SORT_TYPE_DATE -> popupMenu.menu.findItem(R.id.action_sort_by_date).isChecked = true
|
||||||
ExplorerItemManager.SORT_TYPE_SIZE -> popupMenu.menu.findItem(R.id.action_sort_by_size).setChecked(true)
|
ExplorerItemManager.SORT_TYPE_SIZE -> popupMenu.menu.findItem(R.id.action_sort_by_size).isChecked = true
|
||||||
ExplorerItemManager.SORT_TYPE_TYPE -> popupMenu.menu.findItem(R.id.action_sort_by_type).setChecked(true)
|
ExplorerItemManager.SORT_TYPE_TYPE -> popupMenu.menu.findItem(R.id.action_sort_by_type).isChecked = true
|
||||||
else -> popupMenu.menu.findItem(R.id.action_sort_by_name).setChecked(true)
|
else -> popupMenu.menu.findItem(R.id.action_sort_by_name).isChecked = true
|
||||||
}
|
}
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener { item: MenuItem ->
|
popupMenu.setOnMenuItemClickListener { item: MenuItem ->
|
||||||
item.setChecked(true)
|
item.isChecked = true
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_sort_by_name -> {
|
R.id.action_sort_by_name -> {
|
||||||
sort(ExplorerItemManager.SORT_TYPE_NAME, isDirSortMenuShowing, true)
|
sort(ExplorerItemManager.SORT_TYPE_NAME, isDirSortMenuShowing, true)
|
||||||
@@ -975,9 +1042,9 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
|||||||
binding.title.setText(if (isDirCategory) R.string.text_directory else R.string.text_file)
|
binding.title.setText(if (isDirCategory) R.string.text_directory else R.string.text_file)
|
||||||
mIsDir = isDirCategory
|
mIsDir = isDirCategory
|
||||||
if (isDirCategory && canGoUp()) {
|
if (isDirCategory && canGoUp()) {
|
||||||
binding.goUp.visibility = View.VISIBLE
|
binding.goUp.visibility = VISIBLE
|
||||||
} else {
|
} else {
|
||||||
binding.goUp.visibility = View.GONE
|
binding.goUp.visibility = GONE
|
||||||
}
|
}
|
||||||
if (isDirCategory) {
|
if (isDirCategory) {
|
||||||
binding.arrowIcon.rotation = (if (currentPageState.dirsCollapsed) -90 else 0).toFloat()
|
binding.arrowIcon.rotation = (if (currentPageState.dirsCollapsed) -90 else 0).toFloat()
|
||||||
|
|||||||
@@ -11,4 +11,8 @@ abstract class BindableViewHolder<DataType>(itemView: View) : RecyclerView.ViewH
|
|||||||
|
|
||||||
abstract fun bind(data: DataType, position: Int)
|
abstract fun bind(data: DataType, position: Int)
|
||||||
|
|
||||||
|
open fun onViewRecycled() {
|
||||||
|
/* Nothing to do by default. */
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
app/src/main/res/drawable/ic_edit_explorer_btn.png
Normal file
BIN
app/src/main/res/drawable/ic_edit_explorer_btn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/drawable/ic_info_explorer_btn.png
Normal file
BIN
app/src/main/res/drawable/ic_info_explorer_btn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
BIN
app/src/main/res/drawable/ic_install_explorer_btn.png
Normal file
BIN
app/src/main/res/drawable/ic_install_explorer_btn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
BIN
app/src/main/res/drawable/ic_more_explorer_btn.png
Normal file
BIN
app/src/main/res/drawable/ic_more_explorer_btn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
BIN
app/src/main/res/drawable/ic_run_explorer_btn.png
Normal file
BIN
app/src/main/res/drawable/ic_run_explorer_btn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
@@ -23,13 +23,14 @@
|
|||||||
android:foreground="?selectableItemBackground"
|
android:foreground="?selectableItemBackground"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:paddingVertical="9dp"
|
android:paddingVertical="9dp"
|
||||||
android:paddingStart="8dp">
|
android:paddingStart="8dp"
|
||||||
|
android:paddingEnd="0dp">
|
||||||
|
|
||||||
<include
|
<include
|
||||||
layout="@layout/explorer_first_char_icon"
|
layout="@layout/explorer_first_char_icon"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="wrap_content" />
|
android:layout_gravity="center_vertical" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@@ -59,8 +60,6 @@
|
|||||||
android:id="@+id/script_file_date"
|
android:id="@+id/script_file_date"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:textColor="?android:textColorSecondary"
|
android:textColor="?android:textColorSecondary"
|
||||||
@@ -82,8 +81,6 @@
|
|||||||
android:id="@+id/script_file_size"
|
android:id="@+id/script_file_size"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:textColor="?android:textColorSecondary"
|
android:textColor="?android:textColorSecondary"
|
||||||
@@ -95,71 +92,78 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/action_icon_container"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="36dp"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/install"
|
android:id="@+id/install"
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible"
|
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:paddingVertical="11dp"
|
android:contentDescription="@string/text_install"
|
||||||
android:src="@drawable/ic_install"
|
android:focusable="true"
|
||||||
app:tint="#A9AAAB" />
|
android:src="@drawable/ic_install_explorer_btn"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:tint="#A9AAAB"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/run"
|
android:id="@+id/run"
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible"
|
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:paddingVertical="9dp"
|
android:contentDescription="@string/text_run"
|
||||||
android:src="@drawable/ic_run_gray"
|
android:focusable="true"
|
||||||
app:tint="#A9AAAB" />
|
android:src="@drawable/ic_run_explorer_btn"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:tint="#A9AAAB"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/edit"
|
android:id="@+id/edit"
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible"
|
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:paddingVertical="9dp"
|
android:contentDescription="@string/text_edit"
|
||||||
android:src="@drawable/ic_mode_edit_black_24dp"
|
android:focusable="true"
|
||||||
app:tint="#A9AAAB" />
|
android:src="@drawable/ic_edit_explorer_btn"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:tint="#A9AAAB"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/info"
|
android:id="@+id/info"
|
||||||
|
android:layout_width="36dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/text_info"
|
||||||
|
android:focusable="true"
|
||||||
|
android:src="@drawable/ic_info_explorer_btn"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
app:tint="#A9AAAB"
|
||||||
android:layout_width="36dp"
|
tools:visibility="visible" />
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
|
||||||
android:clickable="true"
|
|
||||||
android:paddingVertical="8.5dp"
|
|
||||||
android:src="@drawable/ic_info_outline_black_48dp"
|
|
||||||
app:tint="#A9AAAB" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/more"
|
|
||||||
android:layout_width="36dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
|
||||||
android:clickable="true"
|
|
||||||
android:paddingVertical="9dp"
|
|
||||||
android:src="@drawable/ic_more_vert_black_24dp"
|
|
||||||
app:tint="#A9AAAB" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/more"
|
||||||
|
android:layout_width="36dp"
|
||||||
|
android:layout_height="36dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/text_more"
|
||||||
|
android:focusable="true"
|
||||||
|
android:src="@drawable/ic_more_explorer_btn"
|
||||||
|
app:tint="#A9AAAB" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#Fri Apr 18 14:35:16 CST 2025
|
#Sat Apr 19 00:16:16 CST 2025
|
||||||
BUILD_TIME=1744958116261
|
BUILD_TIME=1744992976260
|
||||||
COMPILE_SDK_VERSION=35
|
COMPILE_SDK_VERSION=35
|
||||||
JAVA_VERSION=23
|
JAVA_VERSION=23
|
||||||
JAVA_VERSION_MIN_RADICAL=0
|
JAVA_VERSION_MIN_RADICAL=0
|
||||||
@@ -17,6 +17,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
|
|||||||
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
|
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
|
||||||
TARGET_SDK_VERSION=35
|
TARGET_SDK_VERSION=35
|
||||||
TARGET_SDK_VERSION_INRT=29
|
TARGET_SDK_VERSION_INRT=29
|
||||||
VERSION_BUILD=3147
|
VERSION_BUILD=3149
|
||||||
VERSION_NAME=6.6.3 Alpha
|
VERSION_NAME=6.6.3 Alpha
|
||||||
VSCODE_EXT_REQUIRED_VERSION=1.0.8
|
VSCODE_EXT_REQUIRED_VERSION=1.0.8
|
||||||
|
|||||||
Reference in New Issue
Block a user