Skip to content

Commit

Permalink
接入最新的AFS,修复archive 访问问题
Browse files Browse the repository at this point in the history
增加压缩文件入口,volume 管理中增加权限申请按钮
删除selected 中无用的viewHolder 位置
  • Loading branch information
storytellerF committed Apr 6, 2024
1 parent e9051ff commit b91adde
Show file tree
Hide file tree
Showing 13 changed files with 188 additions and 78 deletions.
16 changes: 6 additions & 10 deletions app/GiantExplorer/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,19 @@ import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
buildscript {
dependencies {
val versionManager: String by project
val navVersion = "2.7.7"
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$navVersion")
classpath(libs.navigation.safe.args.gradle.plugin)
//jitpack 构建
classpath("com.github.storytellerF.common-ui-list:version-manager:$versionManager")
//本地构建
// classpath("com.storyteller_f:version-manager:0.0.1-local")
}
}
plugins {
val androidVersion = "8.3.1"
val kotlinVersion = "1.9.21"
val kspVersion = "1.9.21-1.0.15"
id("com.android.application") version androidVersion apply false
id("com.android.library") version androidVersion apply false
id("org.jetbrains.kotlin.android") version kotlinVersion apply false
id("org.jetbrains.kotlin.jvm") version kotlinVersion apply false
id("com.google.devtools.ksp") version kspVersion apply false
alias(libs.plugins.androidApplication) apply false
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
alias(libs.plugins.ksp) apply false
id("com.starter.easylauncher") version "6.3.0" apply false
id("androidx.room") version "2.6.1" apply false
id("io.gitlab.arturbosch.detekt") version "1.23.1"
}

Expand Down
43 changes: 18 additions & 25 deletions app/GiantExplorer/giant-explorer/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ plugins {
id("com.storyteller_f.version_manager")
id("kotlin-kapt")
id("com.google.devtools.ksp")
id("com.starter.easylauncher") version "6.2.0"
id("androidx.room") version "2.6.1"
// id("com.starter.easylauncher")
id("androidx.room")
}

