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: |