From 954bef4aacae54b57b71a691f5ea03e08f77e8c6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 31 Dec 2024 00:07:17 +0000 Subject: [PATCH 001/142] Translated using Weblate (German) Currently translated at 91.3% (180 of 197 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/de/ --- app/src/main/res/values-de/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 65c060a..e815940 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -232,8 +232,7 @@



Die Auswahl kann später in den Einstellungen geändert werden. - ]]> - + ]]> Transparent Dimmen Weichzeichnen From 3e4d22d3cddb9238d49321b669318c72f687acd3 Mon Sep 17 00:00:00 2001 From: Alexandre Ancel Date: Fri, 3 Jan 2025 23:34:52 +0000 Subject: [PATCH 002/142] Translated using Weblate (French) Currently translated at 98.9% (197 of 199 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/fr/ --- app/src/main/res/values-fr/strings.xml | 126 ++++++++++++++++++++----- 1 file changed, 103 insertions(+), 23 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8a5231a..740e98f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -22,20 +22,20 @@ - Settings : Apps - --> - Balayer vers le haut + Haut Double haut - Balayer vers le bas + Bas Double bas - Balayer vers la gauche + Gauche Double gauche - Balayer vers la droite + Droite Double droit - Appui bouton volume haut - Appui bouton volume bas - Double clic + Volume Haut + Volume Bas + Double Clic Clic long - Toucher la date - Toucher l\'horloge + Date + Horloge Choisir App Voir les applications Installer des applications @@ -46,11 +46,11 @@ - --> Apparence - Format de date + Thème Défaut - Noir - Lumière + Sombre + Clair Choisir un fond d\'écran Changer le fond d\'écran Écran @@ -66,7 +66,7 @@ - Settings : Meta - --> - Choisir Launcher comme application d\'écran d\'accueil par défaut + Choisir μLauncher comme application d\'écran d\'accueil par défaut Informations sur l\'application Votre appareil ne prend pas en charge cette fonctionnalité. Souhaitez-vous plutôt accéder aux détails de l\'application ? Regarder le tutoriel @@ -91,7 +91,7 @@ Application supprimée Impossible de désinstaller l\'application Chercher des applications - Réglages du launcher + Réglages d\'µLauncher Toutes les Applications Augmenter le volume Diminuer le volume @@ -114,7 +114,7 @@ Sur votre écran d\'accueil vous ne trouverez rien d\'autre que la date et l\'heure : rien qui pourrait vous distraire. Vous pouvez ouvrir des applications en effectuant des mouvelents latéraux sur l\'écran ou en appuyant sur les touches de volume. Vous pourrez en définir le comportement dans le panneau suivant. Configuration - Voici quelques paramètres par défaut. Vous pouvez les changer dès à présent. + Voici quelques paramètres par défaut. Vous pouvez les changer dès à présent : Vous pourrez bien sûr tout reconfigurer plus tard. C\'est parti ! Vous êtes prêt à démarrer ! @@ -126,15 +126,15 @@ Démarrer Réglages Plus d\'options - Balayer vers la droite (en haut de l\'écran) + Droite (en haut de l\'écran) Actions associées aux mouvements sur les bords de l\'écran - Balayer vers la droite (en bas de l\'écran) - Balayer vers le bas (à gauche de l\'écran) - Balayer vers la gauche (en bas de l\'écran) - Balayer vers la gauche (en haut de l\'écran) - Balayer vers le haut (à gauche de l\'écran) - Balayer vers le haut (à droite de l\'écran) - Balayer vers le bas (à droite de l\'écran) + Droite (en bas de l\'écran) + Bas (Bord Gauche) + Gauche (en bas de l\'écran) + Gauche (en haut de l\'écran) + Haut (Bord Gauche) + Haut (Bord Droit) + Bas (Bord Droit) Afficher l\'heure Échanger la date et l\'heure Afficher la date @@ -159,4 +159,84 @@ Erreur : impossible d\'afficher la barre de statut. \nCette action utilise des fonctionalités qui ne sont pas officiellement dans l\'API Android. Malheuresement ça ne semble pas fonctionner sur votre appareil. Réglages rapides + Basculer l\'état de la lampe + Dynamique + Cette fonctionnalité requiert Android 6.0 ou plus récent. + Erreur : le verrouillage de l\'écran a échoué. (Si vous venez de mettre l\'application à jour, essayez de désactiver/re-activer le service d\'accessibilité dans les paramètres du téléphone) + Le service d\'accessibilité d\'μLauncher n\'est pas activé. Activez le dans le paramètres, s\'il vous plaît + µLauncher - écran de verrouillage + Configurer µLauncher comme un service d’accessibilité lui permet de verrouiller l’écran. Notez que cette permission excessive est requise. Vous ne devriez jamais donner de permissions à la légère à n\'importe quelle application. µLauncher n\'utilisera le service d’accessibilité que pour verrouiller l’écran. Vous pouvez vérifier le code source pour vous en assurer. Notez aussi que le verrouillage d’écran peut être effectué en donnant à µLauncher les droits d\'administrations de l\'appareil. Néanmoins cette méthode ne fonctionne pas avec le déverrouillage par empreinte ou reconnaissance faciale. + Rouge + Alpha + Bleu + Vert + Choix de la méthode pour le verrouillage + Ne pas montrer les applications associées à un geste dans la liste des applications + Ceci est requis pour l\'action de verrouillage d\'écran. + Activer l\'action de verrouillage d\'écran + µLauncher requiert les droits administrateur afin de pouvoir verrouiller l\'écran. + Aucun flash détecté sur l\'appareil photo. + Erreur : Acces impossible au flash. + Choisissez une méthode pour le verrouillage de l’écran + Utiliser l\'administration de l\'appareil + Je suis conscient que d\'autres options existent (notamment en utilisant les droits d\'administration de l\'appareil ou le bouton d\'allumage). + Je suis conscient que cela accordera des privilèges importants à µLauncher. + Choisir une couleur + Activation du service d\'accessibilité + Ok + Couleur + Je consent à µLauncher utilisation du service d’accessibilité pour fournir une fonction non liée à l’accessibilité. + Je consent à la non-collecte de données par µLauncher. + Largeur du bord + Clic sur l\'horloge + Balayer vers le haut + Balayer vers le haut avec deux doigts + Balayer vers le bas + Balayer vers le bas avec deux doigts + Balayer vers la gauche + Balayer vers la gauche avec deux doigts + Balayer vers la droite + Balayer vers la droite avec deux doigts + Balayer vers la droite en haut de l\'écran + Balayer vers la droite en bas de l\'écran + Balayer vers la gauche en bas de l\'écran + Balayer vers la gauche en haut de l\'écran + Balayer vers le haut au bord gauche de l\'écran + Balayer vers le haut au bord droit de l\'écran + Balayer vers le bas au bord droit de l\'écran + Appui bouton volume haut + Appui bouton volume bas + Double clic sur une zone vide + Clic long sur une zone vide + Clic sur la date + Balayer avec deux doigts + Ombre du texte + Voir le code source + Rejoindre le chat d\'µLauncher + Verrouiller l\'écran + Défaut du systeme + Sans serif + Serif + Monospace + Serif monospace + Format de la liste d\'applications + Défaut + Texte + Grille + Renommer + Transparent + Atténuer + Flouter + Plein + Renommer %1$s + Utiliser le service d’accessibilité + Ok + Chercher sur le web + Appuyer sur entrée en cherchant une application pour lancer une recherche web. + Annuler + Erreur : Le verrouillage d\'écran en utilisant l\'accessibilité n\'est pas disponible sur cet appareil. Utiliser les droits d\'administration de l\'appareil à la place. + Activer le service d’accessibilité + Balayer vers le bas au bord gauche de l\'écran + Balayer au bord de l\'écran + Couleur \ No newline at end of file From e53b7682d8192bfd00f3f175997806178364abb8 Mon Sep 17 00:00:00 2001 From: Nin Dan Date: Tue, 7 Jan 2025 21:17:59 +0000 Subject: [PATCH 003/142] Translated using Weblate (French) Currently translated at 98.9% (197 of 199 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/fr/ --- app/src/main/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 740e98f..672b507 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -36,8 +36,8 @@ Clic long Date Horloge - Choisir App - Voir les applications + Choisir une application + Voir toutes les applications Installer des applications Magasin d\'applications introuvable >>>>>]]> + + + + µLauncher + Modifications to Launcher. +

github.com/jrpie/launcher

+ +

MIT License

+ + Copyright © 2024 Josia Pietsch

+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +

+ +

Launcher

+ The original project by Finn Glas. +

github.com/finnmglas/launcher

+ +

MIT License

+ + Copyright © 2020 Finn Glas

+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +

+ +

Hack Font

+

sourcefoundry.org/hack

+

MIT License

+ Copyright © 2018 Source Foundry Authors

+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ]]>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60e8697..8fb91c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,8 +225,8 @@ Take a few seconds to learn how to use this Launcher! Concept - Launcher is designed to be minimal, efficient and free of distraction.\n\nIt is free of payments, ads and tracking services. - The app is open-source (MIT license) and available on GitHub!\n\nMake sure to check out the repository! + Launcher is designed to be minimal, efficient and free of distraction. It is free of payments, ads and tracking services. + The app is open-source (MIT license) and available on GitHub! Make sure to check out the repository! Usage Your home screen contains the local date and time. No distraction. @@ -237,13 +237,13 @@ You can also change your selection later. Let\'s go! - You are ready to get started!\n\nI hope this is of great value to you!\n\n- Finn (who made Launcher)\n\tand Josia (who made some improvements and maintains the fork μLauncher) + You are ready to get started! I hope this is of great value to you! - Finn (who made Launcher) \tand Josia (who made some improvements and maintains the fork μLauncher) Start Settings More options - Error: Can\'t expand status bar.\nThis action is using functionality that is not part of the published Android API. Unfortunately, it does not seem to work on your device. + Error: Can\'t expand status bar. This action is using functionality that is not part of the published Android API. Unfortunately, it does not seem to work on your device. This functionality requires Android 6.0 or later. App hidden. You can make it visible again in settings. Undo @@ -312,4 +312,7 @@ Activating the Accessibility Service Activate Accessibility Service Cancel + Open Source Licenses + Open Source Licenses + From fa0c880342b16303255b1e7b2b02f42505f6ba42 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 11 Jan 2025 23:16:15 +0100 Subject: [PATCH 011/142] update LICENSE --- LICENSE | 2 +- app/src/main/res/values/donottranslate.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index a0bb980..7435f65 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ MIT License Original Code Copyright (c) 2020 Finn Glas (https://github.com/finnmglas/Launcher) -Modifications Copyright (c) 2023 Josia Pietsch +Modifications Copyright (c) 2025 Josia Pietsch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index cacd3fc..0a30fac 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -175,7 +175,7 @@

