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
3 changed files with 12 additions and 4 deletions
@@ -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)
@@ -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()) }
} }
@@ -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()