diff --git a/README.md b/README.md index aa7fe19f..034470e2 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Also available at **[IzzyOnDroid (F-Droid)](https://apt.izzysoft.de/fdroid/index ![English](https://img.shields.io/badge/English-100%25-brightgreen) ![Chinese (China)](https://img.shields.io/badge/Chinese%20(China)-100%25-brightgreen) ![Dutch](https://img.shields.io/badge/Dutch-97%25-yellow) +![French](https://img.shields.io/badge/French-100%25-brightgreen) ![German](https://img.shields.io/badge/German-100%25-brightgreen) ![Portuguese (Brazil)](https://img.shields.io/badge/Portuguese%20(Brazil)-97%25-yellow) ![Spanish](https://img.shields.io/badge/Spanish-97%25-yellow) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cee734a4..2f0ce7f7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,8 @@ package="dev.leonlatsch.photok"> + + = sharedUris.toList() - fun getUriCount(): Int = sharedUris.size - fun clear() = sharedUris.clear() } \ No newline at end of file diff --git a/app/src/main/java/dev/leonlatsch/photok/main/ui/MainActivity.kt b/app/src/main/java/dev/leonlatsch/photok/main/ui/MainActivity.kt index a52436e6..a30e5f32 100644 --- a/app/src/main/java/dev/leonlatsch/photok/main/ui/MainActivity.kt +++ b/app/src/main/java/dev/leonlatsch/photok/main/ui/MainActivity.kt @@ -16,12 +16,12 @@ package dev.leonlatsch.photok.main.ui -import android.Manifest import android.content.Intent import android.content.res.Configuration import android.net.Uri import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import dev.leonlatsch.photok.ApplicationState import dev.leonlatsch.photok.R @@ -30,9 +30,12 @@ import dev.leonlatsch.photok.gallery.ui.importing.ImportBottomSheetDialogFragmen import dev.leonlatsch.photok.other.REQ_PERM_SHARED_IMPORT import dev.leonlatsch.photok.other.extensions.getBaseApplication import dev.leonlatsch.photok.other.extensions.setNavBarColorRes +import dev.leonlatsch.photok.permissions.getReadImagesPermission +import dev.leonlatsch.photok.permissions.getReadVideosPermission import dev.leonlatsch.photok.settings.data.Config import dev.leonlatsch.photok.uicomponnets.Dialogs import dev.leonlatsch.photok.uicomponnets.bindings.BindableActivity +import kotlinx.coroutines.flow.collectLatest import pub.devrel.easypermissions.AfterPermissionGranted import pub.devrel.easypermissions.EasyPermissions import javax.inject.Inject @@ -63,15 +66,21 @@ class MainActivity : BindableActivity(R.layout.activity_mai super.onPostCreate(savedInstanceState) dispatchIntent() - getBaseApplication().rawApplicationState.observe(this) { - if (it == ApplicationState.UNLOCKED && viewModel.getUriCountFromStore() > 0) { - val urisToImport = viewModel.consumeSharedUris() - - confirmImport(urisToImport) { - startImportOfSharedUris(urisToImport) + lifecycleScope.launchWhenCreated { + viewModel.consumedUrisFromStore.collectLatest { + if (it.isNotEmpty()) { + confirmImport(it.size) { + startImportOfSharedUris() + } } } } + + getBaseApplication().rawApplicationState.observe(this) { + if (it == ApplicationState.UNLOCKED) { + viewModel.consumeSharedUris() + } + } } private fun dispatchIntent() { @@ -86,12 +95,12 @@ class MainActivity : BindableActivity(R.layout.activity_mai } } - private fun confirmImport(urisToImport: List, onImportConfirmed: () -> Unit) { + private fun confirmImport(amount: Int, onImportConfirmed: () -> Unit) { Dialogs.showConfirmDialog( this, String.format( getString(R.string.import_sharted_question), - urisToImport.size + amount ) ) { _, _ -> onImportConfirmed() @@ -102,10 +111,13 @@ class MainActivity : BindableActivity(R.layout.activity_mai * Start importing after the overview of photos. */ @AfterPermissionGranted(REQ_PERM_SHARED_IMPORT) - fun startImportOfSharedUris(urisToImport: List) { + fun startImportOfSharedUris() { + val urisToImport = viewModel.consumedUrisFromStore.value + if (EasyPermissions.hasPermissions( this, - Manifest.permission.READ_EXTERNAL_STORAGE + getReadImagesPermission(), + getReadVideosPermission() ) ) { ImportBottomSheetDialogFragment(urisToImport).show( @@ -117,7 +129,8 @@ class MainActivity : BindableActivity(R.layout.activity_mai this, getString(R.string.import_permission_rationale), REQ_PERM_SHARED_IMPORT, - Manifest.permission.READ_EXTERNAL_STORAGE + getReadImagesPermission(), + getReadVideosPermission() ) } } diff --git a/app/src/main/java/dev/leonlatsch/photok/main/ui/MainViewModel.kt b/app/src/main/java/dev/leonlatsch/photok/main/ui/MainViewModel.kt index f904bcef..481b075d 100644 --- a/app/src/main/java/dev/leonlatsch/photok/main/ui/MainViewModel.kt +++ b/app/src/main/java/dev/leonlatsch/photok/main/ui/MainViewModel.kt @@ -21,6 +21,7 @@ import android.net.Uri import dagger.hilt.android.lifecycle.HiltViewModel import dev.leonlatsch.photok.gallery.ui.importing.SharedUrisStore import dev.leonlatsch.photok.uicomponnets.bindings.ObservableViewModel +import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject /** @@ -35,13 +36,12 @@ class MainViewModel @Inject constructor( private val sharedUrisStore: SharedUrisStore, ) : ObservableViewModel(app) { + val consumedUrisFromStore = MutableStateFlow(emptyList()) + fun addUriToSharedUriStore(uri: Uri) = sharedUrisStore.safeAddUri(uri) - fun consumeSharedUris(): List { - val sharedUris = sharedUrisStore.getUris() + fun consumeSharedUris() { + consumedUrisFromStore.value = sharedUrisStore.getUris() sharedUrisStore.clear() - return sharedUris } - - fun getUriCountFromStore(): Int = sharedUrisStore.getUriCount() } \ No newline at end of file diff --git a/app/src/main/java/dev/leonlatsch/photok/other/Constants.kt b/app/src/main/java/dev/leonlatsch/photok/other/Constants.kt index 14cf7795..54b0c1b1 100644 --- a/app/src/main/java/dev/leonlatsch/photok/other/Constants.kt +++ b/app/src/main/java/dev/leonlatsch/photok/other/Constants.kt @@ -28,5 +28,4 @@ const val INTENT_PHOTO_ID = "intent.photo.id" const val REQ_PERM_IMPORT_PHOTOS = 10 const val REQ_PERM_IMPORT_VIDEOS = 11 const val REQ_PERM_EXPORT = 12 -const val REQ_PERM_RESTORE = 13 const val REQ_PERM_SHARED_IMPORT = 14 diff --git a/app/src/main/java/dev/leonlatsch/photok/permissions/MediaPermissions.kt b/app/src/main/java/dev/leonlatsch/photok/permissions/MediaPermissions.kt new file mode 100644 index 00000000..183c0fa0 --- /dev/null +++ b/app/src/main/java/dev/leonlatsch/photok/permissions/MediaPermissions.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2020-2022 Leon Latsch + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dev.leonlatsch.photok.permissions + +import android.Manifest +import android.os.Build + +fun getReadVideosPermission() = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Manifest.permission.READ_MEDIA_VIDEO + } else { + Manifest.permission.READ_EXTERNAL_STORAGE + } + +fun getReadImagesPermission() = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Manifest.permission.READ_MEDIA_IMAGES + } else { + Manifest.permission.READ_EXTERNAL_STORAGE + } \ No newline at end of file diff --git a/app/src/main/java/dev/leonlatsch/photok/uicomponnets/Chooser.kt b/app/src/main/java/dev/leonlatsch/photok/uicomponnets/Chooser.kt index 8cabb821..e3a19931 100644 --- a/app/src/main/java/dev/leonlatsch/photok/uicomponnets/Chooser.kt +++ b/app/src/main/java/dev/leonlatsch/photok/uicomponnets/Chooser.kt @@ -47,7 +47,11 @@ class Chooser { * Or request the [permission] */ fun show(fragment: Fragment) { - if (EasyPermissions.hasPermissions(fragment.requireContext(), permission)) { + if (permission == null || EasyPermissions.hasPermissions( + fragment.requireContext(), + permission + ) + ) { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.type = mimeType intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultiple) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..b26ba291 --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,248 @@ + + + + + + + Photok + Copyright \u00A9 2020–2022 Leon Latsch + / + % + | + Chargement… + Mot de passe + Supprimer + Exporter + Une erreur est survenue. Veuillez réessayer. + Oui + Non + OK + Êtes vous sûr? + + + + Importation en cours + Photok a besoin d\'accéder à votre espace de stockage pour importer des fichiers. + Voulez-vous importer %1$d fichier(s) ? + + + Créer votre mot de passe + Entrer le mot de passe + Confirmer votre mot de passe + Fiabilité du mot de passe : + Créer + Faible + Modérée + Forte + \u26A0 Les mots de passe ne correspondent pas + Installer + + + Déverrouiller votre coffre-fort + Entrer le mot de passe + Déverrouiller + \u26A0 Mauvais mot de passe + + + Il n\'y a pas de fichier dans votre coffre-fort + Tous les fichiers + + + Importer + Photos + Vidéos + Sauvegarde + Ajouter des médias à Photok… + + + Fermer + Annuler + Terminé + Initialisation… + Annulé + \u26A0 Certains éléments n\'ont pas pu être traités + + + Détails + Nom du fichier : + Importé le : + Type de fichier : + Taille du fichier : + + + Verrouiller + Réglages + + + Tout sélectionner + Supprimer + Exporter + + + Voulez-vous vraiment supprimer %1$d fichier(s) ? + Voulez-vous vraiment supprimer ce fichier ? + Suppression en cours… + + + Voulez-vous vraiment exporter %1$d fichier(s) vers votre galerie ? + Voulez-vous vraiment exporter ce fichier vers votre galerie ? + Exportation en cours… + Photok a besoin d\'accéder à votre espace de stockage pour exporter des fichiers. + Exporté + + + Version : + Développé par : + leonlatsch.dev + https://leonlatsch.dev + Logiciel tiers + Politique de confidentialité + https://leonlatsch.dev/photok_privacy_policy + Nouvelles + + + + Réglages + + App + Thème + Défaut du système + Clair + Sombre + + Galerie + Plein écran automatique + Entrer en mode plein écran lors de l\'ouverture d\'un fichier + + Sécurité + Autoriser les captures d\'écran + Autorise la capture d\'écran. Nécessite un redémarrage. + Changer le mot de passe + Changez votre mot de passe + Délai de verrouillage automatique + Se verrouille en arrière-plan après un certain temps + Immédiatement + 1 Minute + 2 Minutes + 5 Minutes + 10 Minutes + Jamais + Code de démarrage secret + Code secret pour démarrer Photok à partir de l\'application téléphone. + Entrez *#*#[votre code]#*#* dans le clavier téléphonique pour lancer Photok. + *#*# + #*#* + Masquer l\'application + Masque l\'icône de l\'application du tiroir d\'applications. + + Avancé + Utiliser avec précaution + Réinitialiser le coffre-fort + Effacer les données et réinitialiser le mot de passe + Voulez-vous VRAIMENT réinitialiser votre coffre-fort ? Toutes les données seront perdues ! + Sauvegarde + Créer une sauvegarde de votre coffre-fort + + Autre + Feedback + Envoyez-moi un e-mail avec des commentaires + Photok Feedback + Donnez votre avis sur Photok :) + dev.leonlatsch@gmail.com + Code source + Contribuer à Photok + https://github.com/leonlatsch/Photok + Crédits + Contributeurs et crédits + À propos + Informations sur Photok + + + Contributeurs + Visitez Photok sur GitHub pour voir tous les contributeurs + Icônes + + + Changer votre mot de passe + Ancien mot de passe + Nouveau mot de passe + Vérifier + Entrez votre nouveau mot de passe + Confirmez votre nouveau mot de passe + Changer le mot de passe + Sauvegarde recommandée !
Changer votre mot de passe nécessite de rechiffrer tous vos fichiers ! Voulez-vous continuer?
+ Rechiffrement des fichier(s)… + + + Cacher Photok + Afficher Photok + Photok est actuellement : + VISIBLE + CACHÉ + Téléphone + Voulez-vous vraiment cacher Photok ? + Voulez-vous montrer à nouveau Photok ? + Une fois caché, Photok ne peut être lancé qu\'à partir du clavier téléphonique avec votre code de démarrage secret. + Code de lancement actuel : + + + Suivant + Terminer + Passer + + Bienvenue sur + Un endroit sûr pour vos photos. + Créer un mot de passe + Créez un mot de passe sécurisé. Votre mot de passe sert à crypter vos photos directement sur votre téléphone. + Importez des photos + Commencez à importer vos photos et protégez-les des autres.\nVous pourrez ensuite les supprimer de votre galerie. + + + Création d\'une sauvegarde… + Restaurer la sauvegarde + Validation de la sauvegarde… + Créé le : + Fichiers contenus : + Compatible : + Taille : + Déverrouiller et restaurer + \u26A0 Fichier non valide + Restauration de la sauvegarde… + Déverrouiller la sauvegarde + + + Nouveautés dans + Voir le Changelog + https://github.com/leonlatsch/Photok/releases + + Fonctionnalité : Menu de récupération + Pour en savoir plus sur le nouveau menu de récupération, visitez la page GitHub de Photok + + Amélioration des performances + De nombreuses améliorations de performances pour Photok + + EMPTY + EMPTY + + EMPTY + EMPTY + + + Menu de récupération + Ouvrir Photok + Réinitialiser la visibilité de l\'application +
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd78a010..a8c49901 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,7 +93,7 @@ Are you sure, you want to delete %1$d file(s)? - Are you sure, you want to delete this files? + Are you sure, you want to delete this file? Deleting file(s)… diff --git a/gradle.properties b/gradle.properties index 086b7b53..bfcc9281 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,9 @@ -#Sat Sep 17 11:08:00 UTC 2022 +#Sat Oct 08 14:39:42 UTC 2022 kotlin.code.style=official kapt.incremental.apt=true android.databinding.incremental=true -appVersionName=1.4.1 +appVersionName=1.4.2 org.gradle.jvmargs=-Xmx2048m -appVersionCode=22 +appVersionCode=23 android.useAndroidX=true android.enableJetifier=true