android {
Expand Down Expand Up @@ -52,38 +52,37 @@ android {

dependencies {

implementation("androidx.constraintlayout:constraintlayout:${Versions.CONSTRAINTLAYOUT}")
implementation(libs.constraintlayout)
networkDependency()
workerDependency()

handleSu()
handleShun()
implementation(project(":giant-explorer-plugin-core"))

implementation("com.j256.simplemagic:simplemagic:1.17")
implementation("com.github.bumptech.glide:glide:4.16.0")
implementation(libs.simplemagic)
implementation(libs.glide)

implementation("androidx.browser:browser:1.8.0")
implementation("androidx.webkit:webkit:1.10.0")
implementation("androidx.preference:preference-ktx:1.2.1")
implementation("androidx.window:window:1.2.0")
implementation(libs.browser)
implementation(libs.webkit)
implementation(libs.preference.ktx)
implementation(libs.window)

androidTestImplementation("androidx.room:room-testing:2.6.1")
androidTestImplementation(libs.room.testing)

val liPluginModule = findProject(":li-plugin")
if (liPluginModule != null) {
implementation(liPluginModule)
}
implementation("com.github.tony19:logback-android:3.0.0")
implementation(libs.logback.android)

val fileSystemVersion = "73769ee487"
implementation("com.github.storytellerF.AFS:file-system-remote:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system-ktx:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system-root:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system-archive:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system-memory:$fileSystemVersion")
implementation("com.github.storytellerF.AFS:file-system-local:$fileSystemVersion")
implementation(libs.file.system.remote)
implementation(libs.file.system.ktx)
implementation(libs.file.system)
implementation(libs.file.system.root)
implementation(libs.file.system.archive)
implementation(libs.file.system.memory)
implementation(libs.file.system.local)

constraints {
listOf(
Expand All @@ -97,12 +96,6 @@ dependencies {
}

baseApp()
android {
defaultConfig {
//fixme file-system-archive minSdk = 24 file-system-memory minSdk = 26
minSdk = 26
}
}
implModule(":slim-ktx")
constraintCommonUIListVersion(versionManager)
configurations.all {
Expand Down
13 changes: 10 additions & 3 deletions app/GiantExplorer/giant-explorer/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<permission android:name="com.storyteller_f.giant_explorer.provider" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-sdk tools:overrideLibrary="com.storyteller_f.file_system_archive,com.storyteller_f.file_system_memory" />
<queries>
<intent>
<action android:name="com.storyteller_f.action.giant_explorer.PLUGIN" />
Expand Down Expand Up @@ -115,11 +120,13 @@
<provider
android:name=".service.FileSystemProvider"
android:authorities="${fileSystemProviderAuthority}"
android:exported="true" />
android:exported="true"
android:permission="com.storyteller_f.giant_explorer.provider" />
<provider
android:name=".service.FileSystemProvider"
android:authorities="${fileSystemEncryptedProviderAuthority}"
android:exported="true" />
android:exported="true"
android:permission="com.storyteller_f.giant_explorer.provider" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import com.storyteller_f.common_vm_ktx.combineDao
import com.storyteller_f.common_vm_ktx.debounce
import com.storyteller_f.common_vm_ktx.distinctUntilChangedBy
import com.storyteller_f.common_vm_ktx.svm
import com.storyteller_f.common_vm_ktx.update
import com.storyteller_f.common_vm_ktx.vm
import com.storyteller_f.common_vm_ktx.wait5
import com.storyteller_f.file_system.instance.FileInstance
Expand Down Expand Up @@ -94,7 +95,7 @@ class FileListObserver<T>(
) where T : ViewModelStoreOwner, T : SavedStateRegistryOwner {
val fileInstance: FileInstance?
get() = session.fileInstance.value
val selected: List<Pair<DataItemHolder, Int>>?
val selected: List<DataItemHolder>?
get() = session.selected.value

val fileListViewModel by owner.svm({}, scope) { handle, _ ->
Expand Down Expand Up @@ -241,7 +242,7 @@ private val <T> LiveData<List<T>>.same
@ItemHolder("file")
class FileItemHolder(
val file: FileModel,
val selected: List<Pair<DataItemHolder, Int>>,
val selected: List<DataItemHolder>,
variant: String
) : DataItemHolder(variant) {
override fun areItemsTheSame(other: DataItemHolder) =
Expand Down Expand Up @@ -273,9 +274,14 @@ class FileViewHolder(private val binding: ViewHolderFileBinding) :
binding.fileName.text = file.name
binding.fileIcon.fileIcon(file.item)
val item = file.item
binding.root.isSelected = itemHolder.selected.valueContains(
Pair(itemHolder, 0)
) == true
binding.root.isSelected = run {
val firstOrNull = itemHolder.selected.firstOrNull {
it.areItemsTheSame(
itemHolder
)
}
firstOrNull != null
} == true
binding.root.setBackgroundResource(
if (file.item.isFile) R.drawable.background_file else R.drawable.background_folder
)
Expand Down Expand Up @@ -466,31 +472,27 @@ private suspend fun fileModelBuilder(
}

/**
* 反选。pair 的first 作为key。
* 反选。通过areItemsTheSame 比较,而不是equals
* @return 返回新的选中列表和上一次是否处于选中状态
*/
fun List<Pair<DataItemHolder, Int>>?.toggle(
pair: Pair<DataItemHolder, Int>
): Pair<List<Pair<DataItemHolder, Int>>, Boolean> {
fun List<DataItemHolder>?.toggle(
holder: DataItemHolder
): Pair<List<DataItemHolder>, Boolean> {
val oldSelectedHolders = this ?: mutableListOf()
val otherHolders = oldSelectedHolders.filter {
!it.first.areItemsTheSame(pair.first)
!it.areItemsTheSame(holder)
}
val stateSelected = otherHolders.size == oldSelectedHolders.size
val selected = if (stateSelected) otherHolders + pair else otherHolders
return selected to stateSelected
val newState = otherHolders.size == oldSelectedHolders.size
val selected = if (newState) otherHolders + holder else otherHolders
return selected to newState
}

fun List<Pair<DataItemHolder, Int>>.valueContains(pair: Pair<DataItemHolder, Int>): Boolean {
val firstOrNull = firstOrNull {
it.first.areItemsTheSame(pair.first)
fun MutableLiveData<List<DataItemHolder>>.toggle(viewHolder: RecyclerView.ViewHolder) {
update {
val adapterViewHolder = viewHolder as AbstractViewHolder<out DataItemHolder>
val (selectedHolders, currentSelected) =
it.toggle(adapterViewHolder.itemHolder)
viewHolder.view.isSelected = currentSelected
selectedHolders
}
return firstOrNull != null
}

fun MutableLiveData<List<Pair<DataItemHolder, Int>>>.toggle(viewHolder: RecyclerView.ViewHolder) {
val adapterViewHolder = viewHolder as AbstractViewHolder<out DataItemHolder>
val (selectedHolders, currentSelected) =
value.toggle(adapterViewHolder.itemHolder to viewHolder.absoluteAdapterPosition)
viewHolder.view.isSelected = currentSelected
value = selectedHolders
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.graphics.Rect
import android.net.Uri
import android.os.Build
import android.text.TextPaint
import android.text.TextUtils
import android.util.Log
Expand Down Expand Up @@ -47,6 +48,7 @@ import com.storyteller_f.common_vm_ktx.pvm
import com.storyteller_f.file_system.getFileInstance
import com.storyteller_f.file_system.instance.FileCreatePolicy
import com.storyteller_f.file_system.instance.FileInstance
import com.storyteller_f.file_system_archive.ArchiveFileInstanceFactory
import com.storyteller_f.file_system_ktx.isDirectory
import com.storyteller_f.giant_explorer.BuildConfig
import com.storyteller_f.giant_explorer.R
Expand Down Expand Up @@ -360,6 +362,9 @@ class FileListFragment : SimpleFragment<FragmentFileListBinding>(FragmentFileLis
resolveInstalledPlugins(itemHolder, mimeTypeFromExtension, uri)
resolveNoInstalledPlugins(mimeTypeFromExtension, fullPath, uri)
resolveModulePlugin(key, uri, fullPath)
val isSupportArchiveFileInstance = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
menu.findItem(R.id.preview_archive).isVisible =
isSupportArchiveFileInstance || itemHolder.file.item.extension == "zip"

setOnMenuItemClickListener { item ->
when (item.itemId) {
Expand All @@ -368,12 +373,28 @@ class FileListFragment : SimpleFragment<FragmentFileListBinding>(FragmentFileLis
R.id.copy_to -> moveOrCopy(false, itemHolder)
R.id.copy_file -> copyFilePathToClipboard(itemHolder)
R.id.properties -> showPropertiesDialog(uri)
R.id.preview_archive -> previewArchiveFile(uri)
}
true
}
}.show()
}

private fun previewArchiveFile(uri: Uri) {
val context = context ?: return
scope.launch {
val fileInstance = getFileInstance(context, uri) ?: return@launch
val newUri =
ArchiveFileInstanceFactory().buildNestedFile(context, "/", fileInstance)
?: return@launch
findNavController().navigate(
FileListFragmentDirections.actionFileListFragmentSelf(
newUri
)
)
}
}

private fun PopupMenu.resolveModulePlugin(
key: String,
uri: Uri,
Expand Down Expand Up @@ -581,7 +602,7 @@ class FileListFragment : SimpleFragment<FragmentFileListBinding>(FragmentFileLis
}

private fun detectSelected(itemHolder: FileItemHolder) =
observer.selected?.map { pair -> (pair.first as FileItemHolder).file.item } ?: listOf(
observer.selected?.map { pair -> (pair as FileItemHolder).file.item } ?: listOf(
itemHolder.file.item
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ import java.lang.ref.WeakReference
import java.util.Properties

class FileExplorerSession(application: Application, uri: Uri) : AndroidViewModel(application) {
val selected = MutableLiveData<List<Pair<DataItemHolder, Int>>>()
val selected = MutableLiveData<List<DataItemHolder>>()
val fileInstance = MutableLiveData<FileInstance>()

init {
Expand Down Expand Up @@ -387,8 +387,7 @@ class MainActivity : CommonActivity(), FileOperateService.FileOperateResultConta
}

override fun onServiceDisconnected(name: ComponentName?) {
// fixme 无法移除remote
// RootAccessFileInstance.registerLibSuRemote()
RootAccessFileInstance.removeLibSuRemote()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package com.storyteller_f.giant_explorer.dialog

import android.content.ContentResolver
import android.net.Uri
import android.os.Build
import android.os.storage.StorageVolume
import androidx.annotation.RequiresApi
import androidx.core.view.isVisible
import com.storyteller_f.common_ui.SimpleDialogFragment
import com.storyteller_f.common_ui.scope
import com.storyteller_f.file_system_local.LocalFileSystem
import com.storyteller_f.file_system_local.getFree
import com.storyteller_f.file_system_local.getSpace
import com.storyteller_f.file_system_local.getStorageCompat
import com.storyteller_f.file_system_local.getStorageVolume
import com.storyteller_f.file_system_local.getTotal
import com.storyteller_f.file_system_local.requestFilePermission
import com.storyteller_f.file_system_local.volumePathName
import com.storyteller_f.giant_explorer.control.format1024
import com.storyteller_f.giant_explorer.databinding.DialogVolumeSpaceBinding
Expand All @@ -30,6 +34,13 @@ class VolumeSpaceDialog :
deployFile(binding, it)
}
}
val regularUri = Uri.Builder().scheme(ContentResolver.SCHEME_FILE)
.path(LocalFileSystem.ROOT_USER_EMULATED_PATH).build()
binding.managePermission.setOnClickListener {
scope.launch {
it.context.requestFilePermission(regularUri)
}
}
}

private fun deployFile(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,18 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="40dp"
android:paddingHorizontal="20dp"
android:paddingVertical="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/manage_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:text="@string/manage_permission"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/space_list" />
</androidx.constraintlayout.widget.ConstraintLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@
<item
android:id="@+id/properties"
android:title="@string/properties" />
<item
android:id="@+id/preview_archive"
android:title="@string/preview_archive"/>
</menu>
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,12 @@
<string name="open_window_mode">Open window mode %s</string>
<string name="prompt_before_drag_drop">Prompt before drag&amp;drop</string>
<string name="open_window_mode_dialog_title">Open window mode</string>
<string name="server">server host</string>
<string name="port">port</string>
<string name="user">user name</string>
<string name="password">password</string>
<string name="share_name_for_smb">share name for smb</string>
<string name="test_connection">test connection</string>
<string name="preview_archive">preview archived file</string>
<string name="manage_permission">manage permission</string>
</resources>
Loading

0 comments on commit b91adde

Please sign in to comment.