refactor: make TvFilePicker activity more sustainable

This commit is contained in:
albexk 2024-11-18 21:03:43 +03:00
parent 51092e91cf
commit 392cacaabc
2 changed files with 40 additions and 14 deletions

View file

@ -32,9 +32,9 @@ import android.widget.Toast
import androidx.annotation.MainThread import androidx.annotation.MainThread
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import java.io.FileNotFoundException
import java.io.IOException import java.io.IOException
import kotlin.LazyThreadSafetyMode.NONE import kotlin.LazyThreadSafetyMode.NONE
import kotlin.coroutines.CoroutineContext
import kotlin.text.RegexOption.IGNORE_CASE import kotlin.text.RegexOption.IGNORE_CASE
import AppListProvider import AppListProvider
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
@ -584,7 +584,9 @@ class AmneziaActivity : QtActivity() {
if (isOnTv() && it?.hasExtra("activityNotFound") == true) { if (isOnTv() && it?.hasExtra("activityNotFound") == true) {
showNoFileBrowserAlertDialog() showNoFileBrowserAlertDialog()
} }
val uri = it?.data?.toString() ?: "" val uri = it?.data?.apply {
grantUriPermission(packageName, this, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}.toString() ?: ""
Log.v(TAG, "Open file: $uri") Log.v(TAG, "Open file: $uri")
mainScope.launch { mainScope.launch {
qtInitialized.await() qtInitialized.await()
@ -615,30 +617,43 @@ class AmneziaActivity : QtActivity() {
} }
@Suppress("unused") @Suppress("unused")
fun getFd(fileName: String): Int = try { fun getFd(fileName: String): Int {
Log.v(TAG, "Get fd for $fileName") Log.v(TAG, "Get fd for $fileName")
pfd = contentResolver.openFileDescriptor(Uri.parse(fileName), "r") return blockingCall {
pfd?.fd ?: -1 try {
} catch (e: FileNotFoundException) { pfd = contentResolver.openFileDescriptor(Uri.parse(fileName), "r")
Log.e(TAG, "Failed to get fd: $e") pfd?.fd ?: -1
-1 } catch (e: Exception) {
Log.e(TAG, "Failed to get fd: $e")
-1
}
}
} }
@Suppress("unused") @Suppress("unused")
fun closeFd() { fun closeFd() {
Log.v(TAG, "Close fd") Log.v(TAG, "Close fd")
pfd?.close() mainScope.launch {
pfd = null pfd?.close()
pfd = null
}
} }
@Suppress("unused") @Suppress("unused")
fun getFileName(uri: String): String { fun getFileName(uri: String): String {
contentResolver.query(Uri.parse(uri), arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor -> Log.v(TAG, "Get file name for uri: $uri")
if (cursor.moveToFirst() && !cursor.isNull(0)) { return blockingCall {
return cursor.getString(0) try {
contentResolver.query(Uri.parse(uri), arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor ->
if (cursor.moveToFirst() && !cursor.isNull(0)) {
return@blockingCall cursor.getString(0) ?: ""
}
}
} catch (e: Exception) {
Log.e(TAG, "Failed to get file name: $e")
} }
""
} }
return ""
} }
@Suppress("unused") @Suppress("unused")
@ -848,6 +863,13 @@ class AmneziaActivity : QtActivity() {
/** /**
* Utils methods * Utils methods
*/ */
private fun <T> blockingCall(
context: CoroutineContext = Dispatchers.Main.immediate,
block: suspend () -> T
) = runBlocking {
mainScope.async(context) { block() }.await()
}
companion object { companion object {
private fun actionCodeToString(actionCode: Int): String = private fun actionCodeToString(actionCode: Int): String =
when (actionCode) { when (actionCode) {

View file

@ -36,6 +36,10 @@ class TvFilePicker : ComponentActivity() {
Log.w(TAG, "Activity not found") Log.w(TAG, "Activity not found")
setResult(RESULT_CANCELED, Intent().apply { putExtra("activityNotFound", true) }) setResult(RESULT_CANCELED, Intent().apply { putExtra("activityNotFound", true) })
finish() finish()
} catch (e: Exception) {
Log.e(TAG, "Failed to get file: $e")
setResult(RESULT_CANCELED)
finish()
} }
} }
} }