diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f9dddd8..3a14efd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "com.zaneschepke.wireguardautotunnel" minSdk = 26 targetSdk = 34 - versionCode = 30002 - versionName = "3.0.2" + versionCode = 30003 + versionName = "3.0.3" multiDexEnabled = true diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt index d4283bc..628a393 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/Constants.kt @@ -12,4 +12,6 @@ object Constants { const val URI_CONTENT_SCHEME = "content" const val URI_PACKAGE_SCHEME = "package" const val ALLOWED_FILE_TYPES = "*/*" + const val FILES_SHOW_ADVANCED = "android.content.extra.SHOW_ADVANCED" + const val ANDROID_TV_STUBS = "com.google.android.tv.frameworkpackagestubs" } \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt index a8d52af..012df70 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt @@ -210,15 +210,20 @@ fun MainScreen( .fillMaxWidth() .clickable { showBottomSheet = false - val fileSelectionIntent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + val fileSelectionIntent = Intent(Intent.ACTION_GET_CONTENT).apply { addCategory(Intent.CATEGORY_OPENABLE) + putExtra(Constants.FILES_SHOW_ADVANCED, true) type = Constants.ALLOWED_FILE_TYPES } - if (fileSelectionIntent.resolveActivity(context.packageManager) != null) { - pickFileLauncher.launch(fileSelectionIntent) - } else { - viewModel.showSnackBarMessage(context.getString(R.string.no_file_app)) + if(!viewModel.isIntentAvailable(fileSelectionIntent)) { + fileSelectionIntent.action = Intent.ACTION_OPEN_DOCUMENT + fileSelectionIntent.setPackage(null) + if (!viewModel.isIntentAvailable(fileSelectionIntent)) { + viewModel.showSnackBarMessage(context.getString(R.string.no_file_app)) + return@clickable + } } + pickFileLauncher.launch(fileSelectionIntent) } .padding(10.dp) ) { diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt index 31625af..99624c3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt @@ -2,6 +2,8 @@ package com.zaneschepke.wireguardautotunnel.ui.screens.main import android.app.Application import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager import android.database.Cursor import android.net.Uri import android.provider.OpenableColumns @@ -207,6 +209,23 @@ class MainViewModel @Inject constructor(private val application : Application, return columnIndex } + fun isIntentAvailable(i: Intent?): Boolean { + val packageManager = application.packageManager + val list = packageManager.queryIntentActivities( + i!!, + PackageManager.MATCH_DEFAULT_ONLY + ) + // Ignore the Android TV framework app in the list + var size = list.size + for (ri in list) { + // Ignore stub apps + if (Constants.ANDROID_TV_STUBS == ri.activityInfo.packageName) { + size-- + } + } + return size > 0 + } + private fun getDisplayNameByCursor(cursor: Cursor) : String { if(cursor.moveToFirst()) { val index = getDisplayNameColumnIndex(cursor)