Check external storage permission before attempting to searcg files

This commit is contained in:
MM20 2022-01-30 15:09:05 +01:00
parent d1b991fcbd
commit f38c45656e
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
3 changed files with 12 additions and 4 deletions

View File

@ -9,6 +9,7 @@ import de.mm20.launcher2.files.providers.OwncloudFileProvider
import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.hiddenitems.HiddenItemsRepository
import de.mm20.launcher2.nextcloud.NextcloudApiHelper import de.mm20.launcher2.nextcloud.NextcloudApiHelper
import de.mm20.launcher2.owncloud.OwncloudClient import de.mm20.launcher2.owncloud.OwncloudClient
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.search.data.* import de.mm20.launcher2.search.data.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
@ -22,7 +23,8 @@ interface FileRepository {
internal class FileRepositoryImpl( internal class FileRepositoryImpl(
private val context: Context, private val context: Context,
hiddenItemsRepository: HiddenItemsRepository, hiddenItemsRepository: HiddenItemsRepository,
private val dataStore: LauncherDataStore private val dataStore: LauncherDataStore,
private val permissionsManager: PermissionsManager,
) : FileRepository { ) : FileRepository {
private val scope = CoroutineScope(Job() + Dispatchers.Default) private val scope = CoroutineScope(Job() + Dispatchers.Default)
@ -43,7 +45,7 @@ internal class FileRepositoryImpl(
dataStore.data.map { it.fileSearch }.distinctUntilChanged().collectLatest { dataStore.data.map { it.fileSearch }.distinctUntilChanged().collectLatest {
val provs = mutableListOf<FileProvider>() val provs = mutableListOf<FileProvider>()
if (it.localFiles) { if (it.localFiles) {
provs += LocalFileProvider(context) provs += LocalFileProvider(context, permissionsManager)
} }
if (it.nextcloud) { if (it.nextcloud) {
provs += NextcloudFileProvider(nextcloudClient) provs += NextcloudFileProvider(nextcloudClient)

View File

@ -5,5 +5,5 @@ import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module import org.koin.dsl.module
val filesModule = module { val filesModule = module {
single<FileRepository> { FileRepositoryImpl(androidContext(), get(), get()) } single<FileRepository> { FileRepositoryImpl(androidContext(), get(), get(), get()) }
} }

View File

@ -3,15 +3,21 @@ package de.mm20.launcher2.files.providers
import android.content.Context import android.content.Context
import android.provider.MediaStore import android.provider.MediaStore
import androidx.core.database.getStringOrNull import androidx.core.database.getStringOrNull
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.search.data.File import de.mm20.launcher2.search.data.File
import de.mm20.launcher2.search.data.LocalFile import de.mm20.launcher2.search.data.LocalFile
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
internal class LocalFileProvider( internal class LocalFileProvider(
private val context: Context private val context: Context,
private val permissionsManager: PermissionsManager
): FileProvider { ): FileProvider {
override suspend fun search(query: String): List<File> = withContext(Dispatchers.IO) { override suspend fun search(query: String): List<File> = withContext(Dispatchers.IO) {
if (!permissionsManager.checkPermissionOnce(PermissionGroup.ExternalStorage)) {
return@withContext emptyList()
}
val results = mutableListOf<LocalFile>() val results = mutableListOf<LocalFile>()
val uri = MediaStore.Files.getContentUri("external").buildUpon() val uri = MediaStore.Files.getContentUri("external").buildUpon()
.appendQueryParameter("limit", "10").build() .appendQueryParameter("limit", "10").build()