diff --git a/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt b/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt index fcefd89f79..96df9253a4 100644 --- a/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt +++ b/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt @@ -34,6 +34,7 @@ import android.provider.DocumentsContract import android.provider.DocumentsProvider import android.provider.Settings import androidx.core.app.NotificationManagerCompat +import androidx.core.content.edit import androidx.core.net.toUri import androidx.core.os.bundleOf import com.infomaniak.core.common.cancellable @@ -89,6 +90,10 @@ class CloudStorageProvider : DocumentsProvider() { private val cloudScope = CoroutineScope( CoroutineName("CloudStorage") + Executors.newSingleThreadExecutor().asCoroutineDispatcher() ) + private fun isProviderDisabled(): Boolean { + val ctx = context ?: return true + return isDisabled(ctx) + } /** * Indicates whether the current platform is Chrome OS. @@ -176,6 +181,11 @@ class CloudStorageProvider : DocumentsProvider() { override fun queryChildDocuments(parentDocumentId: String, projection: Array?, sortOrder: String?): Cursor { val cursor = DocumentCursor(projection ?: DEFAULT_DOCUMENT_PROJECTION, isAutoCloseableJob = false) + if (isProviderDisabled()) { + cursor.extras = bundleOf(DocumentsContract.EXTRA_ERROR to (context?.getString(R.string.fileProviderExtensionError))) + return cursor + } + val uri = DocumentCursor.createUri(context, parentDocumentId) val isNewJob = uri != oldQueryChildUri || needRefresh @@ -285,6 +295,9 @@ class CloudStorageProvider : DocumentsProvider() { override fun openDocument(documentId: String, mode: String, signal: CancellationSignal?): ParcelFileDescriptor? { SentryLog.d(TAG, "openDocument(), id=$documentId, mode=$mode, signalIsCancelled: ${signal?.isCanceled}") + if (isProviderDisabled()) { + throw SecurityException("File provider disabled (kDrive is no longer available in the Files application and in third-party applications)") + } val context = context ?: return null fun getRemoteFile(localFile: File?, fileId: Int, driveId: Int): File? { @@ -863,6 +876,8 @@ class CloudStorageProvider : DocumentsProvider() { private const val DRIVE_SEPARATOR = "@" private const val MY_SHARES_FOLDER_ID = -1 private const val SHARED_WITHME_FOLDER_ID = -2 + private const val PREFS_NAME = "cloud_storage_provider" + private const val KEY_DISABLED = "disabled_by_app_lock" private val SHARED_URI_REGEX = Regex("\\d+/-\\d+/.+$DRIVE_SEPARATOR\\d+/\\d+") @@ -964,6 +979,15 @@ class CloudStorageProvider : DocumentsProvider() { comeFromSharedWithMe(documentId) ) + fun isDisabled(context: Context): Boolean { + return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getBoolean(KEY_DISABLED, false) + } + + fun setDisabled(context: Context, disabled: Boolean) { + context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit { putBoolean(KEY_DISABLED, disabled) } + notifyRootsChanged(context) + } + fun notifyRootsChanged(context: Context) { val authority = context.getString(R.string.CLOUD_STORAGE_AUTHORITY) val rootsUri = DocumentsContract.buildRootsUri(authority) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/AppSecuritySettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/AppSecuritySettingsActivity.kt index 12a8163cec..1cda66c4e1 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/AppSecuritySettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/AppSecuritySettingsActivity.kt @@ -26,9 +26,11 @@ import com.infomaniak.core.applock.AppLockManager import com.infomaniak.core.twofactorauth.front.TwoFactorAuthApprovalAutoManagedBottomSheet import com.infomaniak.core.twofactorauth.front.addComposeOverlay import com.infomaniak.drive.R +import com.infomaniak.drive.data.documentprovider.CloudStorageProvider import com.infomaniak.drive.data.models.AppSettings import com.infomaniak.drive.databinding.ViewSwitchSettingsBinding import com.infomaniak.drive.twoFactorAuthManager +import splitties.init.appCtx class AppSecuritySettingsActivity : AppCompatActivity() { @@ -54,7 +56,10 @@ class AppSecuritySettingsActivity : AppCompatActivity() { // Reverse switch (before official parameter changed) by silent click silentlyReverseSwitch(this) { shouldLock -> AppSettings.appSecurityLock = shouldLock - if (shouldLock) AppLockManager.unlock() + if (shouldLock) { + CloudStorageProvider.setDisabled(appCtx, true) + AppLockManager.unlock() + } } } } diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SecuritySettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SecuritySettingsFragment.kt new file mode 100644 index 0000000000..8a1b6f3985 --- /dev/null +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SecuritySettingsFragment.kt @@ -0,0 +1,81 @@ +/* + * Infomaniak kDrive - Android + * Copyright (C) 2022-2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.drive.ui.menu.settings + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.infomaniak.core.applock.AppLockManager +import com.infomaniak.core.fragmentnavigation.safelyNavigate +import com.infomaniak.core.legacy.utils.safeBinding +import com.infomaniak.drive.MatomoDrive.MatomoName +import com.infomaniak.drive.MatomoDrive.trackSettingsEvent +import com.infomaniak.drive.R +import com.infomaniak.drive.data.documentprovider.CloudStorageProvider +import com.infomaniak.drive.data.models.AppSettings +import com.infomaniak.drive.databinding.FragmentSettingsSecurityBinding +import com.infomaniak.drive.extensions.enableEdgeToEdge +import splitties.init.appCtx + +class SecuritySettingsFragment : Fragment() { + + private var binding: FragmentSettingsSecurityBinding by safeBinding() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + return FragmentSettingsSecurityBinding.inflate(inflater, container, false).also { binding = it }.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { + super.onViewCreated(view, savedInstanceState) + + toolbar.setNavigationOnClickListener { + findNavController().popBackStack() + } + + appSecurity.apply { + if (AppLockManager.hasBiometrics()) { + isVisible = true + setOnClickListener { + trackSettingsEvent(MatomoName.LockApp) + safelyNavigate(R.id.appSecurityActivity) + } + } else { + isGone = true + } + } + contentProviderSwitch.isChecked = !CloudStorageProvider.isDisabled(appCtx) + + contentProviderSwitch.setOnCheckedChangeListener { _, isChecked -> + CloudStorageProvider.setDisabled(appCtx, disabled = !isChecked) + } + + binding.root.enableEdgeToEdge() + } + + override fun onResume() = with(binding) { + super.onResume() + appSecurity.endText = getString(if (AppSettings.appSecurityLock) R.string.allActivated else R.string.allDisabled) + contentProviderSwitch.isChecked = !CloudStorageProvider.isDisabled(appCtx) + } + +} diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt index 82a19dfa1b..f0f3732ae6 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt @@ -27,14 +27,12 @@ import androidx.activity.result.contract.ActivityResultContracts.StartActivityFo import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arrayMapOf -import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.infomaniak.core.applock.AppLockManager import com.infomaniak.core.auth.room.UserDatabase import com.infomaniak.core.bugtracker.BugTrackerActivity import com.infomaniak.core.bugtracker.BugTrackerActivityArgs @@ -93,17 +91,7 @@ class SettingsFragment : Fragment() { syncPicture.setOnClickListener { safelyNavigate(R.id.syncSettingsActivity) } themeSettings.setOnClickListener { openThemeSettings() } notifications.setOnClickListener { requireContext().openAppNotificationSettings() } - appSecurity.apply { - if (AppLockManager.hasBiometrics()) { - isVisible = true - setOnClickListener { - trackSettingsEvent(MatomoName.LockApp) - safelyNavigate(R.id.appSecurityActivity) - } - } else { - isGone = true - } - } + security.setOnClickListener { safelyNavigate(R.id.securitySettingsFragment) } initFileSync() about.setOnClickListener { safelyNavigate(R.id.aboutSettingsFragment) } @@ -215,7 +203,6 @@ class SettingsFragment : Fragment() { override fun onResume() = with(binding) { super.onResume() syncPicture.endText = getString(if (AccountUtils.isEnableAppSync()) R.string.allActivated else R.string.allDisabled) - appSecurity.endText = getString(if (AppSettings.appSecurityLock) R.string.allActivated else R.string.allDisabled) setThemeSettingsValue() } diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 2d8dc03ca1..45688c6cdd 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -142,12 +142,11 @@ app:title="@string/notificationTitle" /> + app:itemAction="chevron" + app:title="Sécurité" /> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/main_navigation.xml b/app/src/main/res/navigation/main_navigation.xml index 6d6fd919d9..5521663aef 100644 --- a/app/src/main/res/navigation/main_navigation.xml +++ b/app/src/main/res/navigation/main_navigation.xml @@ -554,6 +554,9 @@ + + + + Filer Vælg rettighed + Hvis denne indstilling deaktiveres, vil kDrive ikke længere være tilgængelig i Filer-applikationen og i tredjepartsapplikationer. + Du har deaktiveret visning af filer fra kDrive. Du kan aktivere det igen i appens indstillinger. + Vis i Filer Tilføj en besked til gæster (valgfrit) Deling og rettigheder for fil %s Deling og rettigheder for mappe %s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c78834410b..28d85020f1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -449,6 +449,9 @@ Dateien Recht auswählen + Wenn diese Option deaktiviert ist, ist kDrive in der Anwendung Dateien und in Anwendungen von Drittanbietern nicht mehr verfügbar. + Sie haben die Dateianzeige aus kDrive deaktiviert. Sie können sie in den App-Einstellungen wieder aktivieren. + Ansicht in Dateien Nachricht an Gäste hinzufügen (fakultativ) Freigabe und Rechte der Datei %s Freigabe und Rechte des Ordners %s diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9f0530995e..c8b66dd5d6 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -449,6 +449,9 @@ Αρχεία Επιλέξτε το δικαίωμα + Εάν αυτή η επιλογή απενεργοποιηθεί, το kDrive δεν θα είναι πλέον διαθέσιμο στην εφαρμογή Αρχεία και σε εφαρμογές τρίτων. + Έχετε απενεργοποιήσει την εμφάνιση αρχείων από το kDrive. Μπορείτε να την ενεργοποιήσετε ξανά στις ρυθμίσεις της εφαρμογής. + Εμφάνιση στα Αρχεία Προσθήκη μηνύματος για επισκέπτες (προαιρετικό) Κοινή χρήση και δικαιώματα του αρχείου %s Κοινή χρήση και δικαιώματα του φακέλου %s diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 93bf3b8da0..3e5ee8e68a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -449,6 +449,9 @@ Archivos Seleccionar el derecho + Si se desactiva esta opción, kDrive dejará de estar disponible en la aplicación Archivos y en las aplicaciones de terceros. + Ha desactivado la visualización de archivos desde kDrive. Puede volver a activarla en la configuración de la aplicación. + Ver en Archivos Añadir un mensaje para los invitados (opcional) Uso compartido y derechos del archivo %s Uso compartido y derechos de la carpeta %s diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3501e358b5..e75280b88b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -449,6 +449,9 @@ Tiedostot Valitse oikeus + Jos tämä asetus on poistettu käytöstä, kDrive ei ole enää käytettävissä Tiedostot-sovelluksessa eikä kolmannen osapuolen sovelluksissa. + Olet ottanut tiedostojen näytön pois käytöstä kDrivesta. Voit ottaa sen uudelleen käyttöön sovelluksen asetuksissa. + Näytä Tiedostot-sovelluksessa Lisää viesti vieraille (valinnainen) Tiedoston %s jakaminen ja oikeudet Kansion %s jakaminen ja oikeudet diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d9a0240ca2..13a892bcf1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -449,6 +449,9 @@ Fichiers Sélectionner le droit + Si cette option est désactivée, kDrive ne sera plus disponible dans l’application Fichiers et dans les applications tierces. + Vous avez désactivé l’affichage des fichiers depuis kDrive. Vous pouvez le réactiver dans les paramètres de l’application. + Afficher dans Fichiers Ajouter un message aux invités (facultatif) Partage et droits du fichier %s Partage et droits du dossier %s diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bb5fc393de..5df5d6c8ee 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -449,6 +449,9 @@ File Seleziona il diritto + Se questa opzione è disattivata, kDrive non sarà più disponibile nell’applicazione Files e nelle applicazioni di terzi. + Hai disattivato la visualizzazione dei file da kDrive. Puoi riattivarla nelle impostazioni dell’app. + Vedi in File Aggiungi un messaggio agli invitati (facoltativo) Condivisione e diritti del file %s Condivisione e diritti della cartella %s diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index abd98fa00b..5f54153e6f 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -449,6 +449,9 @@ Filer Velg rettighet + Hvis dette alternativet er deaktivert, vil kDrive ikke lenger være tilgjengelig i Filer-appen og i tredjepartsapper. + Du har deaktivert visning av filer fra kDrive. Du kan aktivere det igjen i app-innstillingene. + Vis i Filer Legg til en melding for gjester (valgfritt) Fil %s deling og rettigheter Mappe %s deling og rettigheter diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4af8b00e56..c1dedf2d85 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -449,6 +449,9 @@ Bestanden Selecteer het recht + Als deze optie is uitgeschakeld, is kDrive niet meer beschikbaar in de Bestanden-applicatie en in applicaties van derden. + U heeft de weergave van bestanden vanuit kDrive uitgeschakeld. U kunt dit opnieuw inschakelen in de app-instellingen. + Weergeven in Bestanden Voeg een bericht toe voor gasten (optioneel) Delen en rechten van bestand %s Delen en rechten van map %s diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 758770a528..cddd8ead86 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -499,6 +499,9 @@ Pliki Wybierz uprawnienie + Jeśli ta opcja jest wyłączona, kDrive nie będzie już dostępny w aplikacji Pliki ani w aplikacjach innych firm. + Wyłączyłeś wyświetlanie plików z kDrive. Możesz je ponownie włączyć w ustawieniach aplikacji. + Pokaż w Plikach Dodaj wiadomość dla gości (opcjonalnie) Plik %s - udostępnianie i uprawnienia Folder %s - udostępnianie i uprawnienia diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 04b6432fee..a7982aab7d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -449,6 +449,9 @@ Ficheiros Selecionar a permissão + Se esta opção estiver desativada, o kDrive deixará de estar disponível na aplicação Ficheiros e em aplicações de terceiros. + Desativou a visualização de ficheiros a partir do kDrive. Pode reativá-la nas definições da aplicação. + Mostrar nos Ficheiros Adicionar uma mensagem para os convidados (opcional) Partilha e permissões do ficheiro %s Partilha e permissões da pasta %s diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index bfa4bf3e61..a91437f554 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -449,6 +449,9 @@ Filer Välj rättighet + Om detta alternativ är inaktiverat kommer kDrive inte längre att vara tillgängligt i appen Filer och i tredjepartsappar. + Du har inaktiverat visning av filer från kDrive. Du kan aktivera det igen i appens inställningar. + Visa i Filer Lägg till ett meddelande för gäster (valfritt) Delning och rättigheter för fil %s Delning och rättigheter för mapp %s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f8d50fe9b4..54969701f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -449,6 +449,9 @@ Files Select the right + If this option is disabled, kDrive will no longer be available in the Files application and in third-party applications. + You have disabled file display from kDrive. You can re-enable it in the app settings. + Show in Files Add a message for guests (optional) File %s sharing and rights Folder %s sharing and rights