From 77212c14ca78d7fa73b0bc3202c0fbf32a03be15 Mon Sep 17 00:00:00 2001 From: Nicola Bortoletto Date: Tue, 4 Feb 2025 07:12:41 +0000 Subject: [PATCH 01/15] Translated using Weblate (Italian) Currently translated at 98.1% (214 of 218 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ --- app/src/main/res/values-it/strings.xml | 54 ++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index afc92da..06555b0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -4,7 +4,7 @@ Aspetto Scegliere l\'applicazione Tema - Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni.\n\nNon contiene pagamenti, pubblicità o servizi di tracciamento. + Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni. Non contiene pagamenti, pubblicità o servizi di tracciamento. Predefinito Non mostrare applicazioni collegate a gesti nella lista delle app Testo @@ -45,11 +45,11 @@ Scorri verso il basso con due dita Sinistra Scorrere verso sinistra - Doppio a sinistra + Due dita verso sinistra Scorrere verso sinistra con due dita Destra Scorri verso destra - Doppio a destra + Due dita verso destra Scorri a destra con due dita Destra (in alto) Scorri verso destra sul bordo superiore dello schermo @@ -125,12 +125,12 @@ Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri: Puoi anche cambiare la tua selezione in seguito. Iniziamo! - Sei pronto per iniziare!\n\nSpero questa applicazione ti risulti preziosa!\n\n- Finn (che ha ideato il launcher)\n\t e Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) + Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher) \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) Inizia Impostazioni Altre opzioni Puoi aprire le tue app facendo scorrere il dito sullo schermo o premendo un pulsante. Configura i gesti nella prossima slide. - Errore: impossibile espandere la barra di stato.\nQuesta azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo. + Errore: impossibile espandere la barra di stato. Questa azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo. Applicazione nascosta. Puoi renderla nuovamente visibile nelle impostazioni. µLauncher deve essere autorizzato come amministratore del dispositivo per bloccare lo schermo. Abilita il blocco dello schermo @@ -182,7 +182,7 @@ Mostra Rinomina Le applicazioni selezionate sono state rimosse - Cerca tra le applicazioni + Cerca Impostazioni μLauncher Espandi il pannello notifiche Non fare niente @@ -191,11 +191,49 @@ Tutorial Prenditi qualche secondo per imparare ad usare questo launcher! Concetto - L\'app è open source (sotto licenza MIT) e disponibile su GitHub!\n\nVisita il nostro archivio! + L\'app è open source (sotto licenza MIT) e disponibile su GitHub! Visita il nostro archivio! Utilizzo La schermata principale contiene solo data e ora. Nessuna distrazione. - Questa funzione richiede Android 6.0 o successivi. + Questa funzione richiede Android 6 o successivi. Ok Rinomina %1$s Impossibile rimuovere l\'applicazione + Dinamico + Colore + Due dita verso l\'alto + Sono consapevole che questo concederà privilegi estesi a µLauncher. + Accetto che µLauncher utilizzi il servizio di accessibilità per fornire funzionalità non correlate all\'accessibilità. + Accetto che µLauncher non raccolga alcun dato. + Nascondi le app in pausa + Attiva/Disattiva Blocco Spazio Privato + Questa funzionalità richiede Android 15 o successivi. + Rosso + Trasparente + Blu + Verde + Ok + Colore + Scegli colore + Attiva Servizi di Accessibilità + Sono consapevole che esistono altre opzioni (utilizzando i privilegi di amministratore del dispositivo o il pulsante di accensione). + Attivazione dei Servizi di Accessibilità + Cerca su internet + Premi invio durante la ricerca nell\'elenco delle app per avviare una ricerca su internet. + Cerca (senza avvio automatico) + Licenze Open Source + Licenze Open Source + Segnala un bug + Grazie per aver contribuito a migliorare µLauncher!\nSi prega di aggiungere le seguenti informazioni alla segnalazione del bug: + Copia negli appunti + Non segnalare pubblicamente le vulnerabilità di sicurezza su GitHub, ma utilizza invece: + Annulla + Premi spazio per disabilitare temporaneamente questa funzionalità. + Segnala una vulnerabilità di sicurezza + Crea una segnalazione + Spazio privato bloccato + Spazio privato sbloccato + Spazio privato non disponibile + µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato. + Impossibile aprire l\'URL: nessun browser trovato. + Non è stata trovata un\'applicazione per gestire la ricerca. \ No newline at end of file From bcfe13e5b6d78fd5ac1baec6c24b3cf43dc89640 Mon Sep 17 00:00:00 2001 From: Xanadul Date: Wed, 5 Feb 2025 10:11:17 +0000 Subject: [PATCH 02/15] Translated using Weblate (German) Currently translated at 13.3% (2 of 15 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/de/ --- fastlane/metadata/android/de-DE/title.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/de-DE/title.txt diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt new file mode 100644 index 0000000..4305604 --- /dev/null +++ b/fastlane/metadata/android/de-DE/title.txt @@ -0,0 +1 @@ +µLauncher From 1c3e19071a78fe5a16342085935dfdcc90b16e51 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Wed, 5 Feb 2025 16:39:04 +0000 Subject: [PATCH 03/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (218 of 218 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 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6a404eb..228d0f4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -30,10 +30,10 @@ 2 dedos para esquerda Para direita 2 dedos para direita - Para direita (No topo) + Para direita (no topo) Para direita (em baixo) - Para esquerda (Em baixo) - Para esquerda (No topo) + Para esquerda (em baixo) + Para esquerda (no topo) Para cima (Borda esquerda) Para cima (Borda direita) Para baixo (Borda esquerda) @@ -164,7 +164,7 @@ Escolha um método de bloqueio Escolha um método de bloqueio da tela Configurações rápidas - Essa funcionalidade requer o Android 6.0 ou mais recente. + Essa funcionalidade requer o Android 6 ou mais recente. Nenhuma câmera com lanterna detectada. Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo. Definindo µLauncher como Serviço de acessibilidade permite a ele bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O µLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao µLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. @@ -260,7 +260,7 @@ Licenças de código aberto Ocultar apps pausados Ativar o Espaço privado - Essa funcionalidade requer o Android 15.0 ou mais recente. + Essa funcionalidade requer o Android 15 ou mais recente. Espaço privado trancado Espaço privado liberado Espaço privado indisponível @@ -271,4 +271,7 @@ Criar relatório Relatar um bug Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug: + Toque no espaço para temporariamente desativar esta funcionalidade. + Não foi possível abrir a URL: nenhum navegador encontrado. + Nenhum app encontrado para efetuar a pesquisa. \ No newline at end of file From 152201c4244504d586accb5c3a6aa0345ae6ba8b Mon Sep 17 00:00:00 2001 From: Nicola Bortoletto Date: Thu, 6 Feb 2025 12:57:53 +0000 Subject: [PATCH 04/15] Translated using Weblate (Italian) Currently translated at 99.0% (216 of 218 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ --- app/src/main/res/values-it/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 06555b0..320bfc6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -125,7 +125,7 @@ Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri: Puoi anche cambiare la tua selezione in seguito. Iniziamo! - Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher) \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) + Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher)\n \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) Inizia Impostazioni Altre opzioni @@ -236,4 +236,5 @@ µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato. Impossibile aprire l\'URL: nessun browser trovato. Non è stata trovata un\'applicazione per gestire la ricerca. + privilegi più ampi a µLauncher.
µLauncher utilizzerà questi privilegi solo per bloccare lo schermo. µLauncher non raccoglierà mai alcun dato. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]>
\ No newline at end of file From 868e493d1f31d71626bd6b0b095d217b9d8cd0e5 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Fri, 7 Feb 2025 13:36:03 +0000 Subject: [PATCH 05/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (220 of 220 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 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 228d0f4..0ec4a32 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -274,4 +274,6 @@ Toque no espaço para temporariamente desativar esta funcionalidade. Não foi possível abrir a URL: nenhum navegador encontrado. Nenhum app encontrado para efetuar a pesquisa. + Voltar + Botão Voltar / gesto de Voltar \ No newline at end of file From bafd1ff4f82b1975ac528fcd9042509f6ec7ffac Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Fri, 7 Feb 2025 13:35:02 +0000 Subject: [PATCH 06/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 20.0% (3 of 15 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/pt_BR/ --- .../android/pt-BR/full_description.txt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index b3bfbce..e976080 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -1,23 +1,23 @@ -O µLauncher é uma tela inicial que permite abrir aplicativos através gestos de deslize e botões físicos. +O µLauncher é uma tela inicial que permite abrir apps através de gestos e botões físicos. O launcher é minimalista, eficiente e livre de distrações. -Sua tela inicial exibe apenas a data, hora e papel de parede. +A tela inicial mostra apenas a data, hora e papel de parede. -Ao usar Voltar ou deslize para cima (pode ser configurado depois) você abre a lista -com todos os aplicativos instalados, que podem ser encontrados rápido. +Ao usar botão Voltar ou gesto pra cima (pode ser redefinido depois) +você abre com facilidade e rapidez a lista com todos os apps instalados. -Esta é uma modificação do app Launcher -feita por Finn M Glas. +O app é uma modificação do Launcher +feito por Finn M Glas. Funcionalidades: * Você pode associar várias ações a 22 gestos diferentes. -* Também pode definir algumas das seguintes acções: - - Iniciar algum app +* Pode definir algumas das seguintes ações: + - Iniciar vários apps - Listar todos aplicativos - Listar apps favoritos - Aumentar / diminuir o volume - - Música: faixa anterior / seguinte + - Música: passar pra faixa anterior / seguinte - Bloquear a tela - Ligar a lanterna - Mostrar notificações / configurações rápidas -* Compatível com Perfil de trabalho, desta forma apps como Shelter podem ser usados. +* App é compatível com Perfil de trabalho e pode ser usado com apps tipo Shelter. From d69e3caf71cada50b8300b91726cd5dadb3cde05 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sun, 9 Feb 2025 18:49:41 +0100 Subject: [PATCH 07/15] implement #98 - add option to show private space in different list --- .../de/jrpie/android/launcher/Application.kt | 3 + .../de/jrpie/android/launcher/Functions.kt | 26 ++-- .../launcher/actions/LauncherAction.kt | 74 +++++------ .../jrpie/android/launcher/apps/AppFilter.kt | 3 + .../android/launcher/apps/DetailedAppInfo.kt | 8 +- .../android/launcher/apps/PrivateSpace.kt | 118 ++++++++++++++++++ .../LauncherPreferences$Config.java | 1 + .../android/launcher/ui/list/ListActivity.kt | 66 +++++++++- .../launcher/ui/list/apps/ListFragmentApps.kt | 2 + ...ine_lock_24px.xml => baseline_lock_24.xml} | 0 .../res/drawable/baseline_lock_open_24.xml | 10 ++ app/src/main/res/layout/list.xml | 19 ++- app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/xml/preferences.xml | 5 + 15 files changed, 279 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt rename app/src/main/res/drawable/{baseline_lock_24px.xml => baseline_lock_24.xml} (100%) create mode 100644 app/src/main/res/drawable/baseline_lock_open_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 6e924c2..c856066 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Application.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Application.kt @@ -17,12 +17,14 @@ import androidx.preference.PreferenceManager import de.jrpie.android.launcher.actions.TorchManager import de.jrpie.android.launcher.apps.AppInfo import de.jrpie.android.launcher.apps.DetailedAppInfo +import de.jrpie.android.launcher.apps.isPrivateSpaceLocked import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.migratePreferencesToNewVersion import de.jrpie.android.launcher.preferences.resetPreferences class Application : android.app.Application() { val apps = MutableLiveData>() + val privateSpaceLocked = MutableLiveData() private val profileAvailabilityBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -144,6 +146,7 @@ class Application : android.app.Application() { } private fun loadApps() { + privateSpaceLocked.postValue(isPrivateSpaceLocked(this)) AsyncTask.execute { apps.postValue(getApps(packageManager, applicationContext)) } } } 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 721caa2..7cc5c39 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -22,6 +22,8 @@ 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.apps.getPrivateSpaceUser +import de.jrpie.android.launcher.apps.isPrivateSpaceSupported import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.tutorial.TutorialActivity @@ -48,14 +50,15 @@ fun isDefaultHomeScreen(context: Context): Boolean { } fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { - if (checkDefault && isDefaultHomeScreen(context)) { + val isDefault = isDefaultHomeScreen(context) + if (checkDefault && isDefault) { // 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. + && !isDefault // using role manager only works when µLauncher is not already the default. ) { val roleManager = context.getSystemService(RoleManager::class.java) context.startActivityForResult( @@ -78,16 +81,6 @@ fun getUserFromId(userId: Int?, context: Context): UserHandle { return profiles.firstOrNull { it.hashCode() == userId } ?: profiles[0] } -fun getPrivateSpaceUser(context: Context): UserHandle? { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { - return null - } - val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager - val launcherApps = context.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps - return userManager.userProfiles.firstOrNull { u -> - launcherApps.getLauncherUserInfo(u)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE - } -} fun openInBrowser(url: String, context: Context) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) @@ -116,6 +109,8 @@ fun getApps(packageManager: PackageManager, context: Context): MutableList= Build.VERSION_CODES.VANILLA_ICE_CREAM && + if (isPrivateSpaceSupported() && launcherApps.getLauncherUserInfo(user)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE ) { continue @@ -135,7 +130,7 @@ fun getApps(packageManager: PackageManager, context: Context): MutableList openAppsList(context, true) }, + { context -> openAppsList(context, favorite = true) }, true ), + CHOOSE_FROM_PRIVATE_SPACE( + "choose_from_private_space", + R.string.list_other_list_private_space, + R.drawable.baseline_security_24, + { context -> + openAppsList(context, private = true) + }, + available = { _ -> + isPrivateSpaceSupported() + } + ), 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 } + available = { _ -> isPrivateSpaceSupported() } ), VOLUME_UP( "volume_up", @@ -107,7 +113,7 @@ enum class LauncherAction( LOCK_SCREEN( "lock_screen", R.string.list_other_lock_screen, - R.drawable.baseline_lock_24px, + R.drawable.baseline_lock_24, { c -> LauncherPreferences.actions().lockMethod().lockOrEnable(c) } ), TORCH( @@ -230,37 +236,6 @@ 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 privateSpaceUser = getPrivateSpaceUser(context) - 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) - 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 */ @@ -283,7 +258,12 @@ private fun openSettings(context: Context) { context.startActivity(Intent(context, SettingsActivity::class.java)) } -fun openAppsList(context: Context, favorite: Boolean = false, hidden: Boolean = false) { +fun openAppsList( + context: Context, + favorite: Boolean = false, + hidden: Boolean = false, + private: Boolean = false +) { val intent = Intent(context, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) intent.putExtra( @@ -302,6 +282,16 @@ fun openAppsList(context: Context, favorite: Boolean = false, hidden: Boolean = AppFilter.Companion.AppSetVisibility.HIDDEN } ) + intent.putExtra( + "privateSpaceVisibility", + if (private) { + AppFilter.Companion.AppSetVisibility.EXCLUSIVE + } else if (!hidden && LauncherPreferences.apps().hidePrivateSpaceApps()) { + AppFilter.Companion.AppSetVisibility.HIDDEN + } else { + AppFilter.Companion.AppSetVisibility.VISIBLE + } + ) context.startActivity(intent) } diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt b/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt index f3640d2..ecc7eaa 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/AppFilter.kt @@ -15,6 +15,7 @@ class AppFilter( var query: String, var favoritesVisibility: AppSetVisibility = AppSetVisibility.VISIBLE, var hiddenVisibility: AppSetVisibility = AppSetVisibility.HIDDEN, + var privateSpaceVisibility: AppSetVisibility = AppSetVisibility.VISIBLE ) { operator fun invoke(apps: List): List { @@ -23,10 +24,12 @@ class AppFilter( val hidden = LauncherPreferences.apps().hidden() ?: setOf() val favorites = LauncherPreferences.apps().favorites() ?: setOf() + val private = apps.filter { it.isPrivateSpaceApp }.map { it.app }.toSet() apps = apps.filter { info -> favoritesVisibility.predicate(favorites, info) && hiddenVisibility.predicate(hidden, info) + && privateSpaceVisibility.predicate(private, info) } if (LauncherPreferences.apps().hideBoundApps()) { diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt b/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt index 519798d..1984d47 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt @@ -15,10 +15,11 @@ class DetailedAppInfo( val app: AppInfo, val label: CharSequence, val icon: Drawable, + val isPrivateSpaceApp: Boolean, val isSystemApp: Boolean = false, ) { - constructor(activityInfo: LauncherActivityInfo) : this( + constructor(activityInfo: LauncherActivityInfo, private: Boolean) : this( AppInfo( activityInfo.applicationInfo.packageName, activityInfo.name, @@ -26,6 +27,7 @@ class DetailedAppInfo( ), activityInfo.label, activityInfo.getBadgedIcon(0), + private, activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0 ) @@ -51,7 +53,9 @@ class DetailedAppInfo( companion object { fun fromAppInfo(appInfo: AppInfo, context: Context): DetailedAppInfo? { - return appInfo.getLauncherActivityInfo(context)?.let { DetailedAppInfo(it) } + return appInfo.getLauncherActivityInfo(context)?.let { + DetailedAppInfo(it, it.user == getPrivateSpaceUser(context)) + } } } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt new file mode 100644 index 0000000..9b37d60 --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/apps/PrivateSpace.kt @@ -0,0 +1,118 @@ +package de.jrpie.android.launcher.apps + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.content.pm.LauncherApps +import android.os.Build +import android.os.UserHandle +import android.os.UserManager +import android.provider.Settings +import android.widget.Toast +import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.isDefaultHomeScreen +import de.jrpie.android.launcher.setDefaultHomeScreen + + +/* + * Checks whether the device supports private space. + */ +fun isPrivateSpaceSupported(): Boolean { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM +} + +fun getPrivateSpaceUser(context: Context): UserHandle? { + if (!isPrivateSpaceSupported()) { + return null + } + val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager + val launcherApps = context.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps + return userManager.userProfiles.firstOrNull { u -> + launcherApps.getLauncherUserInfo(u)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE + } +} + +/** + * Check whether the user has created a private space and whether µLauncher can access it. + */ +fun isPrivateSpaceSetUp( + context: Context, + showToast: Boolean = false, + launchSettings: Boolean = false +): Boolean { + if (!isPrivateSpaceSupported()) { + if (showToast) { + Toast.makeText( + context, + context.getString(R.string.alert_requires_android_v), + Toast.LENGTH_LONG + ).show() + } + return false + } + val privateSpaceUser = getPrivateSpaceUser(context) + if (privateSpaceUser != null) { + return true + } + if (!isDefaultHomeScreen(context)) { + if (showToast) { + Toast.makeText( + context, + context.getString(R.string.toast_private_space_default_home_screen), + Toast.LENGTH_LONG + ).show() + } + if (launchSettings) { + setDefaultHomeScreen(context) + } + } else { + if (showToast) { + Toast.makeText( + context, + context.getString(R.string.toast_private_space_not_available), + Toast.LENGTH_LONG + ).show() + } + if (launchSettings) { + try { + context.startActivity(Intent(Settings.ACTION_PRIVACY_SETTINGS)) + } catch (_: ActivityNotFoundException) { + } + } + } + return false +} + +fun isPrivateSpaceLocked(context: Context): Boolean { + if (!isPrivateSpaceSupported()) { + return false + } + val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager + val privateSpaceUser = getPrivateSpaceUser(context) ?: return false + return userManager.isQuietModeEnabled(privateSpaceUser) +} +fun lockPrivateSpace(context: Context, lock: Boolean) { + if (!isPrivateSpaceSupported()) { + return + } + val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager + val privateSpaceUser = getPrivateSpaceUser(context) ?: return + userManager.requestQuietModeEnabled(lock, privateSpaceUser) +} + +fun togglePrivateSpaceLock(context: Context) { + if (!isPrivateSpaceSetUp(context, showToast = true, launchSettings = true)) { + return + } + + val lock = isPrivateSpaceLocked(context) + lockPrivateSpace(context, !lock) + if (!lock) { + Toast.makeText( + context, + context.getString(R.string.toast_private_space_locked), + Toast.LENGTH_LONG + ).show() + } +} + 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 98496ce..c216911 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 @@ -30,6 +30,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences; @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"), + @Preference(name = "hide_private_space_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/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 1fe5afb..902e561 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -16,10 +16,14 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.google.android.material.tabs.TabLayout +import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_UNINSTALL import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.apps.AppFilter +import de.jrpie.android.launcher.apps.isPrivateSpaceLocked +import de.jrpie.android.launcher.apps.isPrivateSpaceSetUp +import de.jrpie.android.launcher.apps.togglePrivateSpaceLock import de.jrpie.android.launcher.databinding.ListBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.UIObject @@ -30,6 +34,8 @@ import de.jrpie.android.launcher.ui.list.other.ListFragmentOther // TODO: Better solution for this intercommunication functionality (used in list-fragments) var intention = ListActivity.ListActivityIntention.VIEW var favoritesVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.VISIBLE +var privateSpaceVisibility: AppFilter.Companion.AppSetVisibility = + AppFilter.Companion.AppSetVisibility.VISIBLE var hiddenVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.HIDDEN var forGesture: String? = null @@ -44,6 +50,29 @@ class ListActivity : AppCompatActivity(), UIObject { private lateinit var binding: ListBinding + private fun updateLockIcon(locked: Boolean) { + binding.listLock.setImageDrawable( + getDrawable( + if (locked) { + R.drawable.baseline_lock_24 + } else { + R.drawable.baseline_lock_open_24 + } + ) + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + binding.listLock.tooltipText = getString( + if (locked) { + R.string.tooltip_unlock_private_space + } else { + R.string.tooltip_lock_private_space + } + ) + } + } + + + enum class ListActivityIntention(val titleResource: Int) { VIEW(R.string.list_title_view), /* view list of apps */ PICK(R.string.list_title_pick) /* choose app or action to associate to a gesture */ @@ -70,8 +99,10 @@ class ListActivity : AppCompatActivity(), UIObject { favoritesVisibility = bundle.getSerializable("favoritesVisibility") as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility + privateSpaceVisibility = bundle.getSerializable("privateSpaceVisibility") + as? AppFilter.Companion.AppSetVisibility ?: privateSpaceVisibility hiddenVisibility = bundle.getSerializable("hiddenVisibility") - as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility + as? AppFilter.Companion.AppSetVisibility ?: hiddenVisibility if (intention != ListActivityIntention.VIEW) forGesture = bundle.getString("forGesture") @@ -86,6 +117,31 @@ class ListActivity : AppCompatActivity(), UIObject { LauncherAction.SETTINGS.launch(this@ListActivity) } + binding.listLock.visibility = + if (intention != ListActivityIntention.VIEW) { + View.GONE + } else if (!isPrivateSpaceSetUp(this)) { + View.GONE + } else if (LauncherPreferences.apps().hidePrivateSpaceApps()) { + if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { + View.VISIBLE + } else { + View.GONE + } + } else { + View.VISIBLE + } + + if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { + isPrivateSpaceSetUp(this, showToast = true, launchSettings = true) + if (isPrivateSpaceLocked(this)) { + togglePrivateSpaceLock(this) + } + } + updateLockIcon(isPrivateSpaceLocked(this)) + + val privateSpaceLocked = (this.applicationContext as Application).privateSpaceLocked + privateSpaceLocked.observe(this) { updateLockIcon(it) } // android:windowSoftInputMode="adjustResize" doesn't work in full screen. // workaround from https://stackoverflow.com/a/57623505 @@ -144,6 +200,8 @@ class ListActivity : AppCompatActivity(), UIObject { if (intention == ListActivityIntention.VIEW) { titleResource = if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_hidden + } else if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { + R.string.list_title_private_space } else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_favorite } else { @@ -161,6 +219,12 @@ class ListActivity : AppCompatActivity(), UIObject { override fun setOnClicks() { binding.listClose.setOnClickListener { finish() } + binding.listLock.setOnClickListener { + togglePrivateSpaceLock(this) + if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { + finish() + } + } } override fun adjustLayout() { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt index c52f951..3a6e403 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ListFragmentApps.kt @@ -19,6 +19,7 @@ import de.jrpie.android.launcher.ui.list.favoritesVisibility import de.jrpie.android.launcher.ui.list.forGesture import de.jrpie.android.launcher.ui.list.hiddenVisibility import de.jrpie.android.launcher.ui.list.intention +import de.jrpie.android.launcher.ui.list.privateSpaceVisibility import de.jrpie.android.launcher.ui.openSoftKeyboard @@ -72,6 +73,7 @@ class ListFragmentApps : Fragment(), UIObject { requireContext(), "", favoritesVisibility = favoritesVisibility, + privateSpaceVisibility = privateSpaceVisibility, hiddenVisibility = hiddenVisibility ), layout = LauncherPreferences.list().layout() diff --git a/app/src/main/res/drawable/baseline_lock_24px.xml b/app/src/main/res/drawable/baseline_lock_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_lock_24px.xml rename to app/src/main/res/drawable/baseline_lock_24.xml diff --git a/app/src/main/res/drawable/baseline_lock_open_24.xml b/app/src/main/res/drawable/baseline_lock_open_24.xml new file mode 100644 index 0000000..f0f6ea3 --- /dev/null +++ b/app/src/main/res/drawable/baseline_lock_open_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/list.xml b/app/src/main/res/layout/list.xml index 062cab4..4fd6962 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -53,8 +53,8 @@ android:text="@string/list_title_pick" android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" android:textSize="30sp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/list_lock" + app:layout_constraintStart_toEndOf="@id/list_settings" app:layout_constraintTop_toTopOf="parent" /> + apps.custom_names apps.hide_bound_apps apps.hide_paused_apps + apps.hide_private_space_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 9c07ed6..97d7384 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,6 +150,7 @@ Hidden apps Don\'t show apps that are bound to a gesture in the app list Hide paused apps + Hide private space from app list Layout of app list Default @@ -197,6 +198,7 @@ All Apps Favorite Apps Hidden Apps + Private Space Choose App Apps @@ -219,6 +221,7 @@ µLauncher Settings All Applications Favorite Applications + Private Space Toggle Private Space Lock Music: Louder Music: Quieter @@ -273,6 +276,8 @@ Private space unlocked Private space is not available µLauncher needs to be the default home screen to access private space. + Lock private space + Unlock 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 314f85f..406f81a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -151,6 +151,11 @@ android:title="@string/settings_apps_hide_paused_apps" android:defaultValue="false" /> + + Date: Sun, 9 Feb 2025 21:08:16 +0100 Subject: [PATCH 08/15] lint --- app/build.gradle | 2 +- .../java/de/jrpie/android/launcher/Functions.kt | 2 +- .../de/jrpie/android/launcher/actions/Gesture.kt | 2 +- .../android/launcher/actions/LauncherAction.kt | 3 ++- .../android/launcher/apps/DetailedAppInfo.kt | 2 +- .../launcher/preferences/legacy/Version1.kt | 8 ++++---- .../launcher/preferences/legacy/VersionUnknown.kt | 1 - .../serialization/PreferenceSerializers.kt | 4 ++-- .../de/jrpie/android/launcher/ui/HomeActivity.kt | 2 +- .../android/launcher/ui/list/ListActivity.kt | 4 +++- .../launcher/ui/list/apps/ContextMenuActions.kt | 2 +- .../ui/settings/meta/SettingsFragmentMeta.kt | 15 --------------- .../ui/tutorial/tabs/TutorialFragmentConcept.kt | 2 +- app/src/main/res/layout/list.xml | 4 ++-- .../res/layout/list_apps_row_variant_text.xml | 1 + app/src/main/res/layout/list_other_row.xml | 2 -- app/src/main/res/layout/settings.xml | 4 ++-- .../main/res/mipmap-anydpi-v26/ic_launcher.xml | 1 + .../res/mipmap-anydpi-v26/ic_launcher_round.xml | 1 + 19 files changed, 25 insertions(+), 37 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 23273af..76bd285 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.2.0' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.palette:palette-ktx:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.3.2' + implementation 'androidx.recyclerview:recyclerview:1.4.0' implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'com.google.android.material:material:1.12.0' implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") 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 7cc5c39..5f7e9c9 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -182,5 +182,5 @@ fun getDeviceInfo(): String { 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); + clipboardManager.setPrimaryClip(clipData) } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt index dba314d..34e053e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt @@ -273,7 +273,7 @@ enum class Gesture( companion object { fun byId(id: String): Gesture? { - return Gesture.values().firstOrNull { it.id == id } + return Gesture.entries.firstOrNull { it.id == id } } } 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 0220fc2..4f89758 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 @@ -9,6 +9,7 @@ import android.os.Build import android.os.SystemClock import android.view.KeyEvent import android.widget.Toast +import androidx.appcompat.content.res.AppCompatResources import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.apps.AppFilter @@ -134,7 +135,7 @@ enum class LauncherAction( } override fun getIcon(context: Context): Drawable? { - return context.getDrawable(icon) + return AppCompatResources.getDrawable(context, icon) } override fun isAvailable(context: Context): Boolean { diff --git a/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt b/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt index 1984d47..d77bf93 100644 --- a/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt +++ b/app/src/main/java/de/jrpie/android/launcher/apps/DetailedAppInfo.kt @@ -9,7 +9,7 @@ import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.preferences.LauncherPreferences /** - * Stores information used to create [AppsRecyclerAdapter] rows. + * Stores information used to create [de.jrpie.android.launcher.ui.list.apps.AppsRecyclerAdapter] rows. */ class DetailedAppInfo( val app: AppInfo, diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt index d617127..a61980a 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version1.kt @@ -68,9 +68,9 @@ private fun Action.Companion.legacyFromPreference(id: String): Action? { val actionId = preferences.getString("$id.app", "")!! var u: Int? = preferences.getInt( "$id.user", - AppInfo.INVALID_USER + INVALID_USER ) - u = if (u == AppInfo.INVALID_USER) null else u + u = if (u == INVALID_USER) null else u return Action.legacyFromId(actionId, u) } @@ -80,9 +80,9 @@ private fun migrateAppInfoStringMap(key: String) { MapAppInfoStringPreferenceSerializer().serialize( preferences.getStringSet(key, setOf())?.mapNotNull { entry -> try { - val obj = JSONObject(entry); + val obj = JSONObject(entry) val info = AppInfo.legacyDeserialize(obj.getString("key")) - val value = obj.getString("value"); + val value = obj.getString("value") Pair(info, value) } catch (_: JSONException) { null diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt index c61ca95..a33670b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/VersionUnknown.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.SharedPreferences import android.util.Log import de.jrpie.android.launcher.preferences.LauncherPreferences -import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION import de.jrpie.android.launcher.preferences.theme.Background import de.jrpie.android.launcher.preferences.theme.ColorTheme diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/serialization/PreferenceSerializers.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/serialization/PreferenceSerializers.kt index 4a745a2..041fe4d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/serialization/PreferenceSerializers.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/serialization/PreferenceSerializers.kt @@ -15,7 +15,7 @@ import kotlinx.serialization.json.Json class SetAppInfoPreferenceSerializer : PreferenceSerializer?, java.util.Set?> { @Throws(PreferenceSerializationException::class) - override fun serialize(value: java.util.Set?): java.util.Set? { + override fun serialize(value: java.util.Set?): java.util.Set { return value?.map(AppInfo::serialize)?.toHashSet() as java.util.Set } @@ -29,7 +29,7 @@ class SetAppInfoPreferenceSerializer : class MapAppInfoStringPreferenceSerializer : PreferenceSerializer?, java.util.Set?> { - @Serializable() + @Serializable private class MapEntry(val key: AppInfo, val value: String) @Throws(PreferenceSerializationException::class) 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 42dc01b..b41eff3 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 @@ -216,7 +216,7 @@ class HomeActivity : UIObject, AppCompatActivity(), if (e1 == null) return false - val displayMetrics: DisplayMetrics = DisplayMetrics() + val displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) val width = displayMetrics.widthPixels diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index 902e561..c4ecded 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -11,6 +11,7 @@ import android.view.View import android.widget.Toast import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.content.res.AppCompatResources import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter @@ -52,7 +53,8 @@ class ListActivity : AppCompatActivity(), UIObject { private fun updateLockIcon(locked: Boolean) { binding.listLock.setImageDrawable( - getDrawable( + AppCompatResources.getDrawable( + this, if (locked) { R.drawable.baseline_lock_24 } else { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt index e09111e..9636dc2 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/ContextMenuActions.kt @@ -33,7 +33,7 @@ fun AppInfo.openSettings( } fun AppInfo.uninstall(activity: android.app.Activity) { - val packageName = this.packageName.toString() + val packageName = this.packageName val userId = this.user Log.i(LOG_TAG, "uninstalling $this") 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 fd3a738..70a225d 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 @@ -45,21 +45,6 @@ class SettingsFragmentMeta : Fragment(), UIObject { super.onStart() } - // Rate App - // Just copied code from https://stackoverflow.com/q/10816757/12787264 - // that is how we write good software ^^ - - private fun rateIntentForUrl(url: String): Intent { - val intent = Intent( - Intent.ACTION_VIEW, - Uri.parse(String.format("%s?id=%s", url, this.requireContext().packageName)) - ) - var flags = Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_MULTIPLE_TASK - flags = flags or Intent.FLAG_ACTIVITY_NEW_DOCUMENT - intent.addFlags(flags) - return intent - } - override fun setOnClicks() { binding.settingsMetaButtonViewTutorial.setOnClickListener { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt index 26d4141..f0fd233 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragmentConcept.kt @@ -21,7 +21,7 @@ class TutorialFragmentConcept : Fragment(), UIObject { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = TutorialConceptBinding.inflate(inflater, container, false) + binding = TutorialConceptBinding.inflate(inflater, container, false) binding.tutorialConceptBadgeVersion.text = BuildConfig.VERSION_NAME return binding.root } diff --git a/app/src/main/res/layout/list.xml b/app/src/main/res/layout/list.xml index 4fd6962..e68c895 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -32,7 +32,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:layout_marginLeft="8dp" + android:layout_marginEnd="8dp" android:contentDescription="@string/settings" android:gravity="center" android:paddingLeft="16sp" @@ -62,7 +62,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:layout_marginRight="8dp" + android:layout_marginStart="8dp" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" diff --git a/app/src/main/res/layout/list_apps_row_variant_text.xml b/app/src/main/res/layout/list_apps_row_variant_text.xml index 053568b..700dd7c 100644 --- a/app/src/main/res/layout/list_apps_row_variant_text.xml +++ b/app/src/main/res/layout/list_apps_row_variant_text.xml @@ -25,6 +25,7 @@ android:gravity="start|center_horizontal" android:padding="5dp" android:paddingStart="20dp" + android:paddingEnd="20dp" android:text="" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/list_other_row.xml b/app/src/main/res/layout/list_other_row.xml index aea51e1..530cc9e 100644 --- a/app/src/main/res/layout/list_other_row.xml +++ b/app/src/main/res/layout/list_other_row.xml @@ -22,9 +22,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="60sp" - android:layout_marginLeft="60sp" android:layout_marginEnd="5dp" - android:layout_marginRight="5dp" android:gravity="start" android:text="" android:textSize="20sp" diff --git a/app/src/main/res/layout/settings.xml b/app/src/main/res/layout/settings.xml index f7d5c6e..668358a 100644 --- a/app/src/main/res/layout/settings.xml +++ b/app/src/main/res/layout/settings.xml @@ -39,7 +39,7 @@ android:id="@+id/settings_close" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginRight="8dp" + android:layout_marginEnd="8dp" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" @@ -55,7 +55,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:layout_marginLeft="8dp" + android:layout_marginEnd="8dp" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f2acb4..4dd969d 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f2acb4..8b20aae 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file From ef47a8d305df53425bca63b8babf23e1873bd642 Mon Sep 17 00:00:00 2001 From: Nicola Bortoletto Date: Tue, 4 Feb 2025 07:12:41 +0000 Subject: [PATCH 09/15] Translated using Weblate (Italian) Currently translated at 98.1% (214 of 218 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ --- app/src/main/res/values-it/strings.xml | 54 ++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index afc92da..06555b0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -4,7 +4,7 @@ Aspetto Scegliere l\'applicazione Tema - Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni.\n\nNon contiene pagamenti, pubblicità o servizi di tracciamento. + Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni. Non contiene pagamenti, pubblicità o servizi di tracciamento. Predefinito Non mostrare applicazioni collegate a gesti nella lista delle app Testo @@ -45,11 +45,11 @@ Scorri verso il basso con due dita Sinistra Scorrere verso sinistra - Doppio a sinistra + Due dita verso sinistra Scorrere verso sinistra con due dita Destra Scorri verso destra - Doppio a destra + Due dita verso destra Scorri a destra con due dita Destra (in alto) Scorri verso destra sul bordo superiore dello schermo @@ -125,12 +125,12 @@ Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri: Puoi anche cambiare la tua selezione in seguito. Iniziamo! - Sei pronto per iniziare!\n\nSpero questa applicazione ti risulti preziosa!\n\n- Finn (che ha ideato il launcher)\n\t e Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) + Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher) \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) Inizia Impostazioni Altre opzioni Puoi aprire le tue app facendo scorrere il dito sullo schermo o premendo un pulsante. Configura i gesti nella prossima slide. - Errore: impossibile espandere la barra di stato.\nQuesta azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo. + Errore: impossibile espandere la barra di stato. Questa azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo. Applicazione nascosta. Puoi renderla nuovamente visibile nelle impostazioni. µLauncher deve essere autorizzato come amministratore del dispositivo per bloccare lo schermo. Abilita il blocco dello schermo @@ -182,7 +182,7 @@ Mostra Rinomina Le applicazioni selezionate sono state rimosse - Cerca tra le applicazioni + Cerca Impostazioni μLauncher Espandi il pannello notifiche Non fare niente @@ -191,11 +191,49 @@ Tutorial Prenditi qualche secondo per imparare ad usare questo launcher! Concetto - L\'app è open source (sotto licenza MIT) e disponibile su GitHub!\n\nVisita il nostro archivio! + L\'app è open source (sotto licenza MIT) e disponibile su GitHub! Visita il nostro archivio! Utilizzo La schermata principale contiene solo data e ora. Nessuna distrazione. - Questa funzione richiede Android 6.0 o successivi. + Questa funzione richiede Android 6 o successivi. Ok Rinomina %1$s Impossibile rimuovere l\'applicazione + Dinamico + Colore + Due dita verso l\'alto + Sono consapevole che questo concederà privilegi estesi a µLauncher. + Accetto che µLauncher utilizzi il servizio di accessibilità per fornire funzionalità non correlate all\'accessibilità. + Accetto che µLauncher non raccolga alcun dato. + Nascondi le app in pausa + Attiva/Disattiva Blocco Spazio Privato + Questa funzionalità richiede Android 15 o successivi. + Rosso + Trasparente + Blu + Verde + Ok + Colore + Scegli colore + Attiva Servizi di Accessibilità + Sono consapevole che esistono altre opzioni (utilizzando i privilegi di amministratore del dispositivo o il pulsante di accensione). + Attivazione dei Servizi di Accessibilità + Cerca su internet + Premi invio durante la ricerca nell\'elenco delle app per avviare una ricerca su internet. + Cerca (senza avvio automatico) + Licenze Open Source + Licenze Open Source + Segnala un bug + Grazie per aver contribuito a migliorare µLauncher!\nSi prega di aggiungere le seguenti informazioni alla segnalazione del bug: + Copia negli appunti + Non segnalare pubblicamente le vulnerabilità di sicurezza su GitHub, ma utilizza invece: + Annulla + Premi spazio per disabilitare temporaneamente questa funzionalità. + Segnala una vulnerabilità di sicurezza + Crea una segnalazione + Spazio privato bloccato + Spazio privato sbloccato + Spazio privato non disponibile + µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato. + Impossibile aprire l\'URL: nessun browser trovato. + Non è stata trovata un\'applicazione per gestire la ricerca. \ No newline at end of file From 91b0c50f83433f5927a780484e598f2320d0f531 Mon Sep 17 00:00:00 2001 From: Xanadul Date: Wed, 5 Feb 2025 10:11:17 +0000 Subject: [PATCH 10/15] Translated using Weblate (German) Currently translated at 13.3% (2 of 15 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/de/ --- fastlane/metadata/android/de-DE/title.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/de-DE/title.txt diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt new file mode 100644 index 0000000..4305604 --- /dev/null +++ b/fastlane/metadata/android/de-DE/title.txt @@ -0,0 +1 @@ +µLauncher From 09f944ec429488ac09a3f81925e1f4d3ab4624ad Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Wed, 5 Feb 2025 16:39:04 +0000 Subject: [PATCH 11/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (218 of 218 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 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6a404eb..228d0f4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -30,10 +30,10 @@ 2 dedos para esquerda Para direita 2 dedos para direita - Para direita (No topo) + Para direita (no topo) Para direita (em baixo) - Para esquerda (Em baixo) - Para esquerda (No topo) + Para esquerda (em baixo) + Para esquerda (no topo) Para cima (Borda esquerda) Para cima (Borda direita) Para baixo (Borda esquerda) @@ -164,7 +164,7 @@ Escolha um método de bloqueio Escolha um método de bloqueio da tela Configurações rápidas - Essa funcionalidade requer o Android 6.0 ou mais recente. + Essa funcionalidade requer o Android 6 ou mais recente. Nenhuma câmera com lanterna detectada. Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo. Definindo µLauncher como Serviço de acessibilidade permite a ele bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O µLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao µLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial. @@ -260,7 +260,7 @@ Licenças de código aberto Ocultar apps pausados Ativar o Espaço privado - Essa funcionalidade requer o Android 15.0 ou mais recente. + Essa funcionalidade requer o Android 15 ou mais recente. Espaço privado trancado Espaço privado liberado Espaço privado indisponível @@ -271,4 +271,7 @@ Criar relatório Relatar um bug Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug: + Toque no espaço para temporariamente desativar esta funcionalidade. + Não foi possível abrir a URL: nenhum navegador encontrado. + Nenhum app encontrado para efetuar a pesquisa. \ No newline at end of file From f8d943904abdd4c9b957c86f37d48e79026aa64a Mon Sep 17 00:00:00 2001 From: Nicola Bortoletto Date: Thu, 6 Feb 2025 12:57:53 +0000 Subject: [PATCH 12/15] Translated using Weblate (Italian) Currently translated at 99.0% (216 of 218 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ --- app/src/main/res/values-it/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 06555b0..320bfc6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -125,7 +125,7 @@ Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri: Puoi anche cambiare la tua selezione in seguito. Iniziamo! - Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher) \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) + Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher)\n \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher) Inizia Impostazioni Altre opzioni @@ -236,4 +236,5 @@ µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato. Impossibile aprire l\'URL: nessun browser trovato. Non è stata trovata un\'applicazione per gestire la ricerca. + privilegi più ampi a µLauncher.
µLauncher utilizzerà questi privilegi solo per bloccare lo schermo. µLauncher non raccoglierà mai alcun dato. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]>
\ No newline at end of file From 8501e85f2dac33ec11e1de90f866de8963a4f33a Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Fri, 7 Feb 2025 13:36:03 +0000 Subject: [PATCH 13/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (220 of 220 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 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 228d0f4..0ec4a32 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -274,4 +274,6 @@ Toque no espaço para temporariamente desativar esta funcionalidade. Não foi possível abrir a URL: nenhum navegador encontrado. Nenhum app encontrado para efetuar a pesquisa. + Voltar + Botão Voltar / gesto de Voltar \ No newline at end of file From e6fca45d482cf9d6fb79a95b3c6b006f05a4e2ce Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Fri, 7 Feb 2025 13:35:02 +0000 Subject: [PATCH 14/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 20.0% (3 of 15 strings) Translation: jrpie-Launcher/metadata Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/pt_BR/ --- .../android/pt-BR/full_description.txt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index b3bfbce..e976080 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -1,23 +1,23 @@ -O µLauncher é uma tela inicial que permite abrir aplicativos através gestos de deslize e botões físicos. +O µLauncher é uma tela inicial que permite abrir apps através de gestos e botões físicos. O launcher é minimalista, eficiente e livre de distrações. -Sua tela inicial exibe apenas a data, hora e papel de parede. +A tela inicial mostra apenas a data, hora e papel de parede. -Ao usar Voltar ou deslize para cima (pode ser configurado depois) você abre a lista -com todos os aplicativos instalados, que podem ser encontrados rápido. +Ao usar botão Voltar ou gesto pra cima (pode ser redefinido depois) +você abre com facilidade e rapidez a lista com todos os apps instalados. -Esta é uma modificação do app Launcher -feita por Finn M Glas. +O app é uma modificação do Launcher +feito por Finn M Glas. Funcionalidades: * Você pode associar várias ações a 22 gestos diferentes. -* Também pode definir algumas das seguintes acções: - - Iniciar algum app +* Pode definir algumas das seguintes ações: + - Iniciar vários apps - Listar todos aplicativos - Listar apps favoritos - Aumentar / diminuir o volume - - Música: faixa anterior / seguinte + - Música: passar pra faixa anterior / seguinte - Bloquear a tela - Ligar a lanterna - Mostrar notificações / configurações rápidas -* Compatível com Perfil de trabalho, desta forma apps como Shelter podem ser usados. +* App é compatível com Perfil de trabalho e pode ser usado com apps tipo Shelter. From 15543b2b9c94b9cb5672f13d34d32fc1d8ca5eb8 Mon Sep 17 00:00:00 2001 From: Vossa Excelencia Date: Sun, 9 Feb 2025 15:23:17 +0000 Subject: [PATCH 15/15] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (220 of 220 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 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0ec4a32..fef6043 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -34,10 +34,10 @@ Para direita (em baixo) Para esquerda (em baixo) Para esquerda (no topo) - Para cima (Borda esquerda) - Para cima (Borda direita) - Para baixo (Borda esquerda) - Para baixo (Borda direita) + Para cima (borda esquerda) + Para cima (borda direita) + Para baixo (borda esquerda) + Para baixo (borda direita) Aumento de volume Diminuição de volume Toque duplo @@ -62,7 +62,7 @@ Mostrar Data Use formato de data localizado Inverter data e hora - Escolha um papel de parede + Escolha papel de parede Alterar papel de parede Exibição Manter a tela ligada @@ -121,11 +121,11 @@ O Launcher foi criado para ser minimalista, eficiente e livre de distrações. Ele é livre de pagamentos, anúncios e serviços de rastreamento. O app é de código aberto (licença MIT) e está disponível no GitHub! Não deixe de conferir o repositório! Uso - Sua tela inicial contém a data e hora local. Sem distração. - Você pode iniciar seus aplicativos com um toque único ou pressionando um botão. Escolha algumas ações no próximo slide. + Sua tela inicial contém a data e hora local. Sem distrações. + Você pode iniciar seus aplicativos com um gesto único ou apertando um botão. Escolha algumas ações no próximo slide. Configurar Selecionamos alguns aplicativos padrão para você. Se quiser, você pode alterá-los agora: - Você também pode alterar suas escolhas mais tarde. + Você pode alterar suas escolhas mais tarde. Vamos lá! Tá todo pronto para começar! Espero que isso seja de grande valor para você! - Finn (que criou o Launcher) \te Josia (que fez algumas melhorias e tb mantém o fork do μLauncher) Começar @@ -162,7 +162,7 @@ Usar o Serviço de acessibilidade Usar o Administrador do dispositivo Escolha um método de bloqueio - Escolha um método de bloqueio da tela + Escolha método de bloqueio da tela Configurações rápidas Essa funcionalidade requer o Android 6 ou mais recente. Nenhuma câmera com lanterna detectada.