From 04a2b4d248e849489c182a5b36cb01da35f81d6a Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 29 May 2025 15:48:41 +0200 Subject: [PATCH 1/4] merge #193 - codebase improvements Co-authored-by: Luke Wass Squashed commit of the following: commit 075b4a5353cedea531ec6ebefa60d92de82e8e21 Author: Josia Pietsch Date: Thu May 29 15:34:23 2025 +0200 some changes commit ced2e305315f10f3f5cf017478a4d49f0e64c72c Author: Luke Wass Date: Thu May 29 00:18:21 2025 -0500 remove unused imports/functions/variables, improve naming convention, remove unused widget context commit 956ad9795c5ecbaa86e4d4851d42043fc8155e70 Author: Luke Wass Date: Wed May 28 22:40:05 2025 -0500 add contentDescriptions, ignore unspeakable sections, minor code reorganization commit cb793860c03aa9ace55fd5aa3d23aa5903fa0ce4 Author: Luke Wass Date: Wed May 28 21:03:03 2025 -0500 remove empty method commit 893de14c79b7b1792c1b5b1298c19b9475956e6a Author: Luke Wass Date: Tue May 27 22:56:03 2025 -0500 Simplify constructors by removing unused init parameters; clean up handle list type declaration commit 39164d2e548b3f9a963fa78dcf643b789b081faf Author: Luke Wass Date: Tue May 27 22:54:16 2025 -0500 Refactor getAppWidgetProviders to use explicit lambda parameter names for clarity commit 8e53ef0ebee680bad098423705616da5849e015a Author: Luke Wass Date: Tue May 27 22:52:21 2025 -0500 improve naming convention commit 8c2a266c22bd13344e102d13ec21f925569fb7d5 Author: Luke Wass Date: Tue May 27 22:50:55 2025 -0500 remove unused resources commit be03af8ac665163c6335ed78e979ecaefaaa0864 Author: Luke Wass Date: Tue May 27 22:50:33 2025 -0500 fix table format --- .../de/jrpie/android/launcher/Application.kt | 2 +- .../android/launcher/actions/TorchManager.kt | 1 - .../launcher/actions/lock/LockMethod.kt | 1 - .../launcher/preferences/legacy/Version4.kt | 2 -- .../launcher/ui/PinShortcutActivity.kt | 5 ++- .../launcher/ui/TouchGestureDetector.kt | 5 +-- .../ui/list/apps/AppsRecyclerAdapter.kt | 5 --- .../launcher/ui/list/apps/ListFragmentApps.kt | 1 - .../tutorial/tabs/TutorialFragment5Finish.kt | 1 - .../ui/widgets/WidgetContainerView.kt | 2 +- .../manage/ManageWidgetPanelsActivity.kt | 1 - .../widgets/manage/ManageWidgetsActivity.kt | 3 -- .../ui/widgets/manage/WidgetManagerView.kt | 18 +++++----- .../ui/widgets/manage/WidgetOverlayView.kt | 22 ++++-------- .../jrpie/android/launcher/widgets/Widget.kt | 8 ++--- .../jrpie/android/launcher/widgets/Widgets.kt | 4 +-- .../layout/activity_manage_widget_panels.xml | 2 ++ .../res/layout/activity_manage_widgets.xml | 1 + .../main/res/layout/activity_pin_shortcut.xml | 1 + .../res/layout/activity_select_widget.xml | 1 + app/src/main/res/layout/list.xml | 8 +++-- app/src/main/res/layout/list_other_row.xml | 1 + app/src/main/res/layout/settings.xml | 35 ++++++++++--------- .../main/res/layout/settings_actions_row.xml | 1 + app/src/main/res/layout/tutorial.xml | 5 ++- app/src/main/res/values/colors.xml | 4 --- app/src/main/res/values/dimens.xml | 6 ---- app/src/main/res/values/strings.xml | 12 +++++++ docs/alternatives.md | 32 ++++++++--------- 29 files changed, 91 insertions(+), 99 deletions(-) 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 e0d1d00..ba47942 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Application.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Application.kt @@ -28,7 +28,7 @@ import kotlinx.coroutines.launch import kotlin.system.exitProcess -const val APP_WIDGET_HOST_ID = 42; +const val APP_WIDGET_HOST_ID = 42 class Application : android.app.Application() { diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt b/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt index 6768116..a2ea801 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/TorchManager.kt @@ -1,7 +1,6 @@ package de.jrpie.android.launcher.actions import android.content.Context -import android.hardware.camera2.CameraAccessException import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraManager import android.os.Build diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt index 93b4cbf..541510a 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/lock/LockMethod.kt @@ -6,7 +6,6 @@ import android.widget.Button import androidx.appcompat.app.AlertDialog import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R -import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService import de.jrpie.android.launcher.preferences.LauncherPreferences diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version4.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version4.kt index b13978b..fb353d5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version4.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/legacy/Version4.kt @@ -1,9 +1,7 @@ package de.jrpie.android.launcher.preferences.legacy import android.content.Context -import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.preferences.LauncherPreferences -import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION import de.jrpie.android.launcher.widgets.ClockWidget import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPosition diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt index 3dbdda8..70f737f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt @@ -1,7 +1,6 @@ package de.jrpie.android.launcher.ui import android.app.AlertDialog -import android.app.Service import android.content.Context import android.content.pm.LauncherApps import android.content.pm.LauncherApps.PinItemRequest @@ -45,7 +44,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { binding = ActivityPinShortcutBinding.inflate(layoutInflater) setContentView(binding.root) - val launcherApps = getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps + val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps val request = launcherApps.getPinItemRequest(intent) this.request = request @@ -56,7 +55,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { if (request.requestType == PinItemRequest.REQUEST_TYPE_APPWIDGET) { - // TODO + // TODO handle app widgets request.getAppWidgetProviderInfo(this) // startActivity() finish() diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt index 8e8ed4e..8264752 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt @@ -17,6 +17,7 @@ import kotlin.math.max import kotlin.math.min import kotlin.math.tan +@Suppress("PrivatePropertyName") class TouchGestureDetector( private val context: Context, var width: Int, @@ -34,13 +35,13 @@ class TouchGestureDetector( private val MIN_TRIANGLE_HEIGHT = 250 - private val longPressHandler = Handler(Looper.getMainLooper()) - private var systemGestureInsetTop = 100 private var systemGestureInsetBottom = 0 private var systemGestureInsetLeft = 0 private var systemGestureInsetRight = 0 + private val longPressHandler = Handler(Looper.getMainLooper()) + data class Vector(val x: Float, val y: Float) { fun absSquared(): Float { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt index 65278ce..784d6fa 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/apps/AppsRecyclerAdapter.kt @@ -237,9 +237,4 @@ class AppsRecyclerAdapter( appFilter.favoritesVisibility = v updateAppsList() } - - fun setHiddenAppsVisibility(v: AppFilter.Companion.AppSetVisibility) { - appFilter.hiddenVisibility = v - updateAppsList() - } } 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 a8e59ba..ed26729 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 @@ -96,7 +96,6 @@ class ListFragmentApps : Fragment(), UIObject { if (LauncherPreferences.functionality().searchAutoCloseKeyboard()) { addOnScrollListener(object : RecyclerView.OnScrollListener() { var totalDy: Int = 0 - var threshold = (resources.displayMetrics.density * 100).toInt() override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { totalDy += dy diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt index e15cef1..548c30b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/tutorial/tabs/TutorialFragment5Finish.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import de.jrpie.android.launcher.BuildConfig.VERSION_CODE import de.jrpie.android.launcher.databinding.Tutorial5FinishBinding import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.requestNotificationPermission diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/WidgetContainerView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/WidgetContainerView.kt index 5f8adf1..5eab32f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/WidgetContainerView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/WidgetContainerView.kt @@ -61,7 +61,7 @@ open class WidgetContainerView( it.value.y + it.value.height ).contains(position) == true }.any { - Widget.byId(context, it.key)?.allowInteraction == false + Widget.byId(it.key)?.allowInteraction == false } } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetPanelsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetPanelsActivity.kt index 89e1057..163777f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetPanelsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetPanelsActivity.kt @@ -9,7 +9,6 @@ import android.widget.EditText import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager -import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.R import de.jrpie.android.launcher.databinding.ActivityManageWidgetPanelsBinding import de.jrpie.android.launcher.preferences.LauncherPreferences diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt index 38bbb84..531cdc1 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/ManageWidgetsActivity.kt @@ -5,7 +5,6 @@ import android.appwidget.AppWidgetManager import android.content.Intent import android.content.SharedPreferences import android.content.res.Resources -import android.graphics.Rect import android.os.Bundle import android.util.Log import android.view.ViewGroup @@ -21,7 +20,6 @@ import de.jrpie.android.launcher.widgets.GRID_SIZE import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPosition import kotlin.math.max -import kotlin.math.min import kotlin.math.roundToInt @@ -132,7 +130,6 @@ class ManageWidgetsActivity : UIObject, Activity() { private fun selectWidget() { - val appWidgetHost = (application as Application).appWidgetHost startActivityForResult( Intent(this, SelectWidgetActivity::class.java).also { it.putExtra( diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetManagerView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetManagerView.kt index d1c84d0..3034aeb 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetManagerView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetManagerView.kt @@ -31,19 +31,19 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe WidgetContainerView(widgetPanelId, context, attrs) { constructor(context: Context, attrs: AttributeSet?) : this(WidgetPanel.HOME.id, context, attrs) - val TOUCH_SLOP: Int - val TOUCH_SLOP_SQUARE: Int - val LONG_PRESS_TIMEOUT: Long + val touchSlop: Int + val touchSlopSquare: Int + val longPressTimeout: Long private var overlayViewById = HashMap() init { val configuration = ViewConfiguration.get(context) - TOUCH_SLOP = configuration.scaledTouchSlop - TOUCH_SLOP_SQUARE = TOUCH_SLOP * TOUCH_SLOP + touchSlop = configuration.scaledTouchSlop + touchSlopSquare = touchSlop * touchSlop - LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout().toLong() + longPressTimeout = ViewConfiguration.getLongPressTimeout().toLong() } @@ -127,14 +127,14 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) endInteraction() } - }, LONG_PRESS_TIMEOUT) + }, longPressTimeout) } if (event.actionMasked == MotionEvent.ACTION_MOVE || event.actionMasked == MotionEvent.ACTION_UP ) { val distanceX = event.x - (currentGestureStart?.x ?: return true) val distanceY = event.y - (currentGestureStart?.y ?: return true) - if (distanceX * distanceX + distanceY * distanceY > TOUCH_SLOP_SQUARE) { + if (distanceX * distanceX + distanceY * distanceY > touchSlopSquare) { longPressHandler.removeCallbacksAndMessages(null) } val view = selectedWidgetOverlayView ?: return true @@ -162,7 +162,7 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe if (event.actionMasked == MotionEvent.ACTION_UP) { longPressHandler.removeCallbacksAndMessages(null) val id = selectedWidgetOverlayView?.widgetId ?: return true - val widget = Widget.byId(context, id) ?: return true + val widget = Widget.byId(id) ?: return true widget.position = newPosition endInteraction() updateWidget(widget) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt index 61006b8..0363069 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/manage/WidgetOverlayView.kt @@ -54,26 +54,18 @@ class WidgetOverlayView : ViewGroup { var widgetId: Int = -1 set(newId) { field = newId - preview = Widget.byId(context, widgetId)?.getPreview(context) + preview = Widget.byId(widgetId)?.getPreview(context) } - constructor(context: Context) : super(context) { - init(null, 0) - } + constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(attrs, 0) - } + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( context, attrs, defStyle - ) { - init(attrs, defStyle) - } - - private fun init(attrs: AttributeSet?, defStyle: Int) { } + ) override fun onDraw(canvas: Canvas) { super.onDraw(canvas) @@ -101,13 +93,13 @@ class WidgetOverlayView : ViewGroup { } fun showPopupMenu() { - val widget = Widget.byId(context, widgetId)?: return + val widget = Widget.byId(widgetId)?: return val menu = PopupMenu(context, popupAnchor) menu.menu.let { it.add( context.getString(R.string.widget_menu_remove) ).setOnMenuItemClickListener { _ -> - Widget.byId(context, widgetId)?.delete(context) + Widget.byId(widgetId)?.delete(context) return@setOnMenuItemClickListener true } it.add( @@ -126,7 +118,7 @@ class WidgetOverlayView : ViewGroup { } fun getHandles(): List { - return listOf( + return listOf( Handle(WidgetManagerView.EditMode.TOP, Rect(HANDLE_EDGE_SIZE, 0, width - HANDLE_EDGE_SIZE, HANDLE_SIZE)), Handle(WidgetManagerView.EditMode.BOTTOM, diff --git a/app/src/main/java/de/jrpie/android/launcher/widgets/Widget.kt b/app/src/main/java/de/jrpie/android/launcher/widgets/Widget.kt index fd96f14..73f5d81 100644 --- a/app/src/main/java/de/jrpie/android/launcher/widgets/Widget.kt +++ b/app/src/main/java/de/jrpie/android/launcher/widgets/Widget.kt @@ -38,10 +38,6 @@ sealed class Widget { ) } - fun getPanel(): WidgetPanel? { - return WidgetPanel.byId(panelId) - } - override fun hashCode(): Int { return id } @@ -57,9 +53,9 @@ sealed class Widget { fun deserialize(serialized: String): Widget { return Json.decodeFromString(serialized) } - fun byId(context: Context, id: Int): Widget? { + fun byId(id: Int): Widget? { // TODO: do some caching - return LauncherPreferences.widgets().widgets().firstOrNull() { + return LauncherPreferences.widgets().widgets().firstOrNull { it.id == id } } diff --git a/app/src/main/java/de/jrpie/android/launcher/widgets/Widgets.kt b/app/src/main/java/de/jrpie/android/launcher/widgets/Widgets.kt index 37a77a7..864e5d3 100644 --- a/app/src/main/java/de/jrpie/android/launcher/widgets/Widgets.kt +++ b/app/src/main/java/de/jrpie/android/launcher/widgets/Widgets.kt @@ -55,8 +55,8 @@ fun getAppWidgetProviders( context: Context ): List { (context.getSystemService(Service.USER_SERVICE) as UserManager).userProfiles } list.addAll( - profiles.map { - appWidgetManager.getInstalledProvidersForProfile(it) + profiles.map { profile -> + appWidgetManager.getInstalledProvidersForProfile(profile) .map { LauncherAppWidgetProvider(it) } }.flatten() ) diff --git a/app/src/main/res/layout/activity_manage_widget_panels.xml b/app/src/main/res/layout/activity_manage_widget_panels.xml index 60413a3..f84f42f 100644 --- a/app/src/main/res/layout/activity_manage_widget_panels.xml +++ b/app/src/main/res/layout/activity_manage_widget_panels.xml @@ -40,6 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" + android:contentDescription="@string/content_description_close" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" @@ -64,6 +65,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" + android:contentDescription="@string/content_description_add_widget_panel" android:src="@drawable/baseline_add_24" app:layout_anchor="@+id/manage_widget_panels_recycler" app:layout_anchorGravity="end|bottom" diff --git a/app/src/main/res/layout/activity_manage_widgets.xml b/app/src/main/res/layout/activity_manage_widgets.xml index 66404ee..4e63ec9 100644 --- a/app/src/main/res/layout/activity_manage_widgets.xml +++ b/app/src/main/res/layout/activity_manage_widgets.xml @@ -20,6 +20,7 @@ android:layout_height="wrap_content" android:layout_margin="16dp" android:clickable="true" + android:contentDescription="@string/content_description_add_widget" android:focusable="true" android:src="@drawable/baseline_add_24" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/activity_pin_shortcut.xml b/app/src/main/res/layout/activity_pin_shortcut.xml index 2519374..da724e7 100644 --- a/app/src/main/res/layout/activity_pin_shortcut.xml +++ b/app/src/main/res/layout/activity_pin_shortcut.xml @@ -44,6 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" + android:contentDescription="@string/content_description_close" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" diff --git a/app/src/main/res/layout/activity_select_widget.xml b/app/src/main/res/layout/activity_select_widget.xml index 82db94d..14296bd 100644 --- a/app/src/main/res/layout/activity_select_widget.xml +++ b/app/src/main/res/layout/activity_select_widget.xml @@ -45,6 +45,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" + android:contentDescription="@string/content_description_close" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" diff --git a/app/src/main/res/layout/list.xml b/app/src/main/res/layout/list.xml index 8a3b5d9..958638a 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -62,6 +62,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" + android:contentDescription="@string/content_description_close" android:gravity="center" android:includeFontPadding="true" android:paddingLeft="16sp" @@ -72,6 +73,7 @@ app:layout_constraintTop_toTopOf="parent" /> + custom:tabTextColor="?attr/android:textColor" + tools:ignore="SpeakableTextPresentCheck" /> @@ -110,6 +113,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/list_appbar" app:layout_constraintVertical_bias="0.0" - custom:layout_behavior="@string/appbar_scrolling_view_behavior" /> + custom:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:ignore="SpeakableTextPresentCheck" /> \ No newline at end of file diff --git a/app/src/main/res/layout/list_other_row.xml b/app/src/main/res/layout/list_other_row.xml index 530cc9e..78d92ae 100644 --- a/app/src/main/res/layout/list_other_row.xml +++ b/app/src/main/res/layout/list_other_row.xml @@ -11,6 +11,7 @@ android:id="@+id/list_other_row_icon" android:layout_width="35sp" android:layout_height="35sp" + android:contentDescription="@null" android:gravity="center" android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/settings.xml b/app/src/main/res/layout/settings.xml index 987e293..8ce96c4 100644 --- a/app/src/main/res/layout/settings.xml +++ b/app/src/main/res/layout/settings.xml @@ -20,6 +20,22 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + - - + app:tabTextColor="?attr/android:textColor" + tools:ignore="SpeakableTextPresentCheck" /> diff --git a/app/src/main/res/layout/settings_actions_row.xml b/app/src/main/res/layout/settings_actions_row.xml index a60a5a4..eb3339c 100644 --- a/app/src/main/res/layout/settings_actions_row.xml +++ b/app/src/main/res/layout/settings_actions_row.xml @@ -68,6 +68,7 @@ android:id="@+id/settings_actions_row_remove" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:contentDescription="@string/content_description_settings_actions_row_button_remove" android:padding="8sp" android:src="@drawable/baseline_close_24" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/tutorial.xml b/app/src/main/res/layout/tutorial.xml index 5520aa1..c304165 100644 --- a/app/src/main/res/layout/tutorial.xml +++ b/app/src/main/res/layout/tutorial.xml @@ -26,6 +26,7 @@ android:id="@+id/tutorial_button_back" android:layout_width="50dp" android:layout_height="50dp" + android:contentDescription="@string/content_description_navigate_back" android:gravity="center" android:alpha="0.5" android:src="@drawable/baseline_navigate_before_24" @@ -43,12 +44,14 @@ app:layout_constraintStart_toEndOf="@+id/tutorial_button_back" app:tabBackground="@drawable/tutorial_tab_selector" app:tabGravity="center" - app:tabIndicatorHeight="0dp" /> + app:tabIndicatorHeight="0dp" + tools:ignore="SpeakableTextPresentCheck" /> #fff #9999ff #000 - #FF29B6F6 - #FF039BE5 - #FFBDBDBD - #FF757575 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index bdf620a..0d109bc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,11 +1,5 @@ - 16dp - 16dp 16dp - 16dp - 8dp - 40dip - 48dip diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index baf8fea..6fb9d61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -444,4 +444,16 @@ Send Email Crashes and Debug Information Documentation + + Add widget + Add widget panel + Close + Navigate back + Navigate next + Lock + Remove binding diff --git a/docs/alternatives.md b/docs/alternatives.md index c648ce4..0527b0a 100644 --- a/docs/alternatives.md +++ b/docs/alternatives.md @@ -409,22 +409,22 @@ Similar to OLauncher? :x: = Unsupported :warning: = Buggy/Broken; check this launcher's notes above -| Launcher | Search | Search history | Customizable gestures | Folders | Tags | Rename apps | Widgets | Private space | Work profile | Pinned shortcuts | Icon packs | Material You | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| [µLauncher](#µLauncher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Fossify](#Fossify) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :x: | :white_check_mark: | :x: | :white_check_mark: | -| [Lawnchair](#Lawnchair) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :grey_question: | :x: | :white_check_mark: | :white_check_mark: | -| [Rootless Pixel Launcher](#Rootless-Pixel-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :warning: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [KISS Launcher](#KISS-Launcher) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | -| [Lunar Launcher](#Lunar-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :x: | :white_check_mark: | :x: | :x: | -| [OLauncher](#OLauncher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :grey_question: | :x: | :grey_question: | -| [TinyBit Launcher](#TinyBit-Launcher) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [YAM Launcher](#YAM-Launcher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Ion Launcher](#Ion-Launcher) | :warning: | :white_check_mark: | :x: | :warning: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Pie Launcher](#Pie-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [folder launcher](#folder-launcher) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :x: | :white_check_mark: | :x: | :x: | -| [Discreet Launcher](#Discreet-Launcher) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Aster Launcher](#Aster-Launcher) | :warning: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| Launcher | Search | Search history | Customizable gestures | Folders | Tags | Rename apps | Widgets | Private space | Work profile | Pinned shortcuts | Icon packs | Material You | +|------------------------------------------------------|--------------------|--------------------|-----------------------|--------------------|--------------------|--------------------|--------------------|--------------------|--------------------|--------------------|--------------------|--------------------| +| [µLauncher](#µLauncher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Fossify](#Fossify) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :x: | :white_check_mark: | :x: | :white_check_mark: | +| [Lawnchair](#Lawnchair) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :grey_question: | :x: | :white_check_mark: | :white_check_mark: | +| [Rootless Pixel Launcher](#Rootless-Pixel-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :warning: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [KISS Launcher](#KISS-Launcher) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | +| [Lunar Launcher](#Lunar-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :x: | :white_check_mark: | :x: | :x: | +| [OLauncher](#OLauncher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :grey_question: | :x: | :grey_question: | +| [TinyBit Launcher](#TinyBit-Launcher) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [YAM Launcher](#YAM-Launcher) | :white_check_mark: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Ion Launcher](#Ion-Launcher) | :warning: | :white_check_mark: | :x: | :warning: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Pie Launcher](#Pie-Launcher) | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [folder launcher](#folder-launcher) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :grey_question: | :x: | :white_check_mark: | :x: | :x: | +| [Discreet Launcher](#Discreet-Launcher) | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Aster Launcher](#Aster-Launcher) | :warning: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :x: | + - Additional gestures: - Back - - V,Λ,<,> + - V, Λ, <, > - Edge gestures: There is a setting to allow distinguishing swiping at the edges of the screen from swiping in the center. - Compatible with [work profile](https://www.android.com/enterprise/work-profile/), so apps like [Shelter](https://gitea.angry.im/PeterCxy/Shelter) can be used. @@ -35,21 +35,21 @@ The decision to create a hard fork was made two years later.--> - This app uses the system wallpaper instead of a custom solution. - The font has been changed to [Hack][hack-font], other fonts can be selected. - Font Awesome Icons were replaced by Material icons. -- The gear button on the home screen was removed. A smaller button is show at the top right when necessary. +- The gear button on the home screen was removed. A smaller button is shown at the top right when necessary. ## Search -- The search algorithm was modified to prefer matches at the beginning of the app name, i.e. when searching for `"te"`, `"termux"` is sorted before `"notes"`. +- The search algorithm was modified to prefer matches at the beginning of the app name, i.e., when searching for `"te"`, `"termux"` is sorted before `"notes"`. - The search bar was moved to the bottom of the screen. ## Technical - Improved gesture detection. -- Different apps set as default. +- Different apps are set as the defaults. - Package name was changed to `de.jrpie.android.launcher` to avoid clashing with the original app. -- Dropped support for API < 21 (i.e. pre Lollypop) -- Fixed some bugs -- Some refactoring +- Dropped support for API < 21 (i.e., pre Lollypop). +- Fixed some bugs. +- Some refactoring. The complete list of changes can be viewed [here](https://github.com/jrpie/launcher/compare/340ee731...master). diff --git a/docs/contributing.md b/docs/contributing.md index f74bcca..0c12d1c 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -8,9 +8,9 @@ There are several ways to contribute to this app: * You can add or improve [translations][toolate].
translation status -* If you found a bug or have an idea for a new feature you can [join the chat][chat] or open an [issue][issues]. +* If you found a bug or have an idea for a new feature, you can [join the chat][chat] or open an [issue][issues]. - > Please note that I work on this project in my free time. Thus I might not respond immediately and not all ideas will be implemented. + > Please note that I work on this project in my free time. Thus, I might not respond immediately, and not all ideas will be implemented. * You can implement a new feature yourself: - Create a [fork][fork] of this repository. @@ -18,7 +18,7 @@ There are several ways to contribute to this app: - Open a new pull request. -See [here](/docs/build) for instructions how to build this project. +See [here](/docs/build) for instructions on how to build this project. The [CI pipeline](https://github.com/jrpie/Launcher/actions) automatically creates debug builds. diff --git a/docs/settings.md b/docs/settings.md index 3a46a7b..32c0fde 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -7,14 +7,14 @@ Tweaks and customizations can be made from within the settings page. The settings can be opened by binding the Settings action to a gesture (this is especially useful when configuring μLauncher for the first time) or from the settings icon in the app drawer.[^1] -[^1]: i.e. the 'All Apps', 'Favorite Apps' and 'Private Space' views. +[^1]: i.e., the 'All Apps', 'Favorite Apps', and 'Private Space' views. ## Appearance ### Choose a wallpaper -This triggers Android's mechanism to change the wallpaper using a photos app, file explorer, or native wallpaper setting app. -µLauncher uses the system-wide wallpaper, i.e. this change also affects other launchers. +This triggers Android's mechanism to change the wallpaper using a photo app, file explorer, or native wallpaper setting app. +µLauncher uses the system-wide wallpaper, i.e., this change also affects other launchers. ### Font (in-app font) @@ -28,7 +28,7 @@ Set the font used within the app settings. This setting does not affect the date **type:** `toggle` -### Background (app list and setting) +### Background (app list and settings) Defines which background should be used in app drawers, settings, etc. to increase legibility. @@ -37,7 +37,7 @@ to increase legibility. * `Blur` tries to blur the wallpaper. This is not possible on all devices. Some older devices don't support the operation. Also blur can be temporarily unavailable when the device is in power saving mode. In these case, `Dim` is used as a fallback. * `Solid` sets the background to a solid color (depending on the color theme). For the light theme only this option is available. -On the home screen and on widget panels the wallpaper is always shown unmodified. +On the home screen and widget panels, the wallpaper is always shown unmodified. **type:** `dropdown` @@ -51,7 +51,7 @@ Remove coloring from all app icons. Can help decrease visual stimulus when enabl ## Date & Time -These settings effect the clock shown on the home screen (or on widget panels). +These settings affect the clock shown on the home screen (or on widget panels). If the clock is removed, the settings are not used. ### Font (home screen) @@ -66,12 +66,12 @@ Set the home screen font for date and time. This setting does not affect the fon Set the color for the home screen date and time. -Accepts an 6 digit RGB or or 8 digit ARGB color code characters.[^2] -Note that on Android the ARGB color format is used, i.e. the alpha component is specified first. +Accepts a 6-digit RGB or 8-digit ARGB color code characters.[^2] +Note that on Android, the ARGB color format is used, i.e., the alpha component is specified first. This differs from the more common RGBA, which is used in web development. -[^2]: More precisely, everything that is vaild input for [parseColor](https://developer.android.com/reference/android/graphics/Color#parseColor(java.lang.String)) can be used. +[^2]: More precisely, everything that is valid input for [parseColor](https://developer.android.com/reference/android/graphics/Color#parseColor(java.lang.String)) can be used. **type:** `ARGB` @@ -110,7 +110,7 @@ Place the current time above the current date on the home screen. ### Launch search results -Launches any app that matches user keyboard input when no other apps match. +Launches any app that matches the user's keyboard input when no other apps match. As you type inside the app drawer, the app narrows down the list of apps shown based on the app title matching your text input. With the 'launch search results' setting, once only one matching app remains, it is launched immediately. @@ -156,7 +156,7 @@ Change how large a margin is used for detecting edge gestures. Shows the edge ma ### Choose method for locking the screen -There are two methods to lock the screen and unfortunately both have downsides. +There are two methods to lock the screen, and unfortunately, both have downsides. 1. **`Device Admin`** @@ -166,7 +166,7 @@ There are two methods to lock the screen and unfortunately both have downsides. - Requires excessive privileges. - μLauncher will use those privileges *only* for locking the screen. - - As a rule of thumb, it is [not recommended](https://android.stackexchange.com/questions/248171/is-it-safe-to-give-accessibility-permission-to-an-app) to grant access to accessibility services on a random app. Always review the [source code](https://github.com/jrpie/Launcher) before granting accessibility permissions so you familiarize yourself with what the code might do. + - As a rule of thumb, it is [not recommended](https://android.stackexchange.com/questions/248171/is-it-safe-to-give-accessibility-permission-to-an-app) to grant access to accessibility services to a random app. Always review the [source code](https://github.com/jrpie/Launcher) before granting accessibility permissions so you can familiarize yourself with what the code might do. - On some devices, the start-up PIN will no longer be used for encrypting data after activating an accessibility service. - This can be [reactivated](https://issuetracker.google.com/issues/37010136#comment36) afterwards. @@ -184,21 +184,21 @@ Open an app drawer containing only hidden apps. Remove certain apps from the app drawer if they are already accessible via a gesture. -Reduces redundancy and tidies up app drawer. +Reduces redundancy and tidies up the app drawer. **type:** `toggle` ### Hide paused apps Remove paused apps from the app drawer. -For example an app belonging to the work profile is paused when the work profile is inactive. +For example, an app belonging to the work profile is paused when the work profile is inactive. **type:** `toggle` ### Hide private space from app list -Remove private space from app drawer. -Private space apps can be accessed using a separate app drawer which can be opened with the Private Space action. +Remove private space from the app drawer. +Private space apps can be accessed using a separate app drawer, which can be opened with the Private Space action. **type:** `toggle` @@ -240,6 +240,6 @@ Remove the top status bar from the home screen. ### Hide navigation bar -Remove the navigation bar from the home screen. Enabling this setting may make it difficult to use the device if gestures are not setup properly. +Remove the navigation bar from the home screen. Enabling this setting may make it difficult to use the device if gestures are not set up properly. **type:** `toggle` diff --git a/docs/widgets.md b/docs/widgets.md index acbdf05..15ac7bb 100644 --- a/docs/widgets.md +++ b/docs/widgets.md @@ -7,7 +7,7 @@ μLauncher allows to add [app widgets](https://developer.android.com/develop/ui/views/appwidgets/overview) to the home screen and to widget panels. -Widgets can be added, moved, removed and configured in `Settings > Manage Widgets`. +Widgets can be added, moved, removed, and configured in `Settings > Manage Widgets`. It is configurable whether or not interaction with a widget should be enabled. @@ -17,7 +17,7 @@ However, μLauncher [gestures](/docs/actions-and-gestures/) can not be execute * If interaction is disabled, the widget does not respond to any touch events. This is recommended when using a widget only to display information. -μLauncher's clock behaves similar as an app widget and can be managed in the same way.[^1] +μLauncher's clock behaves similarly to an app widget and can be managed in the same way.[^1] [^1]: However, it is technically not an app widget and cannot be used with other launchers. From 33dd3ef3c278523e3d373474788f2c0f35ea83a9 Mon Sep 17 00:00:00 2001 From: "Too Late (bot)" Date: Fri, 30 May 2025 01:18:01 +0800 Subject: [PATCH 3/4] Translations update from Toolate (#175) * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.6% (288 of 289 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/ * Translated using Weblate (Arabic) Currently translated at 100.0% (289 of 289 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ar/ * Translated using Weblate (Italian) Currently translated at 100.0% (290 of 290 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (290 of 290 strings) Translation: jrpie-Launcher/Launcher Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/it/ --------- Co-authored-by: class0068 Co-authored-by: abdelbasset jabrane Co-authored-by: Vladi69 Co-authored-by: renar --- app/src/main/res/values-ar/strings.xml | 55 ++++++++++++++++------ app/src/main/res/values-it/strings.xml | 24 ++++++++++ app/src/main/res/values-zh-rCN/strings.xml | 31 +++++++++++- 3 files changed, 93 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b0f66f9..39ae422 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -95,9 +95,9 @@ إخفِ شريط الحالة تدوير الشاشة الوظائف - أوامر السحب بأصبعين + إيماءات التمرير المزدوج اسحب باستخدام أصبعين - أوامر السحب من الحواف + إيماءات تمرير الحافة عرض الحواف إظهار نتائج البحث اضغط مسافة لتعطيل هذه الميزة مؤقتًا @@ -162,11 +162,11 @@ إنه برنامج مجاني (ترخيص MIT)!\nتأكد من مراجعة المستودع! النسخة الاستخدام - تحتوي شاشتك الرئيسية على التاريخ والوقت المحليين. لا الهاء. + تحتوي شاشة المنزل الخاصة بك على التاريخ والوقت المحليين. بدون أي مشتتات. كل التطبيقات بمجرد تطابق تطبيق واحد فقط، يتم تشغيله تلقائيًا.\nيمكن تعطيل ذلك عن طريق اضافة مساحة في بداية استعلام. الإعداد - اخترنا بعض التطبيقات الافتراضية لك. يمكنك تغييرها الآن إذا كنت تريد: + اخترنا لك بعض التطبيقات الافتراضية. يمكنك تغييرها الآن إذا كنت ترغب في ذلك: يمكنك أيضًا تغيير اختيارك لاحقًا. لنبدأ! ابدأ @@ -235,7 +235,7 @@ لا تظهر التطبيقات المرتبطة بإيماءة في قائمة التطبيقات درج التطبيقات المفضلة الموسيقى: التالي - تم تصميم μlauncher ليكون فعال، وخالي من الهاء.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات. + تم تصميم μLauncher ليكون فعالًا وخاليًا من مشتتات الانتباه.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات. أنت مستعد للبدء!\n\nآمل أن يكون هذا ذا قيمة كبيرة بالنسبة لك!\n\n- المطورين يجب أن يكون μlauncher الشاشة الرئيسية الافتراضية للوصول إلى مساحة خاصة. اسحب إلى اليسار من أسفل الشاشة @@ -245,7 +245,7 @@ معلومات التطبيق أضف إلى المفضلة توسيع لوحة الاشعارات - يمكنك البحث بسرعة من خلال جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتح القائمة، أو ربطها بإيماءة ما. + يمكنك البحث بسرعة في جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتحها، أو اربطها بإيماءة مختلفة. خطأ: فشل في قفل الشاشة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف) اسحب إلى الأسفل من حافة الشاشة اليمنى أحادي المسافة مذيل @@ -257,7 +257,7 @@ شكرا لك على المساعدة في تحسين μLauncher!\nيرجى إضافة المعلومات التالية إلى تقرير الأخطاء الخاص بك: اتصل بالمطور الأصلي اخفض الصوت - يمكنك تشغيل أهم تطبيقاتك بوسطة إيماءات اللمس أو الضغط على الأزرار. + يمكنك تشغيل أهم تطبيقاتك بإيماءات اللمس أو الضغط على الأزرار. اسحب من حواف الشاشة خطأ: قفل الشاشة باستخدام إمكانية الوصول غير مدعوم على هذا الجهاز. الرجاء استخدام طريقة مسؤول الجهاز بدلاً من ذلك. يتيح تعيين μlauncher كخدمة إمكانية الوصول قفل الشاشة وفتح قائمة التطبيقات الحديثة. يرجى ملاحظة أنه يتطلب كمية كبيرة من الأذونات. يجب ألا تمنح مثل هذه الأذونات باستخفاف لأي تطبيق. سوف يستخدم μlauncher خدمة إمكانية الوصول فقط لأداء الإجراءات التالية عند طلب المستخدم: * قفل شاشة * فتح التطبيقات الحديثة μlauncher لن يستخدم أبدًا خدمة إمكانية الوصول لجمع البيانات. يمكنك التحقق من شيفرة المصدر للتأكد. يرجى ملاحظة أنه يمكنك قفل الشاشة من خلال منح أذونات مسؤول الجهاز، لكنها لا تعمل مع بصمات الأصابع وفتح الوجه. @@ -288,11 +288,13 @@ يمكنك تغيير اختيارك لاحقًا في الإعدادات. ]]> الساعة الافتراضية لـ μLauncher - <![CDATA[لم يتم العثور على لوحات عناصر واجهة المستخدم. يمكنك إنشاء لوحات الأدوات في الإعدادات > المشغّل > إدارة لوحات الأدوات.]]. + المشغل > إدارة لوحات الأدوات. +]]> اختر الأداة إزالة تهيئة - Enable Interaction + تمكين التفاعل تعطيل التفاعل ساعة حذف @@ -305,12 +307,35 @@ لم تعد لوحة الأدوات هذه موجودة. الأدوات - يحتوي على %d أداة. - يحتوي على %d أداة. - يحتوي على %d أدوات. - يحتوي على %d أدوات. - يحتوي على %d أداة. - + يحتوي على %1$dأداة. + يحتوي على %1$d أداة. + يحتوي على %1$d أدوات. + يحتوي على%1$d أدوات. + يحتوي على %1$d أداة. + يحتوي على%1$d أداة. إغلاق لوحة المفاتيح عند التمرير +
+ لأسباب تتعلق بالخصوصية، لا يتم جمع سجلات الأعطال تلقائيًا.
+ ومع ذلك، فإن السجلات مفيدة جدًا لتصحيح الأخطاء، لذا سأكون ممتنًا جدًا إذا كان بإمكانك إرسال السجل المرفق عبر البريد + أو إنشاء تقرير عن الخطأ على GitHub.

+ يرجى ملاحظة أن سجلات الأعطال قد تحتوي على معلومات حساسة، مثل اسم التطبيق الذي حاولت تشغيله. + يرجى حذف مثل هذه المعلومات قبل إرسال التقرير. +

ماذا يمكنني أن أفعل الآن؟

+ إذا ظهر هذا الخطأ مرة أخرى، يمكنك تجربة عدة أشياء: +
    +
  • إيقاف μLauncher بالقوة
  • +
  • مسح بيانات μLauncher's (ستفقد إعداداتك!)
  • +
  • تثبيت إصدار أقدم (GitHub, F-Droid)
  • +
+]]>
+ تعطل μLauncher + آسف! انقر للحصول على مزيد من المعلومات. + نسخ تقرير التعطل إلى الحافظة + إرسال التقرير بالبريد + إنشاء تقرير خطأ على GitHub + تعطل μLauncher + إرسال بريد إلكتروني + الأعطال ومعلومات التصحيح diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bca9108..14e95cc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -312,4 +312,28 @@ Widget Seleziona pannello widget Launcher > Gestione Pannelli Widget.]]> + Documentazione + Scusa! Clicca per altre info. + μLauncher è crashato + Copia il rapporto del crash negli appunti + Invia il rapporto per email + Crea un bug report in GitHub + μLauncher è crashato + Invia email + Info su crash e debug +
+ Per motivi di privacy, i log dei crash non sono raccolti automaticamente.
+ Comunque i log sono molto utili per il debug, quindi ti sarei molto grato se potessi inviarmi i log per email + oppure aprire un bug report su github.

