11package me.rosuh.filepicker
22
33import android.Manifest
4+ import android.annotation.SuppressLint
45import android.app.Activity
5- import android.content.ActivityNotFoundException
66import android.content.Intent
77import android.content.pm.PackageManager
8- import android.net.Uri
98import android.support.v7.app.AppCompatActivity
109import android.os.Bundle
1110import android.os.Environment
@@ -18,24 +17,20 @@ import android.support.v7.widget.LinearLayoutManager
1817import android.support.v7.widget.RecyclerView
1918import android.view.View
2019import android.view.ViewGroup
20+ import android.widget.Button
2121import android.widget.CheckBox
2222import android.widget.Toast
2323import com.chad.library.adapter.base.BaseQuickAdapter
2424import com.chad.library.adapter.base.BaseViewHolder
25- import me.rosuh.filepicker.bean.FileTypeEnum.COMPRESSED
26- import me.rosuh.filepicker.bean.FileTypeEnum.DIR
27- import me.rosuh.filepicker.bean.FileTypeEnum.IMAGE
28- import me.rosuh.filepicker.bean.FileTypeEnum.OCTET_STREAM
29- import me.rosuh.filepicker.bean.FileTypeEnum.UNKNOWN
30- import me.rosuh.filepicker.bean.FileTypeEnum.VIDEO
3125import me.rosuh.filepicker.adapter.FileListAdapter
3226import me.rosuh.filepicker.adapter.FileNavAdapter
3327import me.rosuh.filepicker.bean.FileItemBean
3428import me.rosuh.filepicker.bean.FileNavBean
3529import me.rosuh.filepicker.bean.IFileBean
30+ import me.rosuh.filepicker.config.FilePickerConfig
3631import me.rosuh.filepicker.config.FilePickerManager
37- import me.rosuh.filepicker.config.FilePickerManager.RESULT_KEY
3832import me.rosuh.filepicker.utils.FileUtils
33+ import me.rosuh.filepicker.utils.PercentTextView
3934import java.io.File
4035import java.util.concurrent.atomic.AtomicBoolean
4136
@@ -71,11 +66,11 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
7166 private var mBtnConfirm: AppCompatButton ? = null
7267 private var mBtnGoBack: AppCompatImageButton ? = null
7368 private val mFilesIsChecked: AtomicBoolean ? = AtomicBoolean (false )
74-
75- private val FILE_PICKER_PERMISSION_REQUEST_CODE = 10201
69+ private var mTvSelected : PercentTextView ? = null
70+ private val pickerConfig by lazy { FilePickerConfig .getInstance( FilePickerManager .instance) }
7671
7772 override fun onCreate (savedInstanceState : Bundle ? ) {
78- setTheme(FilePickerManager .themeId)
73+ setTheme(pickerConfig .themeId)
7974
8075 super .onCreate(savedInstanceState)
8176 setContentView(R .layout.activity_file_picker)
@@ -101,7 +96,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
10196 ActivityCompat .requestPermissions(
10297 this @FilePickerActivity,
10398 arrayOf(Manifest .permission.READ_EXTERNAL_STORAGE ),
104- FILE_PICKER_PERMISSION_REQUEST_CODE
99+ Companion . FILE_PICKER_PERMISSION_REQUEST_CODE
105100 )
106101 }
107102
@@ -111,7 +106,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
111106 grantResults : IntArray
112107 ) {
113108 when (requestCode) {
114- FILE_PICKER_PERMISSION_REQUEST_CODE -> {
109+ Companion . FILE_PICKER_PERMISSION_REQUEST_CODE -> {
115110 if (grantResults.isEmpty() || grantResults[0 ] != PackageManager .PERMISSION_GRANTED ) {
116111 Toast .makeText(this @FilePickerActivity, " 未授予存储权限" , Toast .LENGTH_SHORT ).show()
117112 } else {
@@ -126,7 +121,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
126121 */
127122 private fun prepareLauncher () {
128123 if (Environment .getExternalStorageState() != MEDIA_MOUNTED ) {
129- throw Throwable (IllegalStateException (" 外部存储不可用" ))
124+ throw Throwable (cause = IllegalStateException (" 外部存储不可用" ))
130125 }
131126
132127 // 根目录文件对象
@@ -149,6 +144,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
149144 mBtnSelectedAll = findViewById(R .id.btn_selected_all_file_picker)
150145 mBtnConfirm = findViewById(R .id.btn_confirm_file_picker)
151146 mBtnGoBack = findViewById(R .id.btn_go_back_file_picker)
147+ mTvSelected = findViewById(R .id.tv_toolbar_title_file_picker)
152148 mBtnGoBack!! .setOnClickListener(this )
153149 mBtnSelectedAll!! .setOnClickListener(this )
154150 mBtnConfirm!! .setOnClickListener(this )
@@ -198,7 +194,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
198194 }
199195
200196 /* *
201- * 根据被点击项的类型,触发不同的操作
197+ * 传递条目点击事件给调用者
202198 * @param adapter BaseQuickAdapter<*, *>?
203199 * @param view View?
204200 * @param position Int
@@ -207,40 +203,13 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
207203 // 如果不是点击列表,则返回
208204 if (view!! .id != R .id.item_list_file_picker) return
209205 val item = adapter!! .getItem(position) as FileItemBean
206+ val file = File (item.filePath)
210207
211- val intent = Intent ()
212- intent.action = Intent .ACTION_SEND
213- try {
214- when (item.fileType) {
215- DIR -> {
216- // 文件夹则进入
217- enterDirAndUpdateUI(item)
218- }
219- IMAGE -> {
220- intent.type = " image/*"
221- intent.data = Uri .parse(item.mFilePath)
222- startActivity(intent)
223- }
224- VIDEO -> {
225- intent.type = " video/*"
226- intent.data = Uri .parse(item.filePath)
227- startActivity(intent)
228- }
229- COMPRESSED -> {
230- val sub = item.mFileName.substring(item.mFileName.lastIndexOf(" ." ))
231- intent.type = " application/$sub "
232- intent.data = Uri .parse(item.filePath)
233- startActivity(intent)
234- }
235- UNKNOWN -> {
236- Toast .makeText(this @FilePickerActivity, " 我们不知道如何打开该文件" , Toast .LENGTH_SHORT ).show()
237- }
238- OCTET_STREAM -> {
239- Toast .makeText(this @FilePickerActivity, " 我们不知道如何打开该文件" , Toast .LENGTH_SHORT ).show()
240- }
241- }
242- } catch (ae: ActivityNotFoundException ) {
243- Toast .makeText(this @FilePickerActivity, " 没有应用可以打开该文件" , Toast .LENGTH_SHORT ).show()
208+ if (file.exists() && file.isDirectory) {
209+ // 如果是文件夹,则进入
210+ enterDirAndUpdateUI(item)
211+ } else {
212+ FilePickerConfig .getInstance(FilePickerManager .instance).fileIFileItemOnClickListener?.onItemClick(item, position)
244213 }
245214 }
246215
@@ -263,6 +232,8 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
263232
264233 /* *
265234 * 从导航栏中调用本方法,需要传入 pos,以便生产新的 nav adapter
235+ * @param iFileBean IFileBean
236+ * @param position Int 用来定位导航栏的当前 item,如果是后退按钮,则传入倒数第二个 position
266237 */
267238 private fun enterDirAndUpdateUI (iFileBean : IFileBean , position : Int ) {
268239 // 获取文件夹文件
@@ -301,7 +272,13 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
301272 }
302273
303274 override fun onBackPressed () {
304- super .onBackPressed()
275+ if (mNavDataSource.size <= 1 ) {
276+ super .onBackPressed()
277+ } else {
278+ // 即将进入的 item 的索引
279+ val willEnterItemPos = mNavDataSource.size - 2
280+ enterDirAndUpdateUI(mNavDataSource[willEnterItemPos], willEnterItemPos)
281+ }
305282 }
306283
307284 override fun onClick (v : View ? ) {
@@ -310,20 +287,26 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
310287 R .id.btn_selected_all_file_picker -> {
311288 if (mFilesIsChecked!! .get()) {
312289 for (data in mListAdapter!! .data) {
313- if (FilePickerManager .isSkipDir && data.fileType == DIR ) {
290+ val file = File (data.filePath)
291+ if (pickerConfig.isSkipDir && file.exists() && file.isDirectory) {
314292 continue
315293 }
316294 data.isChecked = false
317295 }
318- mBtnSelectedAll!! .text = " 图片全选"
296+ mBtnSelectedAll!! .text = pickerConfig.selectAllText
297+ mTvSelected!! .text = pickerConfig.goBackText
319298 } else {
299+ var checkedCount = 0
320300 for (data in mListAdapter!! .data) {
321- if (FilePickerManager .isSkipDir && data.fileType == DIR ) {
301+ val file = File (data.filePath)
302+ if (pickerConfig.isSkipDir && file.exists() && file.isDirectory) {
322303 continue
323304 }
324305 data.isChecked = true
306+ checkedCount++
325307 }
326- mBtnSelectedAll!! .text = " 取消选中"
308+ mBtnSelectedAll!! .text = pickerConfig.unSelectAllText
309+ mTvSelected!! .text = pickerConfig.hadSelectedText + checkedCount
327310 }
328311
329312 mListAdapter!! .notifyDataSetChanged()
@@ -344,7 +327,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
344327 finish()
345328 }
346329
347- intent.putExtra( RESULT_KEY , list)
330+ FilePickerManager .instance.saveData( list)
348331 this @FilePickerActivity.setResult(Activity .RESULT_OK , intent)
349332 finish()
350333 }
@@ -353,4 +336,8 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
353336 }
354337 }
355338 }
339+
340+ companion object {
341+ const val FILE_PICKER_PERMISSION_REQUEST_CODE = 10201
342+ }
356343}
0 commit comments