diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt b/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt index 2d03061..ddef92a 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/Action.kt @@ -21,6 +21,9 @@ sealed interface Action { fun getIcon(context: Context): Drawable? fun isAvailable(context: Context): Boolean + // Can the action be used to reach µLauncher settings? + fun canReachSettings(): Boolean + fun bindToGesture(prefEditor: Editor, id: String) { prefEditor.putString(id, Json.encodeToString(this)) @@ -50,7 +53,10 @@ sealed interface Action { .map { Pair(it, Json.decodeFromString(it)) } .firstOrNull { it.second.isAvailable(context) } ?.apply { - boundActions.add(first) + // allow to bind CHOOSE to multiple gestures + if (second != LauncherAction.CHOOSE) { + boundActions.add(first) + } second.bindToGesture(editor, gesture.id) } } diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/AppAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/AppAction.kt index 4b71a90..90145aa 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/AppAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/AppAction.kt @@ -74,4 +74,8 @@ class AppAction(val app: AppInfo) : Action { // check if app is installed return DetailedAppInfo.fromAppInfo(app, context) != null } + + override fun canReachSettings(): Boolean { + return false + } } \ 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 e7358ba..dba314d 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 @@ -168,6 +168,12 @@ enum class Gesture( R.string.settings_gesture_description_double_right, R.array.default_double_right, R.anim.left_right + ), + BACK( + "action.back", + R.string.settings_gesture_back, + R.string.settings_gesture_description_back, + R.array.default_up ); enum class Edge { 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 03f4b11..ac6958b 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 @@ -13,6 +13,7 @@ import android.os.UserManager import android.provider.Settings import android.view.KeyEvent import android.widget.Toast +import androidx.appcompat.widget.AppCompatDrawableManager import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.apps.AppFilter @@ -40,25 +41,29 @@ enum class LauncherAction( val label: Int, val icon: Int, val launch: (Context) -> Unit, - val available: (Context) -> Boolean = { true } + private val canReachSettings: Boolean = false, + val available: (Context) -> Boolean = { true }, ) : Action { SETTINGS( "settings", R.string.list_other_settings, R.drawable.baseline_settings_24, - ::openSettings + ::openSettings, + true ), CHOOSE( "choose", R.string.list_other_list, R.drawable.baseline_menu_24, - ::openAppsList + ::openAppsList, + true ), CHOOSE_FROM_FAVORITES( "choose_from_favorites", R.string.list_other_list_favorites, R.drawable.baseline_favorite_24, - { context -> openAppsList(context, true) } + { context -> openAppsList(context, true) }, + true ), TOGGLE_PRIVATE_SPACE_LOCK( "toggle_private_space_lock", @@ -127,7 +132,11 @@ enum class LauncherAction( } override fun isAvailable(context: Context): Boolean { - return true + return this.available(context) + } + + override fun canReachSettings(): Boolean { + return this.canReachSettings } companion object { diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt index bb59948..9460125 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt @@ -7,6 +7,7 @@ import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.apps.AppInfo import de.jrpie.android.launcher.apps.DetailedAppInfo import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1 +import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2 import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersionUnknown import de.jrpie.android.launcher.ui.HomeActivity @@ -14,7 +15,7 @@ import de.jrpie.android.launcher.ui.HomeActivity * Increase when breaking changes are introduced and write an appropriate case in * `migratePreferencesToNewVersion` */ -const val PREFERENCE_VERSION = 2 +const val PREFERENCE_VERSION = 3 const val UNKNOWN_PREFERENCE_VERSION = -1 private const val TAG = "Launcher - Preferences" @@ -32,13 +33,16 @@ fun migratePreferencesToNewVersion(context: Context) { UNKNOWN_PREFERENCE_VERSION -> { /* still using the old preferences file */ migratePreferencesFromVersionUnknown(context) - - Log.i(TAG, "migration of preferences complete.") + Log.i(TAG, "migration of preferences complete (${UNKNOWN_PREFERENCE_VERSION} -> ${PREFERENCE_VERSION}).") } 1 -> { migratePreferencesFromVersion1() - Log.i(TAG, "migration of preferences complete.") + Log.i(TAG, "migration of preferences complete (1 -> ${PREFERENCE_VERSION}).") + } + 2 -> { + migratePreferencesFromVersion2() + Log.i(TAG, "migration of preferences complete (2 -> ${PREFERENCE_VERSION}).") } else -> { 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 66723ad..d617127 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 @@ -117,11 +117,12 @@ private fun migrateAction(key: String) { * (see [PREFERENCE_VERSION]) */ fun migratePreferencesFromVersion1() { - assert(PREFERENCE_VERSION == 2) assert(LauncherPreferences.internal().versionCode() == 1) Gesture.entries.forEach { g -> migrateAction(g.id) } migrateAppInfoSet(LauncherPreferences.apps().keys().hidden()) migrateAppInfoSet(LauncherPreferences.apps().keys().favorites()) migrateAppInfoStringMap(LauncherPreferences.apps().keys().customNames()) LauncherPreferences.internal().versionCode(2) + + migratePreferencesFromVersion2() } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version2.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version2.kt new file mode 100644 index 0000000..bcac3ae --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version2.kt @@ -0,0 +1,20 @@ +package de.jrpie.android.launcher.preferences.legacy + +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.preferences.LauncherPreferences +import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION + + +/** + * Migrate preferences from version 2 (used until version 0.0.21) to the current format + * (see [PREFERENCE_VERSION]) + */ +fun migratePreferencesFromVersion2() { + assert(PREFERENCE_VERSION == 3) + assert(LauncherPreferences.internal().versionCode() == 2) + // previously there was no setting for this + Action.setActionForGesture(Gesture.BACK, LauncherAction.CHOOSE) + LauncherPreferences.internal().versionCode(3) +} \ No newline at end of file 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 1ecbd74..c61ca95 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 @@ -50,7 +50,6 @@ private const val TAG = "Preferences ? -> 1" * and a different file was used. */ fun migratePreferencesFromVersionUnknown(context: Context) { - assert(PREFERENCE_VERSION == 2) Log.i( TAG, 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 1d5381d..42dc01b 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 @@ -9,6 +9,7 @@ import android.util.DisplayMetrics import android.view.GestureDetector import android.view.KeyEvent import android.view.MotionEvent +import android.view.View import android.view.ViewConfiguration import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity @@ -54,6 +55,10 @@ class HomeActivity : UIObject, AppCompatActivity(), ) { recreate() } + + if (prefKey?.startsWith("action.") == true) { + updateSettingsFallbackButtonVisibility() + } } private var edgeWidth = 0.15f @@ -80,6 +85,10 @@ class HomeActivity : UIObject, AppCompatActivity(), handleBack() } } + binding.buttonFallbackSettings.setOnClickListener { + LauncherAction.SETTINGS.invoke(this) + } + } @@ -96,6 +105,20 @@ class HomeActivity : UIObject, AppCompatActivity(), } + private fun updateSettingsFallbackButtonVisibility() { + // If µLauncher settings can not be reached from any action bound to an enabled gesture, + // show the fallback button. + binding.buttonFallbackSettings.visibility = if ( + !Gesture.entries.any { g -> + g.isEnabled() && Action.forGesture(g)?.canReachSettings() == true + } + ) { + View.VISIBLE + } else { + View.GONE + } + } + private fun initClock() { val locale = Locale.getDefault() val dateVisible = LauncherPreferences.clock().dateVisible() @@ -152,6 +175,7 @@ class HomeActivity : UIObject, AppCompatActivity(), edgeWidth = LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f initClock() + updateSettingsFallbackButtonVisibility() } override fun onDestroy() { @@ -299,7 +323,7 @@ class HomeActivity : UIObject, AppCompatActivity(), private fun handleBack() { - LauncherAction.CHOOSE.launch(this) + Gesture.BACK(this) } override fun isHomeScreen(): Boolean { diff --git a/app/src/main/res/layout/home.xml b/app/src/main/res/layout/home.xml index f59b211..ecefdea 100644 --- a/app/src/main/res/layout/home.xml +++ b/app/src/main/res/layout/home.xml @@ -34,4 +34,18 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index afc92da..320bfc6 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)\n \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,50 @@ 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. + 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 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 diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index 5ed9327..276651d 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -3,6 +3,12 @@ + + + {\"type\": \"action:launcher\", \"value\": \"choose\"} + + + {\"type\": \"action:launcher\", \"value\": \"choose\"} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b12eb4c..9c07ed6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,6 +25,8 @@ - Settings : Apps - --> + Back + Back button / back gesture Up Swipe up Double Up 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