diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index d14b126..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help improve this app -title: '[bug] ' -labels: bug -assignees: '' - ---- - -# Describe the bug - -<!-- A clear and concise description of what the bug is. --> - -# To Reproduce - -<!-- -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error ---> - -# Expected behavior - -<!-- A clear and concise description of what you expected to happen. --> - -# Screenshots -<!-- If applicable, add screenshots to help explain your problem. --> - -# Smartphone (please complete the following information) - - Device: <!-- e.g. Fairphone 5 --> - - Android Version: <!-- e.g. Marshmallow, 6.0 or API 23 --> - - µLauncher Version: <!-- e.g. j-0.0.11 or version code 25 --> - -# Additional info - -<!-- Add any other info or comments about the problem here. --> diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..fa112ae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,50 @@ +name: Bug report +description: Create a report to help improve this app +title: '[bug] ' +labels: bug +body: + - type: markdown + attributes: + value: | + Thank you for helping to improve µLauncher! + - type: textarea + id: bug + attributes: + label: Describe the Bug + description: What happened? + placeholder: A clear and concise description of what the bug is. + render: markdown + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: What did you expect to happen instead? + render: markdown + validations: + required: false + - type: textarea + id: reproduce + attributes: + label: To Reproduce + description: What steps are required to reproduce the bug? + render: markdown + placeholder: | + Steps to reproduce the behavior: + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: false + - type: textarea + id: device + attributes: + label: Your Device + description: | + What device are you using? Adding this information helps to reproduce the bug. + You can copy this from µLauncher > Settings > Meta > Report Bug. + render: markdown + validations: + required: false diff --git a/app/build.gradle b/app/build.gradle index 9bc7295..23273af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 36 - versionName "j-0.0.20" + versionCode 37 + versionName "0.0.21" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } 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 ebfc070..721caa2 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,7 @@ package de.jrpie.android.launcher import android.app.Activity import android.app.Service import android.app.role.RoleManager +import android.content.ActivityNotFoundException import android.content.ClipData import android.content.ClipboardManager import android.content.Context @@ -16,6 +17,7 @@ import android.os.UserHandle import android.os.UserManager import android.provider.Settings import android.util.Log +import android.widget.Toast import de.jrpie.android.launcher.actions.Action import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.apps.AppInfo @@ -83,14 +85,18 @@ fun getPrivateSpaceUser(context: Context): UserHandle? { 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 + launcherApps.getLauncherUserInfo(u)?.userType == UserManager.USER_TYPE_PROFILE_PRIVATE } } fun openInBrowser(url: String, context: Context) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) intent.putExtras(Bundle().apply { putBoolean("new_window", true) }) - context.startActivity(intent) + try { + context.startActivity(intent) + } catch (_: ActivityNotFoundException) { + Toast.makeText(context, R.string.toast_activity_not_found_browser, Toast.LENGTH_LONG).show() + } } fun openTutorial(context: Context) { 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 2bb3780..4b71a90 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 @@ -2,6 +2,7 @@ package de.jrpie.android.launcher.actions import android.app.AlertDialog import android.app.Service +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.pm.LauncherApps @@ -34,7 +35,11 @@ class AppAction(val app: AppInfo) : Action { context.packageManager.getLaunchIntentForPackage(packageName)?.let { it.addCategory(Intent.CATEGORY_LAUNCHER) - context.startActivity(it) + try { + context.startActivity(it) + } catch (_: ActivityNotFoundException) { + return false + } return true } 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 55f07a5..c52f951 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 @@ -1,11 +1,13 @@ package de.jrpie.android.launcher.ui.list.apps +import android.content.ActivityNotFoundException import android.content.Intent import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import de.jrpie.android.launcher.R import de.jrpie.android.launcher.apps.AppFilter @@ -91,7 +93,16 @@ class ListFragmentApps : Fragment(), UIObject { if (LauncherPreferences.functionality().searchWeb()) { val i = Intent(Intent.ACTION_WEB_SEARCH).putExtra("query", query) - activity?.startActivity(i) + try { + activity?.startActivity(i) + } catch (_: ActivityNotFoundException) { + Toast.makeText( + requireContext(), + R.string.toast_activity_not_found_search_web, + Toast.LENGTH_LONG + ).show() + } + } else { appsRecyclerAdapter.selectItem(0) } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e815940..e7c7546 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -76,10 +76,12 @@ - --> <string name="settings_launcher_section_appearance">Aussehen</string> + <string name="settings_clock_color">Farbe</string> <string name="settings_clock_time_visible">Zeit anzeigen</string> <string name="settings_clock_date_visible">Datum anzeigen</string> <string name="settings_clock_localized">Lokalisiertes Datumsformat verwenden</string> <string name="settings_clock_flip_date_time">Datum und Uhrzeit tauschen</string> + <string name="settings_theme_color_theme_item_dynamic">Dynamisch</string> <string name="settings_theme_text_shadow">Textschatten</string> <string name="settings_theme_background">Hintergrund (Alle Apps und Einstellungen)</string> <string name="settings_theme_background_item_solid">Einfarbig</string> @@ -103,6 +105,7 @@ <string name="settings_enabled_gestures_edge_swipe">Kantenaktionen</string> <string name="settings_enabled_gestures_edge_swipe_edge_width">Kantenbreite</string> <string name="settings_functionality_auto_launch">Suchergebnis starten</string> + <string name="settings_functionality_search_web_summary">Beim Durchsuchen der Apps Enter drücken um stattdessen im Internet zu suchen</string> <string name="settings_functionality_auto_keyboard">Tastatur automatisch öffnen</string> <string name="settings_launcher_sensitivity">Empfindlichkeit</string> <!-- @@ -123,6 +126,7 @@ <string name="settings_meta_report_bug">Einen Fehler melden</string> <string name="settings_meta_discord">Unserem Discord beitreten</string> <string name="settings_meta_contact">Entwickler kontaktieren</string> + <string name="dialog_report_bug_create_report">Report erstellen</string> <string name="settings_meta_fork_contact">Entwickler des Fork kontaktieren</string> <string name="settings_meta_join_chat">Dem µLauncher-Chat beitreten</string> <string name="settings_meta_privacy">Datenschutzerklärung</string> @@ -143,9 +147,11 @@ <string name="list_removed">Die App wurde entfernt</string> <string name="list_not_removed">Die App konnte nicht entfernt werden</string> <string name="list_apps_search_hint">Anwendungen suchen</string> + <string name="list_apps_search_hint_no_auto_launch">Suchen (kein Schnellstart)</string> <string name="list_other_settings">µLauncher Einstellungen</string> <string name="list_other_list">Alle Anwendungen</string> <string name="list_other_list_favorites">Favoriten</string> + <string name="list_other_toggle_private_space_lock">Privaten Bereich (ent)sperren</string> <string name="list_other_volume_up">Musik: Lauter</string> <string name="list_other_volume_down">Musik: Leiser</string> <string name="list_other_track_next">Musik: Weiter</string> @@ -186,6 +192,7 @@ <string name="list_app_hidden_add">Verstecken</string> <string name="list_other_lock_screen">Bildschirm sperren</string> <string name="alert_requires_android_m">Diese Funktionalität benötigt Android 6 oder neuer.</string> + <string name="alert_requires_android_v">Diese Funktionalität benötigt Android 15 oder neuer.</string> <string name="snackbar_app_hidden">Die App wurde versteckt. Sie kann in den Einstellungen wieder sichtbar gemacht werden.</string> <string name="toast_device_admin_not_enabled">µLauncher muss Geräteadministrator sein, um den Bildschirm sperren zu dürfen.</string> <string name="device_admin_explanation">Dies ist erforderlich, damit µLauncher den Bildschirm spreen kann.</string> @@ -195,6 +202,7 @@ <string name="settings_actions_lock_method">Methode zum Sperren des Bildschirms wählen</string> <string name="dialog_rename_ok">Ok</string> <string name="dialog_rename_title">%1$s umbenennen</string> + <string name="toast_private_space_default_home_screen">µLauncher muss als Standardlauncher eingerichtet sein um auf den privaten Bereich zugreifen zu können.</string> <string name="toast_lock_screen_not_supported">Fehler: Auf diesem Gerät kann der Bildschirm nicht mittels Bedienungshilfe gesperrt werden. Bitte stattdessen Geräteadministrator verwenden.</string> <string name="accessibility_service_name">µLauncher - Bildschirm sperren</string> <string name="alert_lock_screen_failed">Fehler: Bildschirm konnte nicht gesperrt werden.</string> @@ -236,6 +244,7 @@ <string name="settings_theme_background_item_transparent">Transparent</string> <string name="settings_theme_background_item_dim">Dimmen</string> <string name="settings_theme_background_item_blur">Weichzeichnen</string> + <string name="settings_apps_hide_paused_apps">Pausierte Apps verstecken</string> <string name="settings_list_layout">Layout der Appliste</string> <string name="settings_list_layout_item_default">Standard</string> <string name="settings_list_layout_item_text">Text</string> @@ -243,5 +252,29 @@ <string name="settings_theme_font_item_sans_serif">Serifenlos</string> <string name="settings_theme_font_item_serif">Serif</string> <string name="settings_theme_font_item_monospace">Monospace</string> + <string name="dialog_consent_accessibility_ok">Bedienungshilfe aktivieren</string> <string name="dialog_cancel">Abbrechen</string> + <string name="settings_functionality_auto_launch_summary">Leertaste drücken um diese Funktion zu unterdrücken.</string> + <string name="settings_functionality_search_web">Im Internet suchen</string> + <string name="dialog_report_bug_title">Bug melden</string> + <string name="dialog_report_bug_button_clipboard">In Zwischenablage kopieren</string> + <string name="toast_private_space_locked">Privater Bereich gesperrt</string> + <string name="toast_private_space_unlocked">Privater Bereich entsperrt</string> + <string name="toast_private_space_not_available">Der private Bereich ist nicht verfügbar</string> + <string name="dialog_select_color_red">Rot</string> + <string name="dialog_select_color_alpha">Transparenz</string> + <string name="dialog_select_color_blue">Blau</string> + <string name="dialog_select_color_green">Grün</string> + <string name="dialog_select_color_ok">Ok</string> + <string name="dialog_select_color_color_hex">Farbe</string> + <string name="dialog_choose_color_title">Farbe wählen</string> + <string name="settings_meta_licenses">Open Source Lizenzen</string> + <string name="legal_info_title">Open Source Lizenzen</string> + <string name="toast_activity_not_found_search_web">Keine App gefunden um die Suche durchzuführen.</string> + <string name="toast_activity_not_found_browser">URL kann nicht geöffnet werden: kein Browser gefunden.</string> + <string name="dialog_consent_accessibility_privileges">Mir ist bewusst, dass µLauncher hierdurch weitreichende Berechtigungen erhält.</string> + <string name="dialog_consent_accessibility_other_options">Mir ist bewusst, dass Alternativen existieren (Geräteadministrator oder der Power-Button).</string> + <string name="dialog_consent_accessibility_consent">Ich willige ein, dass µLauncher eine Bedienungshilfe für Zwecke verwendet, die nicht unter Barrierefreiheit fallen.</string> + <string name="dialog_consent_accessibility_data_collection">Ich willige ein, dass µLauncher keine Daten sammelt.</string> + <string name="dialog_consent_accessibility_title">Bedienungshilfe aktivieren</string> </resources> \ 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 1f05552..6a404eb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -258,4 +258,17 @@ <string name="list_apps_search_hint_no_auto_launch">Busca (sem inicialização automática)</string> <string name="settings_meta_licenses">Licenças de código aberto</string> <string name="legal_info_title">Licenças de código aberto</string> + <string name="settings_apps_hide_paused_apps">Ocultar apps pausados</string> + <string name="list_other_toggle_private_space_lock">Ativar o Espaço privado</string> + <string name="alert_requires_android_v">Essa funcionalidade requer o Android 15.0 ou mais recente.</string> + <string name="toast_private_space_locked">Espaço privado trancado</string> + <string name="toast_private_space_unlocked">Espaço privado liberado</string> + <string name="toast_private_space_not_available">Espaço privado indisponível</string> + <string name="toast_private_space_default_home_screen">O µLauncher precisa ser definido como a tela inicial padrão para poder usar Espaço privado.</string> + <string name="dialog_report_bug_button_clipboard">Copiar para memória</string> + <string name="dialog_report_bug_security_info">Não relate vulnerabilidades de segurança publicamente no GitHub, use o seguinte:</string> + <string name="dialog_report_bug_button_security">Relatar vulnerabilidade de segurança</string> + <string name="dialog_report_bug_create_report">Criar relatório</string> + <string name="dialog_report_bug_title">Relatar um bug</string> + <string name="dialog_report_bug_info">Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug:</string> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0910170..b12eb4c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -136,6 +136,8 @@ <string name="settings_enabled_gestures_edge_swipe_summary">Swipe at the edge of the screen</string> <string name="settings_enabled_gestures_edge_swipe_edge_width">Edge width</string> <string name="settings_functionality_auto_launch">Launch search results</string> + <string name="settings_functionality_auto_launch_summary">Press space to disable this feature temporarily.</string> + <string name="settings_functionality_search_web">Search the web</string> <string name="settings_functionality_search_web_summary">Press return while searching the app list to launch a web search.</string> <string name="settings_functionality_auto_keyboard">Start keyboard for search</string> @@ -253,8 +255,8 @@ <string name="settings">Settings</string> <string name="ic_menu_alt">More options</string> <string name="alert_cant_expand_status_bar_panel">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.</string> - <string name="alert_requires_android_m">This functionality requires Android 6.0 or later.</string> - <string name="alert_requires_android_v">This functionality requires Android 15.0 or later.</string> + <string name="alert_requires_android_m">This functionality requires Android 6 or later.</string> + <string name="alert_requires_android_v">This functionality requires Android 15 or later.</string> <string name="snackbar_app_hidden">App hidden. You can make it visible again in settings.</string> <string name="undo">Undo</string> <string name="list_other_expand_settings_panel">Quick Settings</string> @@ -328,5 +330,7 @@ <string name="dialog_cancel">Cancel</string> <string name="settings_meta_licenses">Open Source Licenses</string> <string name="legal_info_title">Open Source Licenses</string> + <string name="toast_activity_not_found_search_web">No app found to handle search.</string> + <string name="toast_activity_not_found_browser">Can\'t open URL: no browser found.</string> </resources> diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 57e50df..314f85f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -92,7 +92,8 @@ <SwitchPreference android:key="@string/settings_functionality_search_auto_launch_key" android:defaultValue="true" - android:title="@string/settings_functionality_auto_launch" /> + android:title="@string/settings_functionality_auto_launch" + android:summary="@string/settings_functionality_auto_launch_summary" /> <SwitchPreference android:key="@string/settings_functionality_search_web_key" android:title="@string/settings_functionality_search_web" diff --git a/fastlane/metadata/android/en-US/changelogs/37.txt b/fastlane/metadata/android/en-US/changelogs/37.txt new file mode 100644 index 0000000..2c17814 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/37.txt @@ -0,0 +1,8 @@ +* basic support for private space (Android 15) +* reintroduced light theme +* improved Portuguese translation (thank you, "Vossa Excelencia"!) +* improved German translation +* added version name to settings +* dialog for bug reports +* improved clock performance +* fixed some bugs