+ Nota che i crash log potrebbero contenere informazioni sensibili, come il nome dell'app che hai provato ad avviare. + Please redact such information before sending the report. +

What can I do now?

+ If this bug appears again and again, you can try several things: +
    +
  • Force stop μLauncher
  • +
  • Clear μLauncher\'s storage (Your settings will be lost!)
  • +
  • Install an older version (GitHub, F-Droid)
  • +
+ ]]>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ebd3c7c..4ce276d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -260,7 +260,7 @@ V(反向) (反向)]]> - 开启后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。 + 启用后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。 应用程序列表样式 绑定到手势 音乐:播放 / 暂停 @@ -287,7 +287,7 @@ 滚动应用程序列表时自动隐藏键盘 设置小部件 删除 - 开启交互功能 + 启用交互功能 关闭交互功能 时钟 删除 @@ -303,4 +303,31 @@ μLauncher 默认时钟小部件 选择小部件 设置小部件面板 + 确认 + + 包含 %1$d 个小部件。 + + μLauncher 崩溃了 + 抱歉!点击查看更多信息。 + 复制崩溃报告到剪贴板 + 通过 Email 发送报告 + μLauncher 崩溃了 + 在 GitHub 上创建错误反馈 + 发送 Email + 崩溃和调试信息 +
+ 出于保护隐私的考量,默认不会记录崩溃日志。
+ 但是,日志对应用调试非常有帮助,若您原意,请将所附日志文件通过 Email 发送给我, + 或在 GitHub 上创建错误报告,非常感谢!

