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 ba47942..e0d1d00 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 a2ea801..6768116 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,6 +1,7 @@ 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 541510a..93b4cbf 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,6 +6,7 @@ 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 fb353d5..b13978b 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,7 +1,9 @@ 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 70f737f..3dbdda8 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,6 +1,7 @@ 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 @@ -44,7 +45,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { binding = ActivityPinShortcutBinding.inflate(layoutInflater) setContentView(binding.root) - val launcherApps = getSystemService(LAUNCHER_APPS_SERVICE) as LauncherApps + val launcherApps = getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps val request = launcherApps.getPinItemRequest(intent) this.request = request @@ -55,7 +56,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { if (request.requestType == PinItemRequest.REQUEST_TYPE_APPWIDGET) { - // TODO handle app widgets + // TODO 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 8264752..8e8ed4e 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,7 +17,6 @@ import kotlin.math.max import kotlin.math.min import kotlin.math.tan -@Suppress("PrivatePropertyName") class TouchGestureDetector( private val context: Context, var width: Int, @@ -35,13 +34,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 784d6fa..65278ce 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,4 +237,9 @@ 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 ed26729..a8e59ba 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,6 +96,7 @@ 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 548c30b..e15cef1 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,6 +5,7 @@ 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 5eab32f..5f8adf1 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(it.key)?.allowInteraction == false + Widget.byId(context, 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 163777f..89e1057 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,6 +9,7 @@ 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 531cdc1..38bbb84 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,6 +5,7 @@ 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 @@ -20,6 +21,7 @@ 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 @@ -130,6 +132,7 @@ 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 3034aeb..d1c84d0 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 touchSlop: Int - val touchSlopSquare: Int - val longPressTimeout: Long + val TOUCH_SLOP: Int + val TOUCH_SLOP_SQUARE: Int + val LONG_PRESS_TIMEOUT: Long private var overlayViewById = HashMap() init { val configuration = ViewConfiguration.get(context) - touchSlop = configuration.scaledTouchSlop - touchSlopSquare = touchSlop * touchSlop + TOUCH_SLOP = configuration.scaledTouchSlop + TOUCH_SLOP_SQUARE = TOUCH_SLOP * TOUCH_SLOP - longPressTimeout = ViewConfiguration.getLongPressTimeout().toLong() + LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout().toLong() } @@ -127,14 +127,14 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) endInteraction() } - }, longPressTimeout) + }, LONG_PRESS_TIMEOUT) } 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 > touchSlopSquare) { + if (distanceX * distanceX + distanceY * distanceY > TOUCH_SLOP_SQUARE) { 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(id) ?: return true + val widget = Widget.byId(context, 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 0363069..61006b8 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,18 +54,26 @@ class WidgetOverlayView : ViewGroup { var widgetId: Int = -1 set(newId) { field = newId - preview = Widget.byId(widgetId)?.getPreview(context) + preview = Widget.byId(context, widgetId)?.getPreview(context) } - constructor(context: Context) : super(context) + constructor(context: Context) : super(context) { + init(null, 0) + } - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + init(attrs, 0) + } 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) @@ -93,13 +101,13 @@ class WidgetOverlayView : ViewGroup { } fun showPopupMenu() { - val widget = Widget.byId(widgetId)?: return + val widget = Widget.byId(context, widgetId)?: return val menu = PopupMenu(context, popupAnchor) menu.menu.let { it.add( context.getString(R.string.widget_menu_remove) ).setOnMenuItemClickListener { _ -> - Widget.byId(widgetId)?.delete(context) + Widget.byId(context, widgetId)?.delete(context) return@setOnMenuItemClickListener true } it.add( @@ -118,7 +126,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 73f5d81..fd96f14 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,6 +38,10 @@ sealed class Widget { ) } + fun getPanel(): WidgetPanel? { + return WidgetPanel.byId(panelId) + } + override fun hashCode(): Int { return id } @@ -53,9 +57,9 @@ sealed class Widget { fun deserialize(serialized: String): Widget { return Json.decodeFromString(serialized) } - fun byId(id: Int): Widget? { + fun byId(context: Context, 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 864e5d3..37a77a7 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 { profile -> - appWidgetManager.getInstalledProvidersForProfile(profile) + profiles.map { + appWidgetManager.getInstalledProvidersForProfile(it) .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 f84f42f..60413a3 100644 --- a/app/src/main/res/layout/activity_manage_widget_panels.xml +++ b/app/src/main/res/layout/activity_manage_widget_panels.xml @@ -40,7 +40,6 @@ 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" @@ -65,7 +64,6 @@ 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 4e63ec9..66404ee 100644 --- a/app/src/main/res/layout/activity_manage_widgets.xml +++ b/app/src/main/res/layout/activity_manage_widgets.xml @@ -20,7 +20,6 @@ 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 da724e7..2519374 100644 --- a/app/src/main/res/layout/activity_pin_shortcut.xml +++ b/app/src/main/res/layout/activity_pin_shortcut.xml @@ -44,7 +44,6 @@ 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 14296bd..82db94d 100644 --- a/app/src/main/res/layout/activity_select_widget.xml +++ b/app/src/main/res/layout/activity_select_widget.xml @@ -45,7 +45,6 @@ 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 958638a..8a3b5d9 100644 --- a/app/src/main/res/layout/list.xml +++ b/app/src/main/res/layout/list.xml @@ -62,7 +62,6 @@ 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" @@ -73,7 +72,6 @@ app:layout_constraintTop_toTopOf="parent" /> + custom:tabTextColor="?attr/android:textColor" /> @@ -113,7 +110,6 @@ 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" - tools:ignore="SpeakableTextPresentCheck" /> + custom:layout_behavior="@string/appbar_scrolling_view_behavior" /> \ 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 78d92ae..530cc9e 100644 --- a/app/src/main/res/layout/list_other_row.xml +++ b/app/src/main/res/layout/list_other_row.xml @@ -11,7 +11,6 @@ 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 8ce96c4..987e293 100644 --- a/app/src/main/res/layout/settings.xml +++ b/app/src/main/res/layout/settings.xml @@ -20,22 +20,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + + + app:tabTextColor="?attr/android:textColor" /> diff --git a/app/src/main/res/layout/settings_actions_row.xml b/app/src/main/res/layout/settings_actions_row.xml index eb3339c..a60a5a4 100644 --- a/app/src/main/res/layout/settings_actions_row.xml +++ b/app/src/main/res/layout/settings_actions_row.xml @@ -68,7 +68,6 @@ 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 c304165..5520aa1 100644 --- a/app/src/main/res/layout/tutorial.xml +++ b/app/src/main/res/layout/tutorial.xml @@ -26,7 +26,6 @@ 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" @@ -44,14 +43,12 @@ app:layout_constraintStart_toEndOf="@+id/tutorial_button_back" app:tabBackground="@drawable/tutorial_tab_selector" app:tabGravity="center" - app:tabIndicatorHeight="0dp" - tools:ignore="SpeakableTextPresentCheck" /> + app:tabIndicatorHeight="0dp" /> إخفِ شريط الحالة تدوير الشاشة الوظائف - إيماءات التمرير المزدوج + أوامر السحب بأصبعين اسحب باستخدام أصبعين - إيماءات تمرير الحافة + أوامر السحب من الحواف عرض الحواف إظهار نتائج البحث اضغط مسافة لتعطيل هذه الميزة مؤقتًا @@ -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,13 +288,11 @@ يمكنك تغيير اختيارك لاحقًا في الإعدادات. ]]> الساعة الافتراضية لـ μLauncher - المشغل > إدارة لوحات الأدوات. -]]> + <![CDATA[لم يتم العثور على لوحات عناصر واجهة المستخدم. يمكنك إنشاء لوحات الأدوات في الإعدادات > المشغّل > إدارة لوحات الأدوات.]]. اختر الأداة إزالة تهيئة - تمكين التفاعل + Enable Interaction تعطيل التفاعل ساعة حذف @@ -307,35 +305,12 @@ لم تعد لوحة الأدوات هذه موجودة. الأدوات - يحتوي على %1$dأداة. - يحتوي على %1$d أداة. - يحتوي على %1$d أدوات. - يحتوي على%1$d أدوات. - يحتوي على %1$d أداة. - يحتوي على%1$d أداة. + يحتوي على %d أداة. + يحتوي على %d أداة. + يحتوي على %d أدوات. + يحتوي على %d أدوات. + يحتوي على %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 8c3d0e8..bca9108 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -312,28 +312,4 @@ 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 4ce276d..ebd3c7c 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,31 +303,4 @@ μLauncher 默认时钟小部件 选择小部件 设置小部件面板 - 确认 - - 包含 %1$d 个小部件。 - - μLauncher 崩溃了 - 抱歉!点击查看更多信息。 - 复制崩溃报告到剪贴板 - 通过 Email 发送报告 - μLauncher 崩溃了 - 在 GitHub 上创建错误反馈 - 发送 Email - 崩溃和调试信息 -
- 出于保护隐私的考量,默认不会记录崩溃日志。
- 但是,日志对应用调试非常有帮助,若您原意,请将所附日志文件通过 Email 发送给我, - 或在 GitHub 上创建错误报告,非常感谢!

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

我现在应该怎么做?

- 如果这个错误重复发生,您可以做如下尝试: -
    -
  • 强行停止 μLauncher
  • -
  • 清空 μLauncher 的存储空间(您的设置将被重置!
  • -
  • 安装旧版本(GitHub, F-Droid
  • -
- ]]>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1e4d12b..2712036 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -11,5 +11,9 @@ #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 0d109bc..bdf620a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,11 @@ + 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 6fb9d61..baf8fea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -444,16 +444,4 @@ Send Email Crashes and Debug Information Documentation - - Add widget - Add widget panel - Close - Navigate back - Navigate next - Lock - Remove binding diff --git a/docs/actions-and-gestures.md b/docs/actions-and-gestures.md index 48c3e88..dc00970 100644 --- a/docs/actions-and-gestures.md +++ b/docs/actions-and-gestures.md @@ -5,7 +5,7 @@ # Actions and Gestures µLauncher's central mechanism for accessing important functionality quickly -is to bind actions (e.g., launching an app) to gestures (e.g., swiping up). +is to bind actions (e.g. launching an app) to gestures (e.g. swiping up). These bindings can be configured in µLauncher Settings > ACTIONS. @@ -32,7 +32,7 @@ These bindings can be configured in µLauncher Settings > ACTIONS. - Tap then swipe up, down, left, or right - To execute these gestures consistently, it is helpful to think of them as double taps, + To execute these gesture consistently, it is helpful to think of them as double taps, where the finger stays on the screen after the second tap and then does a swipe. The swipe must start very shortly after the tap ended. @@ -62,14 +62,14 @@ To any of the available gestures, one of the following actions can be bound: If private space is set up, an icon to (un)lock it is shown on the top right. - Open µLauncher's settings - Toggle private space lock -- Lock the screen: This allows you to lock the screen. - There are two mechanisms by which the screen can be locked: accessibility service and device admin. +- Lock the screen: This allows to lock the screen. + There are two mechanisms by which the screen can be locked, accessibility service and device admin. - Toggle the flashlight -- Raise, lower, or adjust volume +- Raise, lower or adjust volume - Play or pause media playback - Skip to previous or next audio track - Open notifications panel: Might be useful if the top of your screen is broken. - Open quick settings panel: Why swipe down twice? -- Open [recent apps](https://developer.android.com/guide/components/activities/recents): Requires accessibility service. It can be used as a workaround for an Android bug. +- Open [recent apps](https://developer.android.com/guide/components/activities/recents): Requires accessibility service. Can be used as a workaround for a Android bug. - Launch another home screen: Allows using another installed home screen temporarily. -- Do nothing: Simply prevents showing the message that no action is bound to this gesture. +- Do nothing: Just prevents showing the message saying that no action is bound to this gesture. diff --git a/docs/alternatives.md b/docs/alternatives.md index 7e8d719..c648ce4 100644 --- a/docs/alternatives.md +++ b/docs/alternatives.md @@ -8,7 +8,7 @@ This is a comparison of open-source home screens for Android. **Inclusion criteria:** Apps in this list must be [open source](https://opensource.org/licenses) and maintained - + - 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 shown at the top right when necessary. +- The gear button on the home screen was removed. A smaller button is show 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 are set as the defaults. +- Different apps set as default. - 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 0c12d1c..f74bcca 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 on how to build this project. +See [here](/docs/build) for instructions 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 32c0fde..3a46a7b 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 photo 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 photos 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 settings) +### Background (app list and setting) 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 widget panels, the wallpaper is always shown unmodified. +On the home screen and on 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 affect the clock shown on the home screen (or on widget panels). +These settings effect 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 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. +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. This differs from the more common RGBA, which is used in web development. -[^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. +[^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. **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 the user's keyboard input when no other apps match. +Launches any app that matches user 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 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. + - 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. - 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 the app drawer. +Reduces redundancy and tidies up 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 the 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 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 set up properly. +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. **type:** `toggle` diff --git a/docs/widgets.md b/docs/widgets.md index 15ac7bb..acbdf05 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 similarly to an app widget and can be managed in the same way.[^1] +μLauncher's clock behaves similar as 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.