MIT License

- Copyright © 2024 Josia Pietsch

+ Copyright © 2025 Josia Pietsch

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

From 567d08fb3a3a42302d5a9ad1d6f333f3ce72aa62 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Sat, 11 Jan 2025 20:25:10 +0000 Subject: [PATCH 012/142] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (200 of 200 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 55f8238..9505db7 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -102,7 +102,7 @@ Informações do aplicativo O app selecionado foi removido Não foi possível remover o app - Busque aplicativos + Busque Configurações do µLauncher Todos os apps Música: Mais alto @@ -185,7 +185,9 @@ O µLauncher usará essas permissões apenas para bloquear a tela.
(Você realmente não deveria confiar num app aleatório que você baixou que tá pedindo estas permissões, mas pode verificar o código-fonte.) - +
+ Em alguns aparelhos após ativação do Serviço de acessibilidade não será mais exigido o PIN para acessar dados criptografados, na inicialização do celular. + Isto pode ser reativado depois.



Você pode alterar sua escolha em configurações à qualquer momento. @@ -252,4 +254,7 @@ beleza Estou ciente de que isto concederá permissões elevadas ao µLauncher. Estou ciente de que existem outras opções (permissões de Administrador do aparelho ou o botão de ligar). + Pesquise na internet + Ao buscar na lista de apps toque no Enter para iniciar uma pesquisa na internet. + Busca (sem inicialização automática) \ No newline at end of file From f08f357bb3de9ba8ae970aaa8cd779e2755de2eb Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 12 Jan 2025 01:31:49 +0100 Subject: [PATCH 013/142] add buildFlavor for accrescent --- app/build.gradle | 23 +++++++++++++++++++ app/src/accrescent/AndroidManifest.xml | 15 ++++++++++++ .../launcher/actions/lock/LockMethod.kt | 4 +++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 app/src/accrescent/AndroidManifest.xml diff --git a/app/build.gradle b/app/build.gradle index d4e22e6..28fb941 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,6 +51,29 @@ android { versionNameSuffix = "-debug" } } + + flavorDimensions += "distribution" + + productFlavors { + create("default") { + dimension = "distribution" + getIsDefault().set(true) + buildConfigField "boolean", "USE_ACCESSIBILITY_SERVICE", "true" + } + create("accrescent") { + dimension = "distribution" + applicationIdSuffix = ".accrescent" + versionNameSuffix = "+accrescent" + buildConfigField "boolean", "USE_ACCESSIBILITY_SERVICE", "false" + } + } + + sourceSets { + accrescent { + manifest.srcFile 'src/accrescent/AndroidManifest.xml' + } + } + namespace 'de.jrpie.android.launcher' buildFeatures { buildConfig true diff --git a/app/src/accrescent/AndroidManifest.xml b/app/src/accrescent/AndroidManifest.xml new file mode 100644 index 0000000..16ea383 --- /dev/null +++ b/app/src/accrescent/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt index 5198288..8ae2415 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt @@ -4,6 +4,7 @@ import android.content.Context import android.os.Build import android.widget.Button import androidx.appcompat.app.AlertDialog +import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R import de.jrpie.android.launcher.preferences.LauncherPreferences @@ -36,7 +37,8 @@ enum class LockMethod( companion object { fun chooseMethod(context: Context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P || + ! BuildConfig.USE_ACCESSIBILITY_SERVICE) { // only device admin is available setMethod(context, DEVICE_ADMIN) return From b5dcfeececda2f6c2d48a6f3593760232d632378 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 12 Jan 2025 21:00:05 +0100 Subject: [PATCH 014/142] update CI pipeline to use default build flavor --- .github/workflows/android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 912995a..8ab5fd7 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -29,4 +29,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: launcher-debug-${{ github.sha }}.apk - path: app/build/outputs/apk/debug/app-debug.apk + path: app/build/outputs/apk/default/debug/app-debug.apk From 64ccc4f30089eec451b71d2ff6db6bb56dd7e344 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 12 Jan 2025 21:08:03 +0100 Subject: [PATCH 015/142] update CI pipeline to use default build flavor --- .github/workflows/android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8ab5fd7..ba9a709 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -29,4 +29,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: launcher-debug-${{ github.sha }}.apk - path: app/build/outputs/apk/default/debug/app-debug.apk + path: app/build/outputs/apk/default/debug/app-default-debug.apk From cd36fad8cd1dec120a44b371f86daf1a64579c43 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 12 Jan 2025 22:47:50 +0100 Subject: [PATCH 016/142] add release script --- .scripts/release.sh | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 .scripts/release.sh diff --git a/.scripts/release.sh b/.scripts/release.sh new file mode 100755 index 0000000..81e4f11 --- /dev/null +++ b/.scripts/release.sh @@ -0,0 +1,75 @@ +#!/bin/bash +export JAVA_HOME="/usr/lib/jvm/java-23-openjdk/" +OUTPUT_DIR="$HOME/launcher-release" +BUILD_TOOLS_DIR="$HOME/Android/Sdk/build-tools/35.0.0" +KEYSTORE="$HOME/data/keys/launcher_jrpie.jks" +KEYSTORE_ACCRESCENT="$HOME/data/keys/launcher_jrpie_accrescent.jks" +# KEYSTORE_PASS=$(keepassxc-password "android_keys/launcher") +# KEYSTORE_ACCRESCENT_PASS=$(keepassxc-password "android_keys/launcher-accrescent") + +if [[ $(git status --porcelain) ]]; then + echo "There are uncommitted changes." + exit 1 +fi +VERSION_INFO=$(./gradlew -q Version --rerun) +echo $VERSION_INFO + + +IFS=" +" read -r VERSION_NAME VERSION_CODE MIN_SDK TARGET_SDK <<< $(./gradlew -q Version --rerun) + + +echo "Building Release $VERSION_NAME ($VERSION_CODE)" +echo "Target SDK: $TARGET_SDK, Min SDK: $MIN_SDK" + +rm -rf "$OUTPUT_DIR" +mkdir "$OUTPUT_DIR" + + +echo +echo "=======================" +echo " Default Release (apk) " +echo "=======================" + +./gradlew clean +./gradlew assembleDefaultRelease +mv app/build/outputs/apk/default/release/app-default-release-unsigned.apk "$OUTPUT_DIR/unsigned.apk" +$BUILD_TOOLS_DIR/apksigner sign --ks "$KEYSTORE" \ + --ks-key-alias key0 \ + --ks-pass="pass:$KEYSTORE_PASS" \ + --key-pass="pass:$KEYSTORE_PASS" \ + --v1-signing-enabled=true --v2-signing-enabled=true --v3-signing-enabled=true --v4-signing-enabled=true \ + "$OUTPUT_DIR/unsigned.apk" + +echo +echo "=======================" +echo " Default Release (aab) " +echo "=======================" + +./gradlew clean +./gradlew bundleDefaultRelease +mv app/build/outputs/bundle/defaultRelease/app-default-release.aab $OUTPUT_DIR/app-release.aab +$BUILD_TOOLS_DIR/apksigner sign --ks "$KEYSTORE" \ + --ks-key-alias key0 \ + --ks-pass="pass:$KEYSTORE_PASS" \ + --key-pass="pass:$KEYSTORE_PASS" \ + --v1-signing-enabled=true --v2-signing-enabled=true --v3-signing-enabled=true --v4-signing-enabled=true \ + --min-sdk-version=21 \ + --target-sdk-version=35 \ + "$OUTPUT_DIR/app-release.aab" + + +echo +echo "=======================" +echo " Accrescent (apks) " +echo "=======================" + +./gradlew clean +./gradlew bundleAccrescentRelease +mv app/build/outputs/bundle/accrescentRelease/app-accrescent-release.aab $OUTPUT_DIR/app-accrescent-release.aab +$JAVA_HOME/bin/java -jar /opt/android/bundletool.jar build-apks \ + --bundle="$OUTPUT_DIR/app-accrescent-release.aab" --output="$OUTPUT_DIR/launcher-accrescent.apks" \ + --ks="$KEYSTORE_ACCRESCENT" \ + --ks-pass="pass:$KEYSTORE_ACCRESCENT_PASS" \ + --ks-key-alias="key0" \ + --key-pass="pass:$KEYSTORE_ACCRESCENT_PASS" From 74b448cd0f1941d2c0c27237946fedce8f8ef773 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 12 Jan 2025 22:47:58 +0100 Subject: [PATCH 017/142] j-0.0.20 --- .scripts/release.sh | 14 ++------------ app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/36.txt | 6 +++++- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/.scripts/release.sh b/.scripts/release.sh index 81e4f11..e4e59f7 100755 --- a/.scripts/release.sh +++ b/.scripts/release.sh @@ -4,23 +4,13 @@ OUTPUT_DIR="$HOME/launcher-release" BUILD_TOOLS_DIR="$HOME/Android/Sdk/build-tools/35.0.0" KEYSTORE="$HOME/data/keys/launcher_jrpie.jks" KEYSTORE_ACCRESCENT="$HOME/data/keys/launcher_jrpie_accrescent.jks" -# KEYSTORE_PASS=$(keepassxc-password "android_keys/launcher") -# KEYSTORE_ACCRESCENT_PASS=$(keepassxc-password "android_keys/launcher-accrescent") +KEYSTORE_PASS=$(keepassxc-password "android_keys/launcher") +KEYSTORE_ACCRESCENT_PASS=$(keepassxc-password "android_keys/launcher-accrescent") if [[ $(git status --porcelain) ]]; then echo "There are uncommitted changes." exit 1 fi -VERSION_INFO=$(./gradlew -q Version --rerun) -echo $VERSION_INFO - - -IFS=" -" read -r VERSION_NAME VERSION_CODE MIN_SDK TARGET_SDK <<< $(./gradlew -q Version --rerun) - - -echo "Building Release $VERSION_NAME ($VERSION_CODE)" -echo "Target SDK: $TARGET_SDK, Min SDK: $MIN_SDK" rm -rf "$OUTPUT_DIR" mkdir "$OUTPUT_DIR" diff --git a/app/build.gradle b/app/build.gradle index 28fb941..9bc7295 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 35 - versionName "j-0.0.19" + versionCode 36 + versionName "j-0.0.20" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/fastlane/metadata/android/en-US/changelogs/36.txt b/fastlane/metadata/android/en-US/changelogs/36.txt index 127dbfc..d6c8003 100644 --- a/fastlane/metadata/android/en-US/changelogs/36.txt +++ b/fastlane/metadata/android/en-US/changelogs/36.txt @@ -1,2 +1,6 @@ -* prefix search query with space to temporarily disable auto launch +* new feature: prefix query with space to disable auto launch temporarily +* improved search: diacritics are now ignored unless they appear in the query. (Android 7+) +* added list of open source licenses +* updated accessibility service warning * improved French translation (thank you, Alexandre Ancel and Nin Dan!) +* improved Portuguese translation (thank you, "Vossa Excelencia"!) From a7ce5b922204fcfba7468ca6d24e243166ca6374 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 13 Jan 2025 02:50:41 +0100 Subject: [PATCH 018/142] update release script and BUILD.md --- .scripts/release.sh | 24 ++++++++++++++---------- BUILD.md | 19 +++++++++++++++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/.scripts/release.sh b/.scripts/release.sh index e4e59f7..4bba806 100755 --- a/.scripts/release.sh +++ b/.scripts/release.sh @@ -23,13 +23,17 @@ echo "=======================" ./gradlew clean ./gradlew assembleDefaultRelease -mv app/build/outputs/apk/default/release/app-default-release-unsigned.apk "$OUTPUT_DIR/unsigned.apk" -$BUILD_TOOLS_DIR/apksigner sign --ks "$KEYSTORE" \ +mv app/build/outputs/apk/default/release/app-default-release-unsigned.apk "$OUTPUT_DIR/app-release.apk" +"$BUILD_TOOLS_DIR/apksigner" sign --ks "$KEYSTORE" \ --ks-key-alias key0 \ --ks-pass="pass:$KEYSTORE_PASS" \ --key-pass="pass:$KEYSTORE_PASS" \ - --v1-signing-enabled=true --v2-signing-enabled=true --v3-signing-enabled=true --v4-signing-enabled=true \ - "$OUTPUT_DIR/unsigned.apk" + --alignment-preserved \ + --v1-signing-enabled=true \ + --v2-signing-enabled=true \ + --v3-signing-enabled=true \ + --v4-signing-enabled=true \ + "$OUTPUT_DIR/app-release.apk" echo echo "=======================" @@ -38,17 +42,15 @@ echo "=======================" ./gradlew clean ./gradlew bundleDefaultRelease -mv app/build/outputs/bundle/defaultRelease/app-default-release.aab $OUTPUT_DIR/app-release.aab -$BUILD_TOOLS_DIR/apksigner sign --ks "$KEYSTORE" \ +mv app/build/outputs/bundle/defaultRelease/app-default-release.aab "$OUTPUT_DIR/app-release.aab" +"$BUILD_TOOLS_DIR/apksigner" sign --ks "$KEYSTORE" \ --ks-key-alias key0 \ --ks-pass="pass:$KEYSTORE_PASS" \ --key-pass="pass:$KEYSTORE_PASS" \ --v1-signing-enabled=true --v2-signing-enabled=true --v3-signing-enabled=true --v4-signing-enabled=true \ --min-sdk-version=21 \ - --target-sdk-version=35 \ "$OUTPUT_DIR/app-release.aab" - echo echo "=======================" echo " Accrescent (apks) " @@ -56,8 +58,10 @@ echo "=======================" ./gradlew clean ./gradlew bundleAccrescentRelease -mv app/build/outputs/bundle/accrescentRelease/app-accrescent-release.aab $OUTPUT_DIR/app-accrescent-release.aab -$JAVA_HOME/bin/java -jar /opt/android/bundletool.jar build-apks \ +mv app/build/outputs/bundle/accrescentRelease/app-accrescent-release.aab "$OUTPUT_DIR/app-accrescent-release.aab" + +# build apks using bundletool from https://github.com/google/bundletool/releases +"$JAVA_HOME/bin/java" -jar /opt/android/bundletool.jar build-apks \ --bundle="$OUTPUT_DIR/app-accrescent-release.aab" --output="$OUTPUT_DIR/launcher-accrescent.apks" \ --ks="$KEYSTORE_ACCRESCENT" \ --ks-pass="pass:$KEYSTORE_ACCRESCENT_PASS" \ diff --git a/BUILD.md b/BUILD.md index ac1f11d..75921f9 100644 --- a/BUILD.md +++ b/BUILD.md @@ -8,10 +8,25 @@ Make sure that `JAVA_HOME` and `ANDROID_HOME` are set correctly. ``` git clone https://github.com/jrpie/Launcher cd Launcher -./gradlew build + +./gradlew assembleDefaultRelease ``` -Note that you need to sign the apk. +This will create an apk file at `app/build/outputs/apk/default/release/app-default-release-unsigned.apk`. + +Note that you need to sign it: +``` +apksigner sign --ks "$YOUR_KEYSTORE" \ + --ks-key-alias "$YOUR_ALIAS" \ + --ks-pass="pass:$YOUR_PASSWORD" \ + --key-pass="pass:$YOUR_PASSWORD" \ + --alignment-preserved \ + --v1-signing-enabled=true \ + --v2-signing-enabled=true \ + --v3-signing-enabled=true \ + --v4-signing-enabled=true \ + app-default-release-unsigned.apk +``` See [this guide](https://developer.android.com/build/building-cmdline) From 5696ea73daf0116c1757c10584039bf0d78acb2e Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 13 Jan 2025 03:01:28 +0100 Subject: [PATCH 019/142] update short description --- fastlane/metadata/android/en-US/short_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt index 150a1b5..548e686 100644 --- a/fastlane/metadata/android/en-US/short_description.txt +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -1 +1 @@ -A distraction-free minimal homescreen for Android. +A distraction-free, minimal homescreen for Android. From a188e06342639a18d60da49b7b00b195ecc46699 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 13 Jan 2025 14:37:29 +0100 Subject: [PATCH 020/142] update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 207fe34..b29b44d 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,10 @@ This is a fork of [finnmglas's app Launcher][original-repo]. Get it on F-Droid +Get it on Accrescent Get it on Obtainium Get it on GitHub - -or download the latest APK from the [releases section](https://github.com/jrpie/Launcher/releases/latest). You can also [get it on Google Play](https://play.google.com/store/apps/details?id=de.jrpie.android.launcher), but I don't recommend that. ` of `fix/` and commit your changes. + - Create a new branch named `feature/` or `fix/` and commit your changes. - Open a new pull request. See [BUILD.md](BUILD.md) for instructions how to build this project. +The [CI pipeline](https://github.com/jrpie/Launcher/actions) automatically creates debug builds. +Note that those are not signed. ## Notable changes compared to [Finn's Launcher][original-repo]: From 95c9fcd2922fb0f978211544463280e0914eccdd Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Mon, 13 Jan 2025 16:48:34 +0100 Subject: [PATCH 021/142] shorten 'auto launch disabled' to 'no auto launch' --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8fb91c0..5bb2c61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -202,7 +202,7 @@ Unable to remove application Search - Search (auto launch disabled) + Search (no auto launch) µLauncher Settings All Applications From 679c90130db19d17c575841daa65043d407dcd70 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Tue, 21 Jan 2025 23:05:49 +0100 Subject: [PATCH 022/142] re-enable the light theme close #75 when the light theme is selected, the background is always set to solid, to prevent problems with dark wallpapers --- .../android/launcher/preferences/theme/Background.kt | 8 +++++++- .../android/launcher/preferences/theme/ColorTheme.kt | 2 +- .../ui/settings/launcher/SettingsFragmentLauncher.kt | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/Background.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/Background.kt index da301c0..ca385af 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/Background.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/Background.kt @@ -16,7 +16,13 @@ enum class Background(val id: Int, val dim: Boolean = false, val blur: Boolean = ; fun applyToTheme(theme: Resources.Theme) { - theme.applyStyle(id, true) + var background = this + + // force a solid background when using the light theme + if (LauncherPreferences.theme().colorTheme() == ColorTheme.LIGHT) { + background = SOLID + } + theme.applyStyle(background.id, true) } fun applyToWindow(window: Window) { diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt index 1e57f9f..8cef124 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt @@ -26,7 +26,7 @@ enum class ColorTheme( R.style.colorThemeLight, R.string.settings_theme_color_theme_item_light, R.style.textShadowLight, - { false }), + { true }), DYNAMIC( R.style.colorThemeDynamic, R.string.settings_theme_color_theme_item_dynamic, diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt index 0ae08c2..0b054ce 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt @@ -34,6 +34,12 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() { ) val timeVisible = LauncherPreferences.clock().timeVisible() showSeconds?.isVisible = timeVisible + + val background = findPreference( + LauncherPreferences.theme().keys().background() + ) + val lightTheme = LauncherPreferences.theme().colorTheme() == ColorTheme.LIGHT + background?.isVisible = !lightTheme } override fun onStart() { From 785e024ddb81735cd91e538959ad87bcadc732e8 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Wed, 22 Jan 2025 01:44:51 +0100 Subject: [PATCH 023/142] basic support for private space (#98) * add an action to toggle private space lock * hide apps from private space if private space is locked --- .../de/jrpie/android/launcher/Application.kt | 28 +++++++++ .../de/jrpie/android/launcher/Functions.kt | 61 +++++++++++++------ .../launcher/actions/LauncherAction.kt | 56 ++++++++++++++++- .../LauncherPreferences$Config.java | 3 +- .../launcher/preferences/theme/ColorTheme.kt | 2 +- .../jrpie/android/launcher/ui/HomeActivity.kt | 4 -- .../ui/list/other/OtherRecyclerAdapter.kt | 3 +- .../launcher/SettingsFragmentLauncher.kt | 5 ++ .../res/drawable/baseline_security_24.xml | 12 ++++ app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 7 +++ app/src/main/res/xml/preferences.xml | 5 ++ 12 files changed, 159 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_security_24.xml diff --git a/app/src/main/java/de/jrpie/android/launcher/Application.kt b/app/src/main/java/de/jrpie/android/launcher/Application.kt index e3e5f7c..6e924c2 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Application.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Application.kt @@ -1,5 +1,9 @@ package de.jrpie.android.launcher +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.SharedPreferences import android.content.pm.LauncherApps import android.content.pm.ShortcutInfo @@ -7,6 +11,7 @@ import android.os.AsyncTask import android.os.Build import android.os.Build.VERSION_CODES import android.os.UserHandle +import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData import androidx.preference.PreferenceManager import de.jrpie.android.launcher.actions.TorchManager @@ -19,6 +24,14 @@ import de.jrpie.android.launcher.preferences.resetPreferences class Application : android.app.Application() { val apps = MutableLiveData>() + private val profileAvailabilityBroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + // TODO: only update specific apps + // use Intent.EXTRA_USER + loadApps() + } + } + // TODO: only update specific apps private val launcherAppsCallback = object : LauncherApps.Callback() { override fun onPackageRemoved(p0: String?, p1: UserHandle?) { @@ -107,6 +120,21 @@ class Application : android.app.Application() { val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps launcherApps.registerCallback(launcherAppsCallback) + if (Build.VERSION.SDK_INT >= VERSION_CODES.N) { + val filter = IntentFilter().also { + if (Build.VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM) { + it.addAction(Intent.ACTION_PROFILE_AVAILABLE) + it.addAction(Intent.ACTION_PROFILE_UNAVAILABLE) + } else { + it.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE) + it.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE) + } + } + ContextCompat.registerReceiver(this, profileAvailabilityBroadcastReceiver, filter, + ContextCompat.RECEIVER_EXPORTED + ) + } + loadApps() } diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index e8d3851..48b5028 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -18,6 +18,7 @@ import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.apps.AppInfo import de.jrpie.android.launcher.apps.DetailedAppInfo +import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.tutorial.TutorialActivity @@ -30,31 +31,36 @@ const val REQUEST_SET_DEFAULT_HOME = 42 const val LOG_TAG = "Launcher" -fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { - - if (checkDefault - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q - && context is Activity - ) { +fun isDefaultHomeScreen(context: Context): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val roleManager = context.getSystemService(RoleManager::class.java) - if (!roleManager.isRoleHeld(RoleManager.ROLE_HOME)) { - context.startActivityForResult( - roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), - REQUEST_SET_DEFAULT_HOME - ) - } - return - } - - if (checkDefault) { + return roleManager.isRoleHeld(RoleManager.ROLE_HOME) + } else { val testIntent = Intent(Intent.ACTION_MAIN) testIntent.addCategory(Intent.CATEGORY_HOME) val defaultHome = testIntent.resolveActivity(context.packageManager)?.packageName - if (defaultHome == context.packageName) { - // Launcher is already the default home app - return - } + return defaultHome == context.packageName } +} + +fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { + if (checkDefault && isDefaultHomeScreen(context)) { + // Launcher is already the default home app + return + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + && context is Activity + && checkDefault // using role manager only works when µLauncher is not already the default. + ) { + val roleManager = context.getSystemService(RoleManager::class.java) + context.startActivityForResult( + roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), + REQUEST_SET_DEFAULT_HOME + ) + return + } + val intent = Intent(Settings.ACTION_HOME_SETTINGS) context.startActivity(intent) } @@ -94,6 +100,21 @@ fun getApps(packageManager: PackageManager, context: Context): MutableList= Build.VERSION_CODES.N) { + if (userManager.isQuietModeEnabled(user)) { + // hide paused apps + if (LauncherPreferences.apps().hidePausedApps()) { + continue + } + // hide apps from private space + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && + launcherApps.getLauncherUserInfo(user)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE + ) { + continue + } + } + } launcherApps.getActivityList(null, user).forEach { loadList.add(DetailedAppInfo(it)) } diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index 3c641ff..2eddf16 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -1,17 +1,22 @@ package de.jrpie.android.launcher.actions +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import android.content.pm.LauncherApps import android.graphics.Rect import android.graphics.drawable.Drawable import android.media.AudioManager import android.os.Build import android.os.SystemClock +import android.os.UserManager +import android.provider.Settings import android.view.KeyEvent import android.widget.Toast import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.apps.AppFilter +import de.jrpie.android.launcher.isDefaultHomeScreen import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.list.ListActivity import de.jrpie.android.launcher.ui.settings.SettingsActivity @@ -33,7 +38,8 @@ enum class LauncherAction( val id: String, val label: Int, val icon: Int, - val launch: (Context) -> Unit + val launch: (Context) -> Unit, + val available: (Context) -> Boolean = { true } ) : Action { SETTINGS( "settings", @@ -53,6 +59,13 @@ enum class LauncherAction( R.drawable.baseline_favorite_24, { context -> openAppsList(context, true) } ), + TOGGLE_PRIVATE_SPACE_LOCK( + "toggle_private_space_lock", + R.string.list_other_toggle_private_space_lock, + R.drawable.baseline_security_24, + ::togglePrivateSpaceLock, + available = { Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM } + ), VOLUME_UP( "volume_up", R.string.list_other_volume_up, @@ -207,6 +220,46 @@ private fun expandNotificationsPanel(context: Context) { } } +private fun togglePrivateSpaceLock(context: Context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + Toast.makeText( + context, + context.getString(R.string.alert_requires_android_v), + Toast.LENGTH_LONG + ).show() + return + } + val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager + val launcherApps = context.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps + val privateSpaceUser = userManager.userProfiles.firstOrNull { u -> + launcherApps.getLauncherUserInfo(u)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE + } + if (privateSpaceUser == null) { + Toast.makeText(context, context.getString(R.string.toast_private_space_not_available), Toast.LENGTH_LONG).show() + + if (!isDefaultHomeScreen(context)) { + Toast.makeText(context, context.getString(R.string.toast_private_space_default_home_screen), Toast.LENGTH_LONG).show() + return + } + + try { + context.startActivity(Intent(Settings.ACTION_PRIVACY_SETTINGS)) + } catch (_: ActivityNotFoundException) {} + return + } + if (userManager.isQuietModeEnabled(privateSpaceUser)) { + userManager.requestQuietModeEnabled(false, privateSpaceUser) + Toast.makeText( + context, + context.getString(R.string.toast_private_space_unlocked), + Toast.LENGTH_LONG + ).show() + return + } + userManager.requestQuietModeEnabled(true, privateSpaceUser) + Toast.makeText(context, context.getString(R.string.toast_private_space_locked), Toast.LENGTH_LONG).show() +} + private fun expandSettingsPanel(context: Context) { /* https://stackoverflow.com/a/31898506 */ try { @@ -260,6 +313,7 @@ private class LauncherActionSerializer : KSerializer { ) { element("value", String.serializer().descriptor) } + override fun deserialize(decoder: Decoder): LauncherAction { val s = decoder.decodeStructure(descriptor) { decodeElementIndex(descriptor) diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java index 640e6ce..98496ce 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java @@ -5,8 +5,8 @@ import java.util.Set; import de.jrpie.android.launcher.R; import de.jrpie.android.launcher.actions.lock.LockMethod; -import de.jrpie.android.launcher.preferences.serialization.SetAppInfoPreferenceSerializer; import de.jrpie.android.launcher.preferences.serialization.MapAppInfoStringPreferenceSerializer; +import de.jrpie.android.launcher.preferences.serialization.SetAppInfoPreferenceSerializer; import de.jrpie.android.launcher.preferences.theme.Background; import de.jrpie.android.launcher.preferences.theme.ColorTheme; import de.jrpie.android.launcher.preferences.theme.Font; @@ -29,6 +29,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences; @Preference(name = "hidden", type = Set.class, serializer = SetAppInfoPreferenceSerializer.class), @Preference(name = "custom_names", type = HashMap.class, serializer = MapAppInfoStringPreferenceSerializer.class), @Preference(name = "hide_bound_apps", type = boolean.class, defaultValue = "false"), + @Preference(name = "hide_paused_apps", type = boolean.class, defaultValue = "false"), }), @PreferenceGroup(name = "list", prefix = "settings_list_", suffix = "_key", value = { @Preference(name = "layout", type = ListLayout.class, defaultValue = "DEFAULT") diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt index 8cef124..816d94f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/theme/ColorTheme.kt @@ -2,8 +2,8 @@ package de.jrpie.android.launcher.preferences.theme import android.content.Context import android.content.res.Resources -import de.jrpie.android.launcher.R import com.google.android.material.color.DynamicColors +import de.jrpie.android.launcher.R @Suppress("unused") enum class ColorTheme( diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 5633113..b1a5cc0 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -3,7 +3,6 @@ package de.jrpie.android.launcher.ui import android.annotation.SuppressLint import android.content.SharedPreferences import android.content.res.Resources -import android.os.AsyncTask import android.os.Build import android.os.Bundle import android.util.DisplayMetrics @@ -20,10 +19,7 @@ import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.databinding.HomeBinding -import de.jrpie.android.launcher.openTutorial import de.jrpie.android.launcher.preferences.LauncherPreferences -import de.jrpie.android.launcher.preferences.migratePreferencesToNewVersion -import de.jrpie.android.launcher.preferences.resetPreferences import de.jrpie.android.launcher.ui.tutorial.TutorialActivity import java.text.SimpleDateFormat import java.util.Date diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt index ddfcfd1..97d1c84 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/other/OtherRecyclerAdapter.kt @@ -23,7 +23,8 @@ import de.jrpie.android.launcher.ui.list.forGesture class OtherRecyclerAdapter(val activity: Activity) : RecyclerView.Adapter() { - private val othersList: Array = LauncherAction.values() + private val othersList: Array = + LauncherAction.entries.filter { it.isAvailable(activity) }.toTypedArray() inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt index 0b054ce..a8efb43 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/launcher/SettingsFragmentLauncher.kt @@ -40,6 +40,11 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() { ) val lightTheme = LauncherPreferences.theme().colorTheme() == ColorTheme.LIGHT background?.isVisible = !lightTheme + + val hidePausedApps = findPreference( + LauncherPreferences.apps().keys().hidePausedApps() + ) + hidePausedApps?.isVisible = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N } override fun onStart() { diff --git a/app/src/main/res/drawable/baseline_security_24.xml b/app/src/main/res/drawable/baseline_security_24.xml new file mode 100644 index 0000000..3c260ff --- /dev/null +++ b/app/src/main/res/drawable/baseline_security_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 0a30fac..b2e69a1 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -13,6 +13,7 @@ apps.hidden apps.custom_names apps.hide_bound_apps + apps.hide_paused_apps list.layout general.select_launcher diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5bb2c61..4cdebb1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -145,6 +145,7 @@ Apps Hidden apps Don\'t show apps that are bound to a gesture in the app list + Hide paused apps Layout of app list Default @@ -207,6 +208,7 @@ µLauncher Settings All Applications Favorite Applications + Toggle Private Space Lock Music: Louder Music: Quieter Music: Next @@ -245,6 +247,7 @@ More options Error: Can\'t expand status bar. This action is using functionality that is not part of the published Android API. Unfortunately, it does not seem to work on your device. This functionality requires Android 6.0 or later. + This functionality requires Android 15.0 or later. App hidden. You can make it visible again in settings. Undo Quick Settings @@ -255,6 +258,10 @@ Error: Can\'t access torch. Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings) μLauncher\'s accessibility service is not enabled. Please enable it in settings + Private space locked + Private space unlocked + Private space is not available + µLauncher needs to be the default home screen to access private space. Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead. µLauncher - lock screen diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index d1dcbe6..57e50df 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -145,6 +145,11 @@ android:title="@string/settings_apps_hide_bound_apps" android:defaultValue="false" /> + + Date: Wed, 22 Jan 2025 02:17:46 +0100 Subject: [PATCH 024/142] use TextClock instead of custom solution --- .../jrpie/android/launcher/ui/HomeActivity.kt | 44 ++++--------------- app/src/main/res/layout/home.xml | 4 +- 2 files changed, 11 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index b1a5cc0..1d5381d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -21,8 +21,6 @@ import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.databinding.HomeBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.tutorial.TutorialActivity -import java.text.SimpleDateFormat -import java.util.Date import java.util.Locale import java.util.Timer import kotlin.concurrent.fixedRateTimer @@ -65,8 +63,6 @@ class HomeActivity : UIObject, AppCompatActivity(), private lateinit var mDetector: GestureDetectorCompat - // timers - private var clockTimer = Timer() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -100,30 +96,24 @@ class HomeActivity : UIObject, AppCompatActivity(), } - private fun updateClock() { - clockTimer.cancel() + private fun initClock() { val locale = Locale.getDefault() val dateVisible = LauncherPreferences.clock().dateVisible() val timeVisible = LauncherPreferences.clock().timeVisible() var dateFMT = "yyyy-MM-dd" var timeFMT = "HH:mm" - val period = 100L if (LauncherPreferences.clock().showSeconds()) { timeFMT += ":ss" } - /* - I thought about adding an option to show microseconds as well ( timeFMT += ".SSS" ). - However setting period ot 1L (or even 10L) causes high CPU load, - so that doesn't seem to be a good idea. - */ + if (LauncherPreferences.clock().localized()) { dateFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, dateFMT) timeFMT = android.text.format.DateFormat.getBestDateTimePattern(locale, timeFMT) } - var upperFormat = SimpleDateFormat(dateFMT, locale) - var lowerFormat = SimpleDateFormat(timeFMT, locale) + var upperFormat = dateFMT + var lowerFormat = timeFMT var upperVisible = dateVisible var lowerVisible = timeVisible @@ -138,21 +128,10 @@ class HomeActivity : UIObject, AppCompatActivity(), binding.homeUpperView.setTextColor(LauncherPreferences.clock().color()) binding.homeLowerView.setTextColor(LauncherPreferences.clock().color()) - - clockTimer = fixedRateTimer("clockTimer", true, 0L, period) { - this@HomeActivity.runOnUiThread { - if (lowerVisible) { - val t = lowerFormat.format(Date()) - if (binding.homeLowerView.text != t) - binding.homeLowerView.text = t - } - if (upperVisible) { - val d = upperFormat.format(Date()) - if (binding.homeUpperView.text != d) - binding.homeUpperView.text = d - } - } - } + binding.homeLowerView.format24Hour = lowerFormat + binding.homeUpperView.format24Hour = upperFormat + binding.homeLowerView.format12Hour = lowerFormat + binding.homeUpperView.format12Hour = upperFormat } override fun getTheme(): Resources.Theme { @@ -172,12 +151,7 @@ class HomeActivity : UIObject, AppCompatActivity(), edgeWidth = LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f - updateClock() - } - - override fun onPause() { - super.onPause() - clockTimer.cancel() + initClock() } override fun onDestroy() { diff --git a/app/src/main/res/layout/home.xml b/app/src/main/res/layout/home.xml index 5f34412..f59b211 100644 --- a/app/src/main/res/layout/home.xml +++ b/app/src/main/res/layout/home.xml @@ -10,7 +10,7 @@ android:fitsSystemWindows="true" tools:context=".ui.HomeActivity"> - - Date: Fri, 24 Jan 2025 23:45:19 +0100 Subject: [PATCH 025/142] implement #102 - show version in settings and add bug report dialog --- .../de/jrpie/android/launcher/Functions.kt | 20 +++++++ .../ui/settings/meta/SettingsFragmentMeta.kt | 42 ++++++++++++--- app/src/main/res/layout/dialog_report_bug.xml | 53 +++++++++++++++++++ app/src/main/res/layout/settings_meta.xml | 15 +++++- app/src/main/res/values/donottranslate.xml | 3 +- app/src/main/res/values/strings.xml | 7 +++ 6 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/layout/dialog_report_bug.xml diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index 48b5028..7566f5f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -3,6 +3,8 @@ package de.jrpie.android.launcher import android.app.Activity import android.app.Service import android.app.role.RoleManager +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.pm.LauncherApps @@ -151,3 +153,21 @@ fun saveListActivityChoice(data: Intent?) { Gesture.byId(forGesture)?.let { Action.setActionForGesture(it, Action.fromIntent(data)) } } + +// used for the bug report button +fun getDeviceInfo(): String { + return """ + µLauncher version: ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) + Android version: ${Build.VERSION.RELEASE} (sdk ${Build.VERSION.SDK_INT}) + Model: ${Build.MODEL} + Device: ${Build.DEVICE} + Brand: ${Build.BRAND} + Manufacturer: ${Build.MANUFACTURER} + """.trimIndent() +} + +fun copyToClipboard(context: Context, text: String) { + val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText("Debug Info", text) + clipboardManager.setPrimaryClip(clipData); +} \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt index d53ea99..fd3a738 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt @@ -7,9 +7,14 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView import androidx.fragment.app.Fragment +import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.copyToClipboard import de.jrpie.android.launcher.databinding.SettingsMetaBinding +import de.jrpie.android.launcher.getDeviceInfo import de.jrpie.android.launcher.openInBrowser import de.jrpie.android.launcher.preferences.resetPreferences import de.jrpie.android.launcher.ui.LegalInfoActivity @@ -88,13 +93,37 @@ class SettingsFragmentMeta : Fragment(), UIObject { // report a bug binding.settingsMetaButtonReportBug.setOnClickListener { - openInBrowser( - getString(R.string.settings_meta_report_bug_link), - requireContext() - ) + val deviceInfo = getDeviceInfo() + AlertDialog.Builder(context, R.style.AlertDialogCustom).apply { + setView(R.layout.dialog_report_bug) + setTitle(R.string.dialog_report_bug_title) + setPositiveButton(R.string.dialog_report_bug_create_report) { _, _ -> + openInBrowser( + getString(R.string.settings_meta_report_bug_link), + requireContext() + ) + } + setNegativeButton(R.string.dialog_cancel) { _, _ -> } + }.create().also { it.show() }.apply { + val info = findViewById(R.id.dialog_report_bug_device_info) + val buttonClipboard = findViewById