@@ -4,11 +4,14 @@ import android.Manifest
44import android.app.Activity
55import android.content.ActivityNotFoundException
66import android.content.Intent
7+ import android.content.pm.PackageManager
78import android.net.Uri
89import android.support.v7.app.AppCompatActivity
910import android.os.Bundle
1011import android.os.Environment
1112import android.os.Environment.MEDIA_MOUNTED
13+ import android.support.v4.app.ActivityCompat
14+ import android.support.v4.content.ContextCompat
1215import android.support.v7.widget.AppCompatButton
1316import android.support.v7.widget.AppCompatImageButton
1417import android.support.v7.widget.LinearLayoutManager
@@ -19,7 +22,6 @@ import android.widget.CheckBox
1922import android.widget.Toast
2023import com.chad.library.adapter.base.BaseQuickAdapter
2124import com.chad.library.adapter.base.BaseViewHolder
22- import com.tbruyelle.rxpermissions2.RxPermissions
2325import me.rosuh.filepicker.bean.FileTypeEnum.COMPRESSED
2426import me.rosuh.filepicker.bean.FileTypeEnum.DIR
2527import me.rosuh.filepicker.bean.FileTypeEnum.IMAGE
@@ -43,68 +45,105 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
4345 /* *
4446 * 文件列表
4547 */
46- var mRvList: RecyclerView ? = null
48+ private var mRvList: RecyclerView ? = null
4749 /* *
4850 * 导航栏列表
4951 */
50- var mNavList: RecyclerView ? = null
52+ private var mNavList: RecyclerView ? = null
5153 /* *
5254 * 文件列表适配器
5355 */
54- var mListAdapter: BaseQuickAdapter <FileItemBean , BaseViewHolder >? = null
56+ private var mListAdapter: BaseQuickAdapter <FileItemBean , BaseViewHolder >? = null
5557 /* *
5658 * 导航栏列表适配器
5759 */
58- var mNavAdapter: BaseQuickAdapter <FileNavBean , BaseViewHolder >? = null
60+ private var mNavAdapter: BaseQuickAdapter <FileNavBean , BaseViewHolder >? = null
5961 /* *
6062 * 导航栏数据集
6163 */
62- var mNavDataSource = ArrayList <FileNavBean >()
64+ private var mNavDataSource = ArrayList <FileNavBean >()
6365 /* *
6466 * 文件夹为空时展示的空视图
6567 */
66- var mEmptyView: View ? = null
68+ private var mEmptyView: View ? = null
6769
68- var mBtnSelectedAll: AppCompatButton ? = null
69- var mBtnConfirm: AppCompatButton ? = null
70- var mBtnGoBack: AppCompatImageButton ? = null
71- val mFilesIsChecked: AtomicBoolean ? = AtomicBoolean (false )
70+ private var mBtnSelectedAll: AppCompatButton ? = null
71+ private var mBtnConfirm: AppCompatButton ? = null
72+ private var mBtnGoBack: AppCompatImageButton ? = null
73+ private val mFilesIsChecked: AtomicBoolean ? = AtomicBoolean (false )
74+
75+ private val FILE_PICKER_PERMISSION_REQUEST_CODE = 10201
7276
7377 override fun onCreate (savedInstanceState : Bundle ? ) {
7478 setTheme(FilePickerManager .themeId)
79+
7580 super .onCreate(savedInstanceState)
7681 setContentView(R .layout.activity_file_picker)
7782 // 获取权限
78- val rxPermissions = RxPermissions (this )
79- val dispose = rxPermissions
80- .request(Manifest .permission.READ_EXTERNAL_STORAGE , Manifest .permission.WRITE_EXTERNAL_STORAGE )
81- .subscribe {
82- if (! it) {
83- Toast .makeText(this @FilePickerActivity, " 未授予存储权限" , Toast .LENGTH_SHORT ).show()
84- finish()
85- } else {
86- Toast .makeText(this @FilePickerActivity, " 已授予存储权限" , Toast .LENGTH_SHORT ).show()
87- if (Environment .getExternalStorageState() != MEDIA_MOUNTED ) {
88- throw Throwable (IllegalStateException (" 外部存储不可用" ))
89- }
83+ if (setupPermission()) {
84+ prepareLauncher()
85+ }
86+ }
9087
91- // 根目录文件对象
92- val rootFile = File (Environment .getExternalStorageDirectory().absoluteFile.toURI())
88+ private fun setupPermission (): Boolean {
89+ val permissionStatus = ContextCompat .checkSelfPermission(this , Manifest .permission.READ_EXTERNAL_STORAGE )
90+ if (permissionStatus != PackageManager .PERMISSION_GRANTED ) {
91+ requestPermission()
92+ return false
93+ }
94+ return true
95+ }
9396
94- // 文件列表数据集
95- val listData = FileUtils .produceListDataSource(rootFile)
96- mNavDataSource =
97- FileUtils .produceNavDataSource(
98- mNavDataSource,
99- Environment .getExternalStorageDirectory().absolutePath
100- )
97+ /* *
98+ * 申请权限
99+ */
100+ private fun requestPermission () {
101+ ActivityCompat .requestPermissions(
102+ this @FilePickerActivity,
103+ arrayOf(Manifest .permission.READ_EXTERNAL_STORAGE ),
104+ FILE_PICKER_PERMISSION_REQUEST_CODE
105+ )
106+ }
101107
102- initView(listData, mNavDataSource)
108+ override fun onRequestPermissionsResult (
109+ requestCode : Int ,
110+ permissions : Array <out String >,
111+ grantResults : IntArray
112+ ) {
113+ when (requestCode) {
114+ FILE_PICKER_PERMISSION_REQUEST_CODE -> {
115+ if (grantResults.isEmpty() || grantResults[0 ] != PackageManager .PERMISSION_GRANTED ) {
116+ Toast .makeText(this @FilePickerActivity, " 未授予存储权限" , Toast .LENGTH_SHORT ).show()
117+ } else {
118+ prepareLauncher()
103119 }
104120 }
121+ }
122+ }
123+
124+ /* *
125+ * 在做完权限申请之后开始的真正的工作
126+ */
127+ private fun prepareLauncher () {
128+ if (Environment .getExternalStorageState() != MEDIA_MOUNTED ) {
129+ throw Throwable (IllegalStateException (" 外部存储不可用" ))
130+ }
131+
132+ // 根目录文件对象
133+ val rootFile = FileUtils .getRootFile()
134+
135+ // 文件列表数据集
136+ val listData = FileUtils .produceListDataSource(rootFile)
137+ mNavDataSource =
138+ FileUtils .produceNavDataSource(
139+ mNavDataSource,
140+ Environment .getExternalStorageDirectory().absolutePath
141+ )
142+
143+ initView(listData, mNavDataSource)
105144 }
106145
107- fun initView (fileListData : ArrayList <FileItemBean >, fileNavData : ArrayList <FileNavBean >) {
146+ private fun initView (fileListData : ArrayList <FileItemBean >, fileNavData : ArrayList <FileNavBean >) {
108147 mRvList = findViewById(R .id.rv_list_file_picker)
109148 mNavList = findViewById(R .id.rv_nav_file_picker)
110149 mBtnSelectedAll = findViewById(R .id.btn_selected_all_file_picker)
@@ -115,7 +154,8 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
115154 mBtnConfirm!! .setOnClickListener(this )
116155
117156 // 空视图
118- mEmptyView = layoutInflater.inflate(R .layout.item_empty_view_file_picker, mRvList!! .parent as ViewGroup , false )
157+ mEmptyView =
158+ layoutInflater.inflate(R .layout.item_empty_view_file_picker, mRvList!! .parent as ViewGroup , false )
119159 // 列表适配器
120160 mListAdapter = produceListAdapter(fileListData)
121161 // 导航栏适配器
@@ -188,7 +228,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
188228 }
189229 COMPRESSED -> {
190230 val sub = item.mFileName.substring(item.mFileName.lastIndexOf(" ." ))
191- intent.type = " application/" + sub
231+ intent.type = " application/$ sub"
192232 intent.data = Uri .parse(item.filePath)
193233 startActivity(intent)
194234 }
@@ -209,11 +249,11 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
209249 * 从列表中时,需要获取目标文件夹在 nav 列表中的位置,如果没有则传入 -1
210250 * TODO 进入下一个文件夹之前,需要先清空当前的选中状态?貌似不需要
211251 */
212- fun enterDirAndUpdateUI (iFileBean : IFileBean ) {
252+ private fun enterDirAndUpdateUI (iFileBean : IFileBean ) {
213253 var pos = - 1
214254
215255 for (data in mNavAdapter!! .data) {
216- if (data.dirPath.equals( iFileBean.filePath) ) {
256+ if (data.dirPath == iFileBean.filePath) {
217257 pos = mNavAdapter!! .data.indexOf(data)
218258 }
219259 }
@@ -224,7 +264,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
224264 /* *
225265 * 从导航栏中调用本方法,需要传入 pos,以便生产新的 nav adapter
226266 */
227- fun enterDirAndUpdateUI (iFileBean : IFileBean , position : Int ) {
267+ private fun enterDirAndUpdateUI (iFileBean : IFileBean , position : Int ) {
228268 // 获取文件夹文件
229269 val nextFiles = File (iFileBean.filePath)
230270 // 获取列表的数据集
@@ -262,7 +302,6 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
262302
263303 override fun onBackPressed () {
264304 super .onBackPressed()
265-
266305 }
267306
268307 override fun onClick (v : View ? ) {
0 commit comments