Skip to content

Commit

Permalink
把documentFile的一些操作提取出来
Browse files Browse the repository at this point in the history
合并mediaStoreHelper和SafHelper
  • Loading branch information
Knightwood committed Aug 12, 2022
1 parent 09568a6 commit bfacd37
Show file tree
Hide file tree
Showing 11 changed files with 408 additions and 413 deletions.
30 changes: 21 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@

# 如何使用

## 初始化

```
//这个是存储的帮助类
private lateinit var xHelper:StorageXHelper
//saf帮助类
private lateinit var helper: SafHelper.Helper
//mediastore的帮助类
private lateinit var mediaStoreHelper: MediaStoreHelper.Helper
//初始化
xHelper = StoreX.with(this)
helper=xHelper.safHelper
mdiaStoreHelper = xHelper.mediaStoreHelper
```

## SAF部分

1.`FragmentActivity``Fragment`中初始化一个`helper`对象。(不一定非要在`onCreate`之类的地方初始化)
Expand All @@ -14,7 +30,7 @@
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val helper: SAFHelper.Helper = StoreX.initSaf(this)
val helper: SAFHelper.Helper = StoreX.with(this).safHelper
}
```

Expand All @@ -29,12 +45,6 @@ helper.requestOneFolder {uri-> //被用户选择的目录uri
//保存目录的读写权限
helper.savePerms(uri)
//删除一个文件
helper.deleteFile(fileUri) {b->
if (b) {
makeToast("文件删除成功")
}
}
//写文件
helper.writeFile(testFileUri) { outputStream ->
Expand Down Expand Up @@ -65,8 +75,10 @@ helper.selectFile {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mediaStoreHelper: MediaStoreHelper.Helper = StoreX.initMediaStore(this)
}
val mediaStoreHelper: MediaStoreHelper.Helper =
StoreX.with(this).mediaStoreHelper
}
```

2. 调用`mediaStoreHelper`中的方法,例如:
Expand Down
18 changes: 12 additions & 6 deletions app/src/main/java/com/kiylx/simplestore/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.documentfile.provider.DocumentFile
import com.google.android.material.button.MaterialButton
import com.kiylx.store_lib.MediaStoreHelper
import com.kiylx.store_lib.StoreX
import com.kiylx.store_lib.kit.MimeTypeConsts
import com.kiylx.store_lib.kit.ext.filter
import com.kiylx.store_lib.kit.ext.makeToast
import com.kiylx.store_lib.kit.ext.writeFileFromUri
import com.kiylx.store_lib.mediastore.FileLocate
import com.kiylx.store_lib.mediastore.MediaStoreHelper
import com.kiylx.store_lib.saf.SAFHelper
import com.kiylx.store_lib.StorageXHelper
import com.kiylx.store_lib.SafHelper
import com.kiylx.store_lib.documentfile.deleteFile
import java.nio.charset.StandardCharsets
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
Expand All @@ -40,16 +42,20 @@ import kotlin.concurrent.thread
// 2、如果你的 app 卸载后再重装的话系统不会认为是同一个 app(也就是你卸载之前创建的文件,再次安装 app 后必须先申请 READ_EXTERNAL_STORAGE 权限后才能获取到)

class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var helper: SAFHelper.Helper
private lateinit var xHelper:StorageXHelper
private lateinit var helper: SafHelper.Helper
private lateinit var mediaStoreHelper: MediaStoreHelper.Helper

private val hander = Handler(Looper.getMainLooper())

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

helper = StoreX.initSaf(this)
mediaStoreHelper = StoreX.initMediaStore(this)
xHelper = StoreX.with(this)
helper=xHelper.safHelper
mediaStoreHelper = xHelper.mediaStoreHelper