+ 请注意,崩溃日志可能包含敏感信息,如,您尝试启动的应用名称。 + 因此,请在发送报告前,先将此类信息去除。 +

我现在应该怎么做?

+ 如果这个错误重复发生,您可以做如下尝试: +
    +
  • 强行停止 μLauncher
  • +
  • 清空 μLauncher 的存储空间(您的设置将被重置!
  • +
  • 安装旧版本(GitHub, F-Droid
  • +
+ ]]>
From ce939111d0f4010fc8cdb4ce6dfb5cd534d39e3f Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 29 May 2025 19:29:05 +0200 Subject: [PATCH 4/4] fixed italian translation --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 14e95cc..8c3d0e8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -314,11 +314,11 @@ Launcher > Gestione Pannelli Widget.]]> Documentazione Scusa! Clicca per altre info. - μLauncher è crashato + µLauncher è crashato Copia il rapporto del crash negli appunti Invia il rapporto per email Crea un bug report in GitHub - μLauncher è crashato + µLauncher è crashato Invia email Info su crash e debug Comunque i log sono molto utili per il debug, quindi ti sarei molto grato se potessi inviarmi i log per email oppure aprire un bug report su github.

- Nota che i crash log potrebbero contenere informazioni sensibili, come il nome dell'app che hai provato ad avviare. + Nota che i crash log potrebbero contenere informazioni sensibili, come il nome dell\'app che hai provato ad avviare. Please redact such information before sending the report.

What can I do now?

If this bug appears again and again, you can try several things: