Fixed: The chooser UI now defaults to displaying external storage.

* Previously, it displayed the last known location when selecting a folder for external storage, which could confuse the user. We have now resolved this by defaulting to opening the SD card when choosing the SD card folder.
This commit is contained in:
MohitMaliFtechiz 2023-12-19 19:38:32 +05:30
parent e693dd544a
commit 50eeddd314
3 changed files with 44 additions and 7 deletions

View File

@ -28,6 +28,7 @@ import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.DocumentsContract
import android.provider.Settings import android.provider.Settings
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
@ -88,6 +89,7 @@ import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.YesNoDialog.WifiOnly import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.YesNoDialog.WifiOnly
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getSdCardUri
import org.kiwix.kiwixmobile.databinding.FragmentDestinationDownloadBinding import org.kiwix.kiwixmobile.databinding.FragmentDestinationDownloadBinding
import org.kiwix.kiwixmobile.zimManager.NetworkState import org.kiwix.kiwixmobile.zimManager.NetworkState
import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel import org.kiwix.kiwixmobile.zimManager.ZimManageViewModel
@ -402,13 +404,19 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions {
} }
private fun selectFolder() { private fun selectFolder() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
intent.addFlags( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getSdCardUri(requireActivity())?.let {
putExtra(DocumentsContract.EXTRA_INITIAL_URI, it)
}
}
addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
) )
}
selectFolderLauncher.launch(intent) selectFolderLauncher.launch(intent)
} }

View File

@ -26,6 +26,7 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.DocumentsContract
import android.view.LayoutInflater import android.view.LayoutInflater
import android.webkit.WebView import android.webkit.WebView
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
@ -55,6 +56,7 @@ import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.OpenCredits import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.OpenCredits
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getSdCardUri
import java.io.File import java.io.File
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@ -345,6 +347,11 @@ abstract class CorePrefsFragment :
private fun selectFolder() { private fun selectFolder() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getSdCardUri(requireActivity())?.let {
putExtra(DocumentsContract.EXTRA_INITIAL_URI, it)
}
}
addFlags( addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION

View File

@ -31,6 +31,7 @@ import android.util.Log
import android.webkit.URLUtil import android.webkit.URLUtil
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -293,6 +294,27 @@ object FileUtils {
.firstOrNull { it.path.contains(storageName) } .firstOrNull { it.path.contains(storageName) }
?.path?.substringBefore(context.getString(R.string.android_directory_seperator)) ?.path?.substringBefore(context.getString(R.string.android_directory_seperator))
@JvmStatic
fun getSdCardUri(context: Context): Uri? {
// Get the external SD card path
val externalSdCardPath = context.getExternalFilesDirs("")[1]
?.path?.substringBefore(context.getString(R.string.android_directory_seperator))
// Extract the SD card name from the path
val sdCardName = externalSdCardPath?.substringAfterLast("/storage/")
// If SD card name is null or empty, return null
return if (sdCardName.isNullOrEmpty()) {
null
} else {
// Build and return the URI for the SD card
val sdCardPath =
"content://com.android.externalstorage.documents/tree/" +
"$sdCardName%3A/document/$sdCardName%3A/"
sdCardPath.toUri()
}
}
@SuppressLint("WrongConstant") @SuppressLint("WrongConstant")
@JvmStatic @JvmStatic
fun getPathFromUri(activity: Activity, data: Intent): String? { fun getPathFromUri(activity: Activity, data: Intent): String? {