requestPermission()
findViewById<MaterialButton>(R.id.request_prem).setOnClickListener(this)
findViewById<MaterialButton>(R.id.save_prem).setOnClickListener(this)
Expand Down Expand Up @@ -116,7 +122,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
if (testFileUri == Uri.EMPTY) {
makeToast("没有文件可删除")
} else
helper.deleteFile(testFileUri) {
deleteFile(testFileUri) {
if (it) {
testFileUri = Uri.EMPTY
makeToast("文件删除成功")
Expand Down
138 changes: 138 additions & 0 deletions store_lib/src/main/java/com/kiylx/store_lib/StorageXHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package com.kiylx.store_lib

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.kiylx.store_lib.mediastore.MediaStoreFragment
import com.kiylx.store_lib.mediastore.MediaStoreMethod
import com.kiylx.store_lib.saf.FileMethod
import com.kiylx.store_lib.saf.SafImplFragment

class StorageXHelper : LifecycleEventObserver {
private var activity: FragmentActivity
set(value) {
field = value
value.lifecycle.addObserver(this)
}
private var fragment: Fragment? = null

constructor(fragment: Fragment) {
this.fragment = fragment
this.activity = fragment.requireActivity()
}

constructor(fragmentActivity: FragmentActivity) {
this.activity = fragmentActivity
}

/**
* 在Activity中获取 FragmentManager,如果在Fragment中,则获取 ChildFragmentManager。
*/
private val fragmentManager: FragmentManager
get() {
return fragment?.childFragmentManager ?: activity.supportFragmentManager
}

/**
* 使用此实例操作文件
*/
val safHelper: SafHelper.Helper by lazy {
SafHelper(fragmentManager).helper
}

val mediaStoreHelper: MediaStoreHelper.Helper by lazy {
MediaStoreHelper(fragmentManager).helper
}

companion object {
/**
* TAG of InvisibleFragment to find and create.
*/
internal const val SAF_FRAGMENT_TAG = "SafInvisibleFragment"

/**
* MediaStore Fragment tag
*/
internal const val MS_FRAGMENT_TAG = "MediaStoreInvisibleFragment"

}

override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_DESTROY) {
val t = fragmentManager.beginTransaction()
val existed1 = fragmentManager.findFragmentByTag(SAF_FRAGMENT_TAG)
val existed2 = fragmentManager.findFragmentByTag(MS_FRAGMENT_TAG)
if (existed2 != null) {
t.remove(existed2)
}
if (existed1 != null) {
t.remove(existed1)
}
t.commitAllowingStateLoss()
}
}
}

class SafHelper(private val fragmentManager: FragmentManager) {
private val invisibleFragment: SafImplFragment
get() {
val existed = fragmentManager.findFragmentByTag(StorageXHelper.SAF_FRAGMENT_TAG)
if (existed != null) {
return existed as SafImplFragment
} else {
val invisibleFragment = SafImplFragment()
fragmentManager.beginTransaction()
.add(invisibleFragment, StorageXHelper.SAF_FRAGMENT_TAG)
.commitNowAllowingStateLoss()
return invisibleFragment
}
}

/**
* 使用此实例操作文件
*/
val helper: Helper by lazy {
Helper(invisibleFragment)
}

/**
* 所有的文件操作,全部委托给[invisibleFragment]
* 使用委托的方式,隐藏掉fragment,只向外界提供接口的实现
*/
inner class Helper(private val invisibleFragment: SafImplFragment) :
FileMethod by invisibleFragment
}

class MediaStoreHelper(private val fragmentManager: FragmentManager) {
private val invisibleFragment: MediaStoreFragment
get() {
val existed = fragmentManager.findFragmentByTag(StorageXHelper.MS_FRAGMENT_TAG)
if (existed != null) {
return existed as MediaStoreFragment
} else {
val invisibleFragment = MediaStoreFragment()
fragmentManager.beginTransaction()
.add(invisibleFragment, StorageXHelper.MS_FRAGMENT_TAG)
.commitNowAllowingStateLoss()
return invisibleFragment
}
}

/**
* 使用此实例操作文件
*/
val helper: Helper by lazy {
Helper(invisibleFragment)
}

/**
* 所有的文件操作,全部委托给[invisibleFragment]
* 使用委托的方式,隐藏掉fragment,只向外界提供接口的实现
*/
inner class Helper(private val invisibleFragment: MediaStoreFragment) :
MediaStoreMethod by invisibleFragment

}
19 changes: 9 additions & 10 deletions store_lib/src/main/java/com/kiylx/store_lib/StoreX.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,28 @@ package com.kiylx.store_lib

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.kiylx.store_lib.mediastore.MediaStoreHelper
import com.kiylx.store_lib.saf.SAFHelper

class StoreX {
companion object {
@JvmStatic
fun initSaf(fragmentActivity: FragmentActivity): SAFHelper.Helper {
return SAFHelper(fragmentActivity).helper
fun with(fragmentActivity: FragmentActivity): StorageXHelper {
return StorageXHelper(fragmentActivity)
}

@JvmStatic
fun initSaf(fragment: Fragment): SAFHelper.Helper {
return SAFHelper(fragment).helper
fun with(fragment: Fragment): StorageXHelper {
return StorageXHelper(fragment)
}

@JvmStatic
fun initMediaStore(fragmentActivity: FragmentActivity): MediaStoreHelper.Helper {
return MediaStoreHelper(fragmentActivity).helper
fun StorageXHelper.safHelper(): SafHelper.Helper {
return this.safHelper
}

@JvmStatic
fun initMediaStore(fragment: Fragment): MediaStoreHelper.Helper {
return MediaStoreHelper(fragment).helper
fun StorageXHelper.mediaStoreHelper(): MediaStoreHelper.Helper {
return this.mediaStoreHelper
}

}
}
Loading

0 comments on commit bfacd37

Please sign in to comment.