Skip to content

Commit

Permalink
Use DocumentsContract for dir listing
Browse files Browse the repository at this point in the history
fixes #15
  • Loading branch information
Jakeler committed Feb 18, 2021
1 parent c8d80f0 commit 694067d
Showing 1 changed file with 52 additions and 8 deletions.
60 changes: 52 additions & 8 deletions Application/src/main/java/jk/ut61eTool/FileSelectActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package jk.ut61eTool

import android.app.Activity
import android.content.Intent
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.provider.DocumentsContract
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.documentfile.provider.DocumentFile
import androidx.preference.PreferenceManager
import java.util.*

Expand All @@ -29,25 +30,59 @@ class FileSelectActivity : Activity() {
finish()
return
}
val dir = DocumentFile.fromTreeUri(this, Uri.parse(uriEnc))
val files = dir?.listFiles()?.filter {file -> file.isFile}
if (files == null) {
Log.w("FILE SELECT", "no files")

val uri = Uri.parse(uriEnc)
val dUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri))

val proj = arrayOf(
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
DocumentsContract.Document.COLUMN_SIZE,
DocumentsContract.Document.COLUMN_LAST_MODIFIED,
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_MIME_TYPE,
)
// filter not working on fs:
// https://stackoverflow.com/questions/56263620/contentresolver-query-on-documentcontract-lists-all-files-disregarding-selection
val sel = "text/comma-separated-values"
val order = DocumentsContract.Document.COLUMN_SIZE + " ASC"

var cursor: Cursor? = null;
try {
cursor = contentResolver.query(dUri, proj, sel, null, order)
} catch (e: Exception) {
Log.w("FILE SELECT", "Error: ${e.message}")
Toast.makeText(this, getString(R.string.error_folder_missing), Toast.LENGTH_SHORT).show()
finish()
return
}

val files = arrayListOf<FileEntry>()
cursor?.use {
while (it.moveToNext()) {
// Workaround: manual filter
if (it.getString(4) != sel)
continue

FileEntry(
it.getString(0),
it.getLong(1),
Date(it.getLong(2)),
it.getString(3)
).let {fileEntry -> files.add(fileEntry) }
}
}

if (files.isEmpty())
Toast.makeText(this, getString(R.string.error_folder_empty), Toast.LENGTH_SHORT).show()

val arrayAdapter = object : ArrayAdapter<DocumentFile>(this, R.layout.listitem_files, R.id.filename, files) {
val arrayAdapter = object : ArrayAdapter<FileEntry>(this, R.layout.listitem_files, R.id.filename, files) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = super.getView(position, convertView, parent)
val file = getItem(position) ?: return view

view.findViewById<TextView>(R.id.filename)?.text = file.name
view.findViewById<TextView>(R.id.logfile_info)?.text =
"Filesize: ${file.length()/1000.0} KB\nModified: ${Date(file.lastModified())}"
"Filesize: ${file.size/1000.0} KB\nModified: ${file.lastMod}"
return view
}
}
Expand All @@ -56,9 +91,18 @@ class FileSelectActivity : Activity() {

fileListView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
val intent = Intent(this@FileSelectActivity, ViewLogActivity::class.java)
intent.putExtra("filename", files[position].uri)
DocumentsContract.buildDocumentUriUsingTree(uri, files[position].id).let {
intent.putExtra("filename", it)
}
startActivity(intent)
}
}

}

data class FileEntry(
val name: String,
val size: Long,
val lastMod: Date,
val id: String,
)

0 comments on commit 694067d

Please sign in to comment.