Compare commits

..

No commits in common. "ce939111d0f4010fc8cdb4ce6dfb5cd534d39e3f" and "15d36eeff45cfe4cd161d46a26b9db7852d1792c" have entirely different histories.

39 changed files with 191 additions and 257 deletions

View file

@ -28,7 +28,7 @@ import kotlinx.coroutines.launch
import kotlin.system.exitProcess import kotlin.system.exitProcess
const val APP_WIDGET_HOST_ID = 42 const val APP_WIDGET_HOST_ID = 42;
class Application : android.app.Application() { class Application : android.app.Application() {

View file

@ -1,6 +1,7 @@
package de.jrpie.android.launcher.actions package de.jrpie.android.launcher.actions
import android.content.Context import android.content.Context
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import android.os.Build import android.os.Build

View file

@ -6,6 +6,7 @@ import android.widget.Button
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences

View file

@ -1,7 +1,9 @@
package de.jrpie.android.launcher.preferences.legacy package de.jrpie.android.launcher.preferences.legacy
import android.content.Context import android.content.Context
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.preferences.LauncherPreferences 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.ClockWidget
import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition

View file

@ -1,6 +1,7 @@
package de.jrpie.android.launcher.ui package de.jrpie.android.launcher.ui
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Service
import android.content.Context import android.content.Context
import android.content.pm.LauncherApps import android.content.pm.LauncherApps
import android.content.pm.LauncherApps.PinItemRequest import android.content.pm.LauncherApps.PinItemRequest
@ -44,7 +45,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject {
binding = ActivityPinShortcutBinding.inflate(layoutInflater) binding = ActivityPinShortcutBinding.inflate(layoutInflater)
setContentView(binding.root) 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) val request = launcherApps.getPinItemRequest(intent)
this.request = request this.request = request
@ -55,7 +56,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject {
if (request.requestType == PinItemRequest.REQUEST_TYPE_APPWIDGET) { if (request.requestType == PinItemRequest.REQUEST_TYPE_APPWIDGET) {
// TODO handle app widgets // TODO
request.getAppWidgetProviderInfo(this) request.getAppWidgetProviderInfo(this)
// startActivity() // startActivity()
finish() finish()

View file

@ -17,7 +17,6 @@ import kotlin.math.max
import kotlin.math.min import kotlin.math.min
import kotlin.math.tan import kotlin.math.tan
@Suppress("PrivatePropertyName")
class TouchGestureDetector( class TouchGestureDetector(
private val context: Context, private val context: Context,
var width: Int, var width: Int,
@ -35,13 +34,13 @@ class TouchGestureDetector(
private val MIN_TRIANGLE_HEIGHT = 250 private val MIN_TRIANGLE_HEIGHT = 250
private val longPressHandler = Handler(Looper.getMainLooper())
private var systemGestureInsetTop = 100 private var systemGestureInsetTop = 100
private var systemGestureInsetBottom = 0 private var systemGestureInsetBottom = 0
private var systemGestureInsetLeft = 0 private var systemGestureInsetLeft = 0
private var systemGestureInsetRight = 0 private var systemGestureInsetRight = 0
private val longPressHandler = Handler(Looper.getMainLooper())
data class Vector(val x: Float, val y: Float) { data class Vector(val x: Float, val y: Float) {
fun absSquared(): Float { fun absSquared(): Float {

View file

@ -237,4 +237,9 @@ class AppsRecyclerAdapter(
appFilter.favoritesVisibility = v appFilter.favoritesVisibility = v
updateAppsList() updateAppsList()
} }
fun setHiddenAppsVisibility(v: AppFilter.Companion.AppSetVisibility) {
appFilter.hiddenVisibility = v
updateAppsList()
}
} }

View file

@ -96,6 +96,7 @@ class ListFragmentApps : Fragment(), UIObject {
if (LauncherPreferences.functionality().searchAutoCloseKeyboard()) { if (LauncherPreferences.functionality().searchAutoCloseKeyboard()) {
addOnScrollListener(object : RecyclerView.OnScrollListener() { addOnScrollListener(object : RecyclerView.OnScrollListener() {
var totalDy: Int = 0 var totalDy: Int = 0
var threshold = (resources.displayMetrics.density * 100).toInt()
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
totalDy += dy totalDy += dy

View file

@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment 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.databinding.Tutorial5FinishBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.requestNotificationPermission import de.jrpie.android.launcher.requestNotificationPermission

View file

@ -61,7 +61,7 @@ open class WidgetContainerView(
it.value.y + it.value.height it.value.y + it.value.height
).contains(position) == true ).contains(position) == true
}.any { }.any {
Widget.byId(it.key)?.allowInteraction == false Widget.byId(context, it.key)?.allowInteraction == false
} }
} }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {

View file

@ -9,6 +9,7 @@ import android.widget.EditText
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivityManageWidgetPanelsBinding import de.jrpie.android.launcher.databinding.ActivityManageWidgetPanelsBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences

View file

@ -5,6 +5,7 @@ import android.appwidget.AppWidgetManager
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Rect
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.ViewGroup 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.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition
import kotlin.math.max import kotlin.math.max
import kotlin.math.min
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -130,6 +132,7 @@ class ManageWidgetsActivity : UIObject, Activity() {
private fun selectWidget() { private fun selectWidget() {
val appWidgetHost = (application as Application).appWidgetHost
startActivityForResult( startActivityForResult(
Intent(this, SelectWidgetActivity::class.java).also { Intent(this, SelectWidgetActivity::class.java).also {
it.putExtra( it.putExtra(

View file

@ -31,19 +31,19 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe
WidgetContainerView(widgetPanelId, context, attrs) { WidgetContainerView(widgetPanelId, context, attrs) {
constructor(context: Context, attrs: AttributeSet?) : this(WidgetPanel.HOME.id, context, attrs) constructor(context: Context, attrs: AttributeSet?) : this(WidgetPanel.HOME.id, context, attrs)
val touchSlop: Int val TOUCH_SLOP: Int
val touchSlopSquare: Int val TOUCH_SLOP_SQUARE: Int
val longPressTimeout: Long val LONG_PRESS_TIMEOUT: Long
private var overlayViewById = HashMap<Int, WidgetOverlayView>() private var overlayViewById = HashMap<Int, WidgetOverlayView>()
init { init {
val configuration = ViewConfiguration.get(context) val configuration = ViewConfiguration.get(context)
touchSlop = configuration.scaledTouchSlop TOUCH_SLOP = configuration.scaledTouchSlop
touchSlopSquare = touchSlop * touchSlop 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) view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
endInteraction() endInteraction()
} }
}, longPressTimeout) }, LONG_PRESS_TIMEOUT)
} }
if (event.actionMasked == MotionEvent.ACTION_MOVE || if (event.actionMasked == MotionEvent.ACTION_MOVE ||
event.actionMasked == MotionEvent.ACTION_UP event.actionMasked == MotionEvent.ACTION_UP
) { ) {
val distanceX = event.x - (currentGestureStart?.x ?: return true) val distanceX = event.x - (currentGestureStart?.x ?: return true)
val distanceY = event.y - (currentGestureStart?.y ?: 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) longPressHandler.removeCallbacksAndMessages(null)
} }
val view = selectedWidgetOverlayView ?: return true val view = selectedWidgetOverlayView ?: return true
@ -162,7 +162,7 @@ class WidgetManagerView(widgetPanelId: Int, context: Context, attrs: AttributeSe
if (event.actionMasked == MotionEvent.ACTION_UP) { if (event.actionMasked == MotionEvent.ACTION_UP) {
longPressHandler.removeCallbacksAndMessages(null) longPressHandler.removeCallbacksAndMessages(null)
val id = selectedWidgetOverlayView?.widgetId ?: return true val id = selectedWidgetOverlayView?.widgetId ?: return true
val widget = Widget.byId(id) ?: return true val widget = Widget.byId(context, id) ?: return true
widget.position = newPosition widget.position = newPosition
endInteraction() endInteraction()
updateWidget(widget) updateWidget(widget)

View file

@ -54,18 +54,26 @@ class WidgetOverlayView : ViewGroup {
var widgetId: Int = -1 var widgetId: Int = -1
set(newId) { set(newId) {
field = 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( constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context, context,
attrs, attrs,
defStyle defStyle
) ) {
init(attrs, defStyle)
}
private fun init(attrs: AttributeSet?, defStyle: Int) { }
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
super.onDraw(canvas) super.onDraw(canvas)
@ -93,13 +101,13 @@ class WidgetOverlayView : ViewGroup {
} }
fun showPopupMenu() { fun showPopupMenu() {
val widget = Widget.byId(widgetId)?: return val widget = Widget.byId(context, widgetId)?: return
val menu = PopupMenu(context, popupAnchor) val menu = PopupMenu(context, popupAnchor)
menu.menu.let { menu.menu.let {
it.add( it.add(
context.getString(R.string.widget_menu_remove) context.getString(R.string.widget_menu_remove)
).setOnMenuItemClickListener { _ -> ).setOnMenuItemClickListener { _ ->
Widget.byId(widgetId)?.delete(context) Widget.byId(context, widgetId)?.delete(context)
return@setOnMenuItemClickListener true return@setOnMenuItemClickListener true
} }
it.add( it.add(
@ -118,7 +126,7 @@ class WidgetOverlayView : ViewGroup {
} }
fun getHandles(): List<Handle> { fun getHandles(): List<Handle> {
return listOf( return listOf<Handle>(
Handle(WidgetManagerView.EditMode.TOP, Handle(WidgetManagerView.EditMode.TOP,
Rect(HANDLE_EDGE_SIZE, 0, width - HANDLE_EDGE_SIZE, HANDLE_SIZE)), Rect(HANDLE_EDGE_SIZE, 0, width - HANDLE_EDGE_SIZE, HANDLE_SIZE)),
Handle(WidgetManagerView.EditMode.BOTTOM, Handle(WidgetManagerView.EditMode.BOTTOM,

View file

@ -38,6 +38,10 @@ sealed class Widget {
) )
} }
fun getPanel(): WidgetPanel? {
return WidgetPanel.byId(panelId)
}
override fun hashCode(): Int { override fun hashCode(): Int {
return id return id
} }
@ -53,9 +57,9 @@ sealed class Widget {
fun deserialize(serialized: String): Widget { fun deserialize(serialized: String): Widget {
return Json.decodeFromString(serialized) return Json.decodeFromString(serialized)
} }
fun byId(id: Int): Widget? { fun byId(context: Context, id: Int): Widget? {
// TODO: do some caching // TODO: do some caching
return LauncherPreferences.widgets().widgets().firstOrNull { return LauncherPreferences.widgets().widgets().firstOrNull() {
it.id == id it.id == id
} }
} }

View file

@ -55,8 +55,8 @@ fun getAppWidgetProviders( context: Context ): List<LauncherWidgetProvider> {
(context.getSystemService(Service.USER_SERVICE) as UserManager).userProfiles (context.getSystemService(Service.USER_SERVICE) as UserManager).userProfiles
} }
list.addAll( list.addAll(
profiles.map { profile -> profiles.map {
appWidgetManager.getInstalledProvidersForProfile(profile) appWidgetManager.getInstalledProvidersForProfile(it)
.map { LauncherAppWidgetProvider(it) } .map { LauncherAppWidgetProvider(it) }
}.flatten() }.flatten()
) )

View file

@ -40,7 +40,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
android:paddingLeft="16sp" android:paddingLeft="16sp"
@ -65,7 +64,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_margin="16dp"
android:contentDescription="@string/content_description_add_widget_panel"
android:src="@drawable/baseline_add_24" android:src="@drawable/baseline_add_24"
app:layout_anchor="@+id/manage_widget_panels_recycler" app:layout_anchor="@+id/manage_widget_panels_recycler"
app:layout_anchorGravity="end|bottom" app:layout_anchorGravity="end|bottom"

View file

@ -20,7 +20,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_margin="16dp"
android:clickable="true" android:clickable="true"
android:contentDescription="@string/content_description_add_widget"
android:focusable="true" android:focusable="true"
android:src="@drawable/baseline_add_24" android:src="@drawable/baseline_add_24"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

View file

@ -44,7 +44,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
android:paddingLeft="16sp" android:paddingLeft="16sp"

View file

@ -45,7 +45,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
android:paddingLeft="16sp" android:paddingLeft="16sp"

View file

@ -62,7 +62,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
android:paddingLeft="16sp" android:paddingLeft="16sp"
@ -73,7 +72,6 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/list_lock" android:id="@+id/list_lock"
android:contentDescription="@string/content_description_lock"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -93,8 +91,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:tabIndicatorColor="?attr/colorAccent" app:tabIndicatorColor="?attr/colorAccent"
custom:tabTextColor="?attr/android:textColor" custom:tabTextColor="?attr/android:textColor" />
tools:ignore="SpeakableTextPresentCheck" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@ -113,7 +110,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/list_appbar" app:layout_constraintTop_toBottomOf="@id/list_appbar"
app:layout_constraintVertical_bias="0.0" 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" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -11,7 +11,6 @@
android:id="@+id/list_other_row_icon" android:id="@+id/list_other_row_icon"
android:layout_width="35sp" android:layout_width="35sp"
android:layout_height="35sp" android:layout_height="35sp"
android:contentDescription="@null"
android:gravity="center" android:gravity="center"
android:textSize="30sp" android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

View file

@ -20,22 +20,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<ImageView
android:id="@+id/settings_system"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:contentDescription="@string/settings"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_settings_applications_24"
custom:layout_constraintBottom_toBottomOf="parent"
custom:layout_constraintStart_toStartOf="parent"
custom:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/settings_heading" android:id="@+id/settings_heading"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -56,7 +40,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:contentDescription="@string/content_description_close"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
android:paddingLeft="16sp" android:paddingLeft="16sp"
@ -65,14 +48,28 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/settings_system"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_settings_applications_24"
custom:layout_constraintBottom_toBottomOf="parent"
custom:layout_constraintStart_toStartOf="parent"
custom:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/settings_tabs" android:id="@+id/settings_tabs"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:tabTextColor="?attr/android:textColor" app:tabTextColor="?attr/android:textColor" />
tools:ignore="SpeakableTextPresentCheck" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>

View file

@ -68,7 +68,6 @@
android:id="@+id/settings_actions_row_remove" android:id="@+id/settings_actions_row_remove"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:contentDescription="@string/content_description_settings_actions_row_button_remove"
android:padding="8sp" android:padding="8sp"
android:src="@drawable/baseline_close_24" android:src="@drawable/baseline_close_24"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

View file

@ -26,7 +26,6 @@
android:id="@+id/tutorial_button_back" android:id="@+id/tutorial_button_back"
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp" android:layout_height="50dp"
android:contentDescription="@string/content_description_navigate_back"
android:gravity="center" android:gravity="center"
android:alpha="0.5" android:alpha="0.5"
android:src="@drawable/baseline_navigate_before_24" android:src="@drawable/baseline_navigate_before_24"
@ -44,14 +43,12 @@
app:layout_constraintStart_toEndOf="@+id/tutorial_button_back" app:layout_constraintStart_toEndOf="@+id/tutorial_button_back"
app:tabBackground="@drawable/tutorial_tab_selector" app:tabBackground="@drawable/tutorial_tab_selector"
app:tabGravity="center" app:tabGravity="center"
app:tabIndicatorHeight="0dp" app:tabIndicatorHeight="0dp" />
tools:ignore="SpeakableTextPresentCheck" />
<ImageView <ImageView
android:id="@+id/tutorial_button_next" android:id="@+id/tutorial_button_next"
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp" android:layout_height="50dp"
android:contentDescription="@string/content_description_navigate_next"
android:gravity="center" android:gravity="center"
android:src="@drawable/baseline_navigate_next_24" android:src="@drawable/baseline_navigate_next_24"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

View file

@ -95,9 +95,9 @@
<string name="settings_display_hide_status_bar">إخفِ شريط الحالة</string> <string name="settings_display_hide_status_bar">إخفِ شريط الحالة</string>
<string name="settings_display_rotate_screen">تدوير الشاشة</string> <string name="settings_display_rotate_screen">تدوير الشاشة</string>
<string name="settings_launcher_section_functionality">الوظائف</string> <string name="settings_launcher_section_functionality">الوظائف</string>
<string name="settings_enabled_gestures_double_swipe">إيماءات التمرير المزدوج</string> <string name="settings_enabled_gestures_double_swipe">أوامر السحب بأصبعين</string>
<string name="settings_enabled_gestures_double_swipe_summary">اسحب باستخدام أصبعين</string> <string name="settings_enabled_gestures_double_swipe_summary">اسحب باستخدام أصبعين</string>
<string name="settings_enabled_gestures_edge_swipe">إيماءات تمرير الحافة</string> <string name="settings_enabled_gestures_edge_swipe">أوامر السحب من الحواف</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">عرض الحواف</string> <string name="settings_enabled_gestures_edge_swipe_edge_width">عرض الحواف</string>
<string name="settings_functionality_auto_launch">إظهار نتائج البحث</string> <string name="settings_functionality_auto_launch">إظهار نتائج البحث</string>
<string name="settings_functionality_auto_launch_summary">اضغط مسافة لتعطيل هذه الميزة مؤقتًا</string> <string name="settings_functionality_auto_launch_summary">اضغط مسافة لتعطيل هذه الميزة مؤقتًا</string>
@ -162,11 +162,11 @@
<string name="tutorial_concept_text_2">إنه برنامج مجاني (ترخيص MIT)!\nتأكد من مراجعة المستودع!</string> <string name="tutorial_concept_text_2">إنه برنامج مجاني (ترخيص MIT)!\nتأكد من مراجعة المستودع!</string>
<string name="tutorial_concept_label_version">النسخة</string> <string name="tutorial_concept_label_version">النسخة</string>
<string name="tutorial_usage_title">الاستخدام</string> <string name="tutorial_usage_title">الاستخدام</string>
<string name="tutorial_usage_text">تحتوي شاشة المنزل الخاصة بك على التاريخ والوقت المحليين. بدون أي مشتتات.</string> <string name="tutorial_usage_text">تحتوي شاشتك الرئيسية على التاريخ والوقت المحليين. لا الهاء.</string>
<string name="tutorial_app_list_title">كل التطبيقات</string> <string name="tutorial_app_list_title">كل التطبيقات</string>
<string name="tutorial_app_list_text_2">بمجرد تطابق تطبيق واحد فقط، يتم تشغيله تلقائيًا.\nيمكن تعطيل ذلك عن طريق اضافة مساحة في بداية استعلام.</string> <string name="tutorial_app_list_text_2">بمجرد تطابق تطبيق واحد فقط، يتم تشغيله تلقائيًا.\nيمكن تعطيل ذلك عن طريق اضافة مساحة في بداية استعلام.</string>
<string name="tutorial_setup_title">الإعداد</string> <string name="tutorial_setup_title">الإعداد</string>
<string name="tutorial_setup_text">اخترنا لك بعض التطبيقات الافتراضية. يمكنك تغييرها الآن إذا كنت ترغب في ذلك:</string> <string name="tutorial_setup_text">اخترنا بعض التطبيقات الافتراضية لك. يمكنك تغييرها الآن إذا كنت تريد:</string>
<string name="tutorial_setup_text_2">يمكنك أيضًا تغيير اختيارك لاحقًا.</string> <string name="tutorial_setup_text_2">يمكنك أيضًا تغيير اختيارك لاحقًا.</string>
<string name="tutorial_finish_title">لنبدأ!</string> <string name="tutorial_finish_title">لنبدأ!</string>
<string name="tutorial_finish_button">ابدأ</string> <string name="tutorial_finish_button">ابدأ</string>
@ -235,7 +235,7 @@
<string name="settings_apps_hide_bound_apps">لا تظهر التطبيقات المرتبطة بإيماءة في قائمة التطبيقات</string> <string name="settings_apps_hide_bound_apps">لا تظهر التطبيقات المرتبطة بإيماءة في قائمة التطبيقات</string>
<string name="list_other_list_favorites">درج التطبيقات المفضلة</string> <string name="list_other_list_favorites">درج التطبيقات المفضلة</string>
<string name="list_other_track_next">الموسيقى: التالي</string> <string name="list_other_track_next">الموسيقى: التالي</string>
<string name="tutorial_concept_text">تم تصميم μLauncher ليكون فعالًا وخاليًا من مشتتات الانتباه.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات.</string> <string name="tutorial_concept_text">تم تصميم μlauncher ليكون فعال، وخالي من الهاء.\n\nلا يحتوي على أي إعلانات ولا يجمع أي بيانات.</string>
<string name="tutorial_finish_text">أنت مستعد للبدء!\n\nآمل أن يكون هذا ذا قيمة كبيرة بالنسبة لك!\n\n- المطورين</string> <string name="tutorial_finish_text">أنت مستعد للبدء!\n\nآمل أن يكون هذا ذا قيمة كبيرة بالنسبة لك!\n\n- المطورين</string>
<string name="toast_private_space_default_home_screen">يجب أن يكون μlauncher الشاشة الرئيسية الافتراضية للوصول إلى مساحة خاصة.</string> <string name="toast_private_space_default_home_screen">يجب أن يكون μlauncher الشاشة الرئيسية الافتراضية للوصول إلى مساحة خاصة.</string>
<string name="settings_gesture_description_left_bottom_edge">اسحب إلى اليسار من أسفل الشاشة</string> <string name="settings_gesture_description_left_bottom_edge">اسحب إلى اليسار من أسفل الشاشة</string>
@ -245,7 +245,7 @@
<string name="list_app_info">معلومات التطبيق</string> <string name="list_app_info">معلومات التطبيق</string>
<string name="list_app_favorite_add">أضف إلى المفضلة</string> <string name="list_app_favorite_add">أضف إلى المفضلة</string>
<string name="list_other_expand_notifications_panel">توسيع لوحة الاشعارات</string> <string name="list_other_expand_notifications_panel">توسيع لوحة الاشعارات</string>
<string name="tutorial_app_list_text">يمكنك البحث بسرعة في جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتحها، أو اربطها بإيماءة مختلفة.</string> <string name="tutorial_app_list_text">يمكنك البحث بسرعة من خلال جميع التطبيقات في قائمة التطبيقات.\n\nاسحب لأعلى لفتح القائمة، أو ربطها بإيماءة ما.</string>
<string name="alert_lock_screen_failed">خطأ: فشل في قفل الشاشة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف)</string> <string name="alert_lock_screen_failed">خطأ: فشل في قفل الشاشة. (إذا قمت للتو بترقية التطبيق ، فحاول تعطيل خدمة الوصول وإعادة تمكينها في إعدادات الهاتف)</string>
<string name="settings_gesture_description_down_right_edge">اسحب إلى الأسفل من حافة الشاشة اليمنى</string> <string name="settings_gesture_description_down_right_edge">اسحب إلى الأسفل من حافة الشاشة اليمنى</string>
<string name="settings_theme_font_item_serif_monospace">أحادي المسافة مذيل</string> <string name="settings_theme_font_item_serif_monospace">أحادي المسافة مذيل</string>
@ -257,7 +257,7 @@
<string name="dialog_report_bug_info">شكرا لك على المساعدة في تحسين μLauncher!\nيرجى إضافة المعلومات التالية إلى تقرير الأخطاء الخاص بك:</string> <string name="dialog_report_bug_info">شكرا لك على المساعدة في تحسين μLauncher!\nيرجى إضافة المعلومات التالية إلى تقرير الأخطاء الخاص بك:</string>
<string name="settings_meta_contact">اتصل بالمطور الأصلي</string> <string name="settings_meta_contact">اتصل بالمطور الأصلي</string>
<string name="list_other_volume_down">اخفض الصوت</string> <string name="list_other_volume_down">اخفض الصوت</string>
<string name="tutorial_usage_text_2">يمكنك تشغيل أهم تطبيقاتك بإيماءات اللمس أو الضغط على الأزرار.</string> <string name="tutorial_usage_text_2">يمكنك تشغيل أهم تطبيقاتك بوسطة إيماءات اللمس أو الضغط على الأزرار.</string>
<string name="settings_enabled_gestures_edge_swipe_summary">اسحب من حواف الشاشة</string> <string name="settings_enabled_gestures_edge_swipe_summary">اسحب من حواف الشاشة</string>
<string name="toast_lock_screen_not_supported">خطأ: قفل الشاشة باستخدام إمكانية الوصول غير مدعوم على هذا الجهاز. الرجاء استخدام طريقة مسؤول الجهاز بدلاً من ذلك.</string> <string name="toast_lock_screen_not_supported">خطأ: قفل الشاشة باستخدام إمكانية الوصول غير مدعوم على هذا الجهاز. الرجاء استخدام طريقة مسؤول الجهاز بدلاً من ذلك.</string>
<string name="accessibility_service_description">يتيح تعيين μlauncher كخدمة إمكانية الوصول قفل الشاشة وفتح قائمة التطبيقات الحديثة. يرجى ملاحظة أنه يتطلب كمية كبيرة من الأذونات. يجب ألا تمنح مثل هذه الأذونات باستخفاف لأي تطبيق. سوف يستخدم μlauncher خدمة إمكانية الوصول فقط لأداء الإجراءات التالية عند طلب المستخدم: * قفل شاشة * فتح التطبيقات الحديثة μlauncher لن يستخدم أبدًا خدمة إمكانية الوصول لجمع البيانات. يمكنك التحقق من شيفرة المصدر للتأكد. يرجى ملاحظة أنه يمكنك قفل الشاشة من خلال منح أذونات مسؤول الجهاز، لكنها لا تعمل مع بصمات الأصابع وفتح الوجه.</string> <string name="accessibility_service_description">يتيح تعيين μlauncher كخدمة إمكانية الوصول قفل الشاشة وفتح قائمة التطبيقات الحديثة. يرجى ملاحظة أنه يتطلب كمية كبيرة من الأذونات. يجب ألا تمنح مثل هذه الأذونات باستخفاف لأي تطبيق. سوف يستخدم μlauncher خدمة إمكانية الوصول فقط لأداء الإجراءات التالية عند طلب المستخدم: * قفل شاشة * فتح التطبيقات الحديثة μlauncher لن يستخدم أبدًا خدمة إمكانية الوصول لجمع البيانات. يمكنك التحقق من شيفرة المصدر للتأكد. يرجى ملاحظة أنه يمكنك قفل الشاشة من خلال منح أذونات مسؤول الجهاز، لكنها لا تعمل مع بصمات الأصابع وفتح الوجه.</string>
@ -288,13 +288,11 @@
يمكنك تغيير اختيارك لاحقًا في الإعدادات. يمكنك تغيير اختيارك لاحقًا في الإعدادات.
]]></string> ]]></string>
<string name="widget_clock_description">الساعة الافتراضية لـ μLauncher</string> <string name="widget_clock_description">الساعة الافتراضية لـ μLauncher</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[ <string name="dialog_select_widget_panel_info_no_panels">&lt;![CDATA[لم يتم العثور على لوحات عناصر واجهة المستخدم. يمكنك إنشاء لوحات الأدوات في الإعدادات &gt; المشغّل &gt; إدارة لوحات الأدوات.]].</string>
لم يتم العثور على أي لوحات أدوات. يمكنك إنشاء لوحات أدوات في الإعدادات > المشغل > إدارة لوحات الأدوات.
]]></string>
<string name="select_widget_title">اختر الأداة</string> <string name="select_widget_title">اختر الأداة</string>
<string name="widget_menu_remove">إزالة</string> <string name="widget_menu_remove">إزالة</string>
<string name="widget_menu_configure">تهيئة</string> <string name="widget_menu_configure">تهيئة</string>
<string name="widget_menu_enable_interaction">تمكين التفاعل</string> <string name="widget_menu_enable_interaction">Enable Interaction</string>
<string name="widget_menu_disable_interaction">تعطيل التفاعل</string> <string name="widget_menu_disable_interaction">تعطيل التفاعل</string>
<string name="widget_clock_label">ساعة</string> <string name="widget_clock_label">ساعة</string>
<string name="manage_widget_panels_delete">حذف</string> <string name="manage_widget_panels_delete">حذف</string>
@ -307,35 +305,12 @@
<string name="alert_widget_panel_not_found">لم تعد لوحة الأدوات هذه موجودة.</string> <string name="alert_widget_panel_not_found">لم تعد لوحة الأدوات هذه موجودة.</string>
<string name="settings_launcher_section_widgets">الأدوات</string> <string name="settings_launcher_section_widgets">الأدوات</string>
<plurals name="widget_panel_number_of_widgets"> <plurals name="widget_panel_number_of_widgets">
<item quantity="zero">يحتوي على %1$dأداة.</item> <item quantity="zero">يحتوي على %d أداة.</item>
<item quantity="one">يحتوي على %1$d أداة.</item> <item quantity="one">يحتوي على %d أداة.</item>
<item quantity="two">يحتوي على %1$d أدوات.</item> <item quantity="two">يحتوي على %d أدوات.</item>
<item quantity="few">يحتوي على%1$d أدوات.</item> <item quantity="few">يحتوي على %d أدوات.</item>
<item quantity="many">يحتوي على %1$d أداة.</item> <item quantity="many">يحتوي على %d أداة.</item>
<item quantity="other">يحتوي على%1$d أداة.</item> <item quantity="other"></item>
</plurals> </plurals>
<string name="settings_functionality_auto_close_keyboard">إغلاق لوحة المفاتيح عند التمرير</string> <string name="settings_functionality_auto_close_keyboard">إغلاق لوحة المفاتيح عند التمرير</string>
<string name="crash_info"><![CDATA[
يبدو أن هناك خطأ ما، نعتذر عن ذلك!<br><br>
لأسباب تتعلق بالخصوصية، لا يتم جمع سجلات الأعطال تلقائيًا.<br>
ومع ذلك، فإن السجلات مفيدة جدًا لتصحيح الأخطاء، لذا سأكون ممتنًا جدًا إذا كان بإمكانك إرسال السجل المرفق عبر البريد
أو إنشاء تقرير عن الخطأ على GitHub.<br><br>
يرجى ملاحظة أن سجلات الأعطال قد تحتوي على <strong>معلومات حساسة</strong>، مثل اسم التطبيق الذي حاولت تشغيله.
يرجى <strong>حذف</strong> مثل هذه المعلومات قبل إرسال التقرير.
<h2>ماذا يمكنني أن أفعل الآن؟</h2>
إذا ظهر هذا الخطأ مرة أخرى، يمكنك تجربة عدة أشياء:
<ul>
<li>إيقاف μLauncher بالقوة</li>
<li>مسح بيانات μLauncher&#39;s (<strong>ستفقد إعداداتك!</strong>)</li>
<li>تثبيت إصدار أقدم (<a href="https://github.com/jrpie/Launcher/releases">GitHub</a>, <a href="https://f-droid.org/en/packages/de.jrpie.android.launcher">F-Droid</a>)</li>
</ul>
]]></string>
<string name="notification_crash_title">تعطل μLauncher</string>
<string name="notification_crash_explanation">آسف! انقر للحصول على مزيد من المعلومات.</string>
<string name="report_crash_button_copy">نسخ تقرير التعطل إلى الحافظة</string>
<string name="report_crash_button_mail">إرسال التقرير بالبريد</string>
<string name="report_crash_button_report">إنشاء تقرير خطأ على GitHub</string>
<string name="report_crash_title">تعطل μLauncher</string>
<string name="send_email">إرسال بريد إلكتروني</string>
<string name="notification_channel_crash">الأعطال ومعلومات التصحيح</string>
</resources> </resources>

View file

@ -312,28 +312,4 @@
<string name="settings_launcher_section_widgets">Widget</string> <string name="settings_launcher_section_widgets">Widget</string>
<string name="dialog_select_widget_panel_title">Seleziona pannello widget</string> <string name="dialog_select_widget_panel_title">Seleziona pannello widget</string>
<string name="dialog_select_widget_panel_info_no_panels"><![CDATA[Nessun pannello widget trovato. Puoi creare pannelli widget da Impostazioni > Launcher > Gestione Pannelli Widget.]]></string> <string name="dialog_select_widget_panel_info_no_panels"><![CDATA[Nessun pannello widget trovato. Puoi creare pannelli widget da Impostazioni > Launcher > Gestione Pannelli Widget.]]></string>
<string name="settings_meta_view_docs">Documentazione</string>
<string name="notification_crash_explanation">Scusa! Clicca per altre info.</string>
<string name="notification_crash_title">µLauncher è crashato</string>
<string name="report_crash_button_copy">Copia il rapporto del crash negli appunti</string>
<string name="report_crash_button_mail">Invia il rapporto per email</string>
<string name="report_crash_button_report">Crea un bug report in GitHub</string>
<string name="report_crash_title">µLauncher è crashato</string>
<string name="send_email">Invia email</string>
<string name="notification_channel_crash">Info su crash e debug</string>
<string name="crash_info"><![CDATA[
Sembra che qualcosa sia andato storto, mi scuso per questo!<br><br>
Per motivi di privacy, i log dei crash non sono raccolti automaticamente.<br>
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.<br><br>
Nota che i crash log potrebbero contenere <strong>informazioni sensibili</strong>, come il nome dell\'app che hai provato ad avviare.
Please <strong>redact</strong> such information before sending the report.
<h2>What can I do now?</h2>
If this bug appears again and again, you can try several things:
<ul>
<li>Force stop μLauncher</li>
<li>Clear μLauncher\'s storage (<strong>Your settings will be lost!</strong>)</li>
<li>Install an older version (<a href=\"https://github.com/jrpie/Launcher/releases\">GitHub</a>, <a href=\"https://f-droid.org/en/packages/de.jrpie.android.launcher\">F-Droid</a>)</li>
</ul>
]]></string>
</resources> </resources>

View file

@ -260,7 +260,7 @@
<string name="settings_gesture_swipe_v_reverse">V反向</string> <string name="settings_gesture_swipe_v_reverse">V反向</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[>(反向)]]></string> <string name="settings_gesture_swipe_larger_reverse"><![CDATA[>(反向)]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[<(反向)]]></string> <string name="settings_gesture_swipe_smaller_reverse"><![CDATA[<(反向)]]></string>
<string name="settings_functionality_auto_launch_summary">后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。</string> <string name="settings_functionality_auto_launch_summary">启后将直接启动搜索所匹配到的应用,可以通过在搜索内容前添加空格来临时停用该功能。</string>
<string name="settings_list_layout">应用程序列表样式</string> <string name="settings_list_layout">应用程序列表样式</string>
<string name="pin_shortcut_button_bind">绑定到手势</string> <string name="pin_shortcut_button_bind">绑定到手势</string>
<string name="list_other_track_play_pause">音乐:播放 / 暂停</string> <string name="list_other_track_play_pause">音乐:播放 / 暂停</string>
@ -287,7 +287,7 @@
<string name="settings_functionality_auto_close_keyboard">滚动应用程序列表时自动隐藏键盘</string> <string name="settings_functionality_auto_close_keyboard">滚动应用程序列表时自动隐藏键盘</string>
<string name="settings_widgets_widgets">设置小部件</string> <string name="settings_widgets_widgets">设置小部件</string>
<string name="widget_menu_remove">删除</string> <string name="widget_menu_remove">删除</string>
<string name="widget_menu_enable_interaction">交互功能</string> <string name="widget_menu_enable_interaction">启交互功能</string>
<string name="widget_menu_disable_interaction">关闭交互功能</string> <string name="widget_menu_disable_interaction">关闭交互功能</string>
<string name="widget_clock_label">时钟</string> <string name="widget_clock_label">时钟</string>
<string name="manage_widget_panels_delete">删除</string> <string name="manage_widget_panels_delete">删除</string>
@ -303,31 +303,4 @@
<string name="widget_clock_description">μLauncher 默认时钟小部件</string> <string name="widget_clock_description">μLauncher 默认时钟小部件</string>
<string name="select_widget_title">选择小部件</string> <string name="select_widget_title">选择小部件</string>
<string name="settings_widgets_custom_panels">设置小部件面板</string> <string name="settings_widgets_custom_panels">设置小部件面板</string>
<string name="dialog_ok">确认</string>
<plurals name="widget_panel_number_of_widgets">
<item quantity="other">包含 %1$d 个小部件。</item>
</plurals>
<string name="notification_crash_title">μLauncher 崩溃了</string>
<string name="notification_crash_explanation">抱歉!点击查看更多信息。</string>
<string name="report_crash_button_copy">复制崩溃报告到剪贴板</string>
<string name="report_crash_button_mail">通过 Email 发送报告</string>
<string name="report_crash_title">μLauncher 崩溃了</string>
<string name="report_crash_button_report">在 GitHub 上创建错误反馈</string>
<string name="send_email">发送 Email</string>
<string name="notification_channel_crash">崩溃和调试信息</string>
<string name="crash_info"><![CDATA[
发生了一些错误,非常抱歉!<br><br>
出于保护隐私的考量,默认不会记录崩溃日志。<br>
但是,日志对应用调试非常有帮助,若您原意,请将所附日志文件通过 Email 发送给我,
或在 GitHub 上创建错误报告,非常感谢!<br><br>
请注意,崩溃日志可能包含<strong>敏感信息</strong>,如,您尝试启动的应用名称。
因此,请在发送报告前,先将此类信息<strong>去除</strong>
<h2>我现在应该怎么做?</h2>
如果这个错误重复发生,您可以做如下尝试:
<ul>
<li>强行停止 μLauncher</li>
<li>清空 μLauncher 的存储空间(<strong>您的设置将被重置!</strong></li>
<li>安装旧版本(<a href=\"https://github.com/jrpie/Launcher/releases\">GitHub</a>, <a href=\"https://f-droid.org/en/packages/de.jrpie.android.launcher\">F-Droid</a></li>
</ul>
]]></string>
</resources> </resources>

View file

@ -11,5 +11,9 @@
<color name="lightTheme_background_color">#fff</color> <color name="lightTheme_background_color">#fff</color>
<color name="lightTheme_accent_color">#9999ff</color> <color name="lightTheme_accent_color">#9999ff</color>
<color name="lightTheme_text_color">#000</color> <color name="lightTheme_text_color">#000</color>
<color name="light_blue_400">#FF29B6F6</color>
<color name="light_blue_600">#FF039BE5</color>
<color name="gray_400">#FFBDBDBD</color>
<color name="gray_600">#FF757575</color>
</resources> </resources>

View file

@ -1,5 +1,11 @@
<resources> <resources>
<!-- Default screen margins, per the Android Design guidelines. --> <!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="appbar_padding">16dp</dimen> <dimen name="appbar_padding">16dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="appbar_padding_top">8dp</dimen>
<dimen name="app_icon_side">40dip</dimen> <dimen name="app_icon_side">40dip</dimen>
<dimen name="app_action_height">48dip</dimen>
</resources> </resources>

View file

@ -444,16 +444,4 @@
<string name="send_email">Send Email</string> <string name="send_email">Send Email</string>
<string name="notification_channel_crash">Crashes and Debug Information</string> <string name="notification_channel_crash">Crashes and Debug Information</string>
<string name="settings_meta_view_docs">Documentation</string> <string name="settings_meta_view_docs">Documentation</string>
<!--
-
- Content Descriptions
-
-->
<string name="content_description_add_widget">Add widget</string>
<string name="content_description_add_widget_panel">Add widget panel</string>
<string name="content_description_close">Close</string>
<string name="content_description_navigate_back">Navigate back</string>
<string name="content_description_navigate_next">Navigate next</string>
<string name="content_description_lock">Lock</string>
<string name="content_description_settings_actions_row_button_remove">Remove binding</string>
</resources> </resources>

View file

@ -5,7 +5,7 @@
# Actions and Gestures # Actions and Gestures
µLauncher's central mechanism for accessing important functionality quickly µ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. 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 - 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. 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. 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. If private space is set up, an icon to (un)lock it is shown on the top right.
- Open µLauncher's settings - Open µLauncher's settings
- Toggle private space lock - Toggle private space lock
- Lock the screen: This allows you to lock the screen. - 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. There are two mechanisms by which the screen can be locked, accessibility service and device admin.
- Toggle the flashlight - Toggle the flashlight
- Raise, lower, or adjust volume - Raise, lower or adjust volume
- Play or pause media playback - Play or pause media playback
- Skip to previous or next audio track - Skip to previous or next audio track
- Open notifications panel: Might be useful if the top of your screen is broken. - Open notifications panel: Might be useful if the top of your screen is broken.
- Open quick settings panel: Why swipe down twice? - 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. - 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.

View file

@ -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 **Inclusion criteria:** Apps in this list must be [open source](https://opensource.org/licenses) and maintained
<!-- New contributors, please reference https://www.markdownguide.org/basic-syntax/ --> <!-- New contributers, please reference https://www.markdownguide.org/basic-syntax/ -->
<!-- TEMPLATE <!-- TEMPLATE
@ -43,7 +43,7 @@ This is a comparison of open-source home screens for Android.
### Discreet Launcher ### Discreet Launcher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Website](https://vincent-falzon.com/) | [Repository](https://github.com/falzonv/discreet-launcher) | [F-Droid](https://f-droid.org/en/packages/com.vincent_falzon.discreetlauncher/) [Website](https://vincent-falzon.com/) | [Repository](https://github.com/falzonv/discreet-launcher) | [F-Droid](https://f-droid.org/en/packages/com.vincent_falzon.discreetlauncher/)
**Main mode of interaction:** `app grid` **Main mode of interaction:** `app grid`
@ -67,7 +67,7 @@ This is a comparison of open-source home screens for Android.
### Fossify ### Fossify
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Website](https://www.fossify.org/) | [Repository](https://github.com/FossifyOrg/Launcher) | [F-Droid](https://f-droid.org/en/packages/org.fossify.home/) [Website](https://www.fossify.org/) | [Repository](https://github.com/FossifyOrg/Launcher) | [F-Droid](https://f-droid.org/en/packages/org.fossify.home/)
**Main mode of interaction:** `app grid` **Main mode of interaction:** `app grid`
@ -91,7 +91,7 @@ This is a comparison of open-source home screens for Android.
### Lawnchair ### Lawnchair
**License:** `Apache License 2.0` **License:** `Apache License 2.0`
[Website](https://lawnchair.app/) | [Repository](https://github.com/LawnchairLauncher/lawnchair) [Website](https://lawnchair.app/) | [Repository](https://github.com/LawnchairLauncher/lawnchair)
Seems to be a regular (grid of apps) launcher. Seems to be a regular (grid of apps) launcher.
@ -119,7 +119,7 @@ Seems to be a regular (grid of apps) launcher.
> **Abandoned** > **Abandoned**
**License:** `Apache License 2.0` **License:** `Apache License 2.0`
[Repository](https://github.com/amirzaidi/Launcher3) [Repository](https://github.com/amirzaidi/Launcher3)
**Main mode of interaction:** `App grid` **Main mode of interaction:** `App grid`
@ -141,13 +141,13 @@ Seems to be a regular (grid of apps) launcher.
--- ---
## Search-Based ## Search based
### Aster Launcher ### Aster Launcher
> **Abandoned** > **Abandoned**
>
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Repository](https://github.com/neophtex/AsterLauncher) | [F-Droid](https://f-droid.org/en/packages/com.series.aster.launcher/) [Repository](https://github.com/neophtex/AsterLauncher) | [F-Droid](https://f-droid.org/en/packages/com.series.aster.launcher/)
**Main mode of interaction:** `search` **Main mode of interaction:** `search`
@ -171,7 +171,7 @@ Seems to be a regular (grid of apps) launcher.
### KISS Launcher ### KISS Launcher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Website](https://kisslauncher.com/) | [Repository](https://github.com/Neamar/KISS) | [F-Droid](https://f-droid.org/packages/fr.neamar.kiss/) [Website](https://kisslauncher.com/) | [Repository](https://github.com/Neamar/KISS) | [F-Droid](https://f-droid.org/packages/fr.neamar.kiss/)
**Main mode of interaction:** `Search` `Some gestures available` **Main mode of interaction:** `Search` `Some gestures available`
@ -194,10 +194,10 @@ Seems to be a regular (grid of apps) launcher.
--- ---
### Lunar Launcher ### Lunar Launcher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Repository](https://github.com/iamrasel/lunar-launcher) | [F-Droid](https://f-droid.org/en/packages/rasel.lunar.launcher/) [Repository](https://github.com/iamrasel/lunar-launcher) | [F-Droid](https://f-droid.org/en/packages/rasel.lunar.launcher/)
Even natively supports RSS feeds to the homescreen? Even natively supports RSS feeds to homescreen?
**Main mode of interaction:** `alphabet scroller` **Main mode of interaction:** `alphabet scroller`
@ -220,7 +220,7 @@ Even natively supports RSS feeds to the homescreen?
### OLauncher ### OLauncher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Repository](https://github.com/tanujnotes/Olauncher) | [F-Droid](https://f-droid.org/en/packages/app.olauncher/) [Repository](https://github.com/tanujnotes/Olauncher) | [F-Droid](https://f-droid.org/en/packages/app.olauncher/)
Extremely minimal launcher with lots of forks. Extremely minimal launcher with lots of forks.
@ -253,7 +253,7 @@ Extremely minimal launcher with lots of forks.
### TinyBit Launcher ### TinyBit Launcher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Repository](https://github.com/TBog/TBLauncher) | [F-Droid](https://f-droid.org/en/packages/rocks.tbog.tblauncher/) [Repository](https://github.com/TBog/TBLauncher) | [F-Droid](https://f-droid.org/en/packages/rocks.tbog.tblauncher/)
**Main mode of interaction:** `search` `some gestures` **Main mode of interaction:** `search` `some gestures`
@ -262,7 +262,7 @@ Extremely minimal launcher with lots of forks.
:white_check_mark: Search: `apps` `contacts` `web` `maps` `playstore` `youtube` :white_check_mark: Search: `apps` `contacts` `web` `maps` `playstore` `youtube`
:white_check_mark: Search history :white_check_mark: Search history
:white_check_mark: Customizable gestures: `tap` `double tap` `swipe up` `swipe left` `swipe right` `swipe down on left` `swipe down on right` :white_check_mark:Customizable gestures: `tap` `double tap` `swipe up` `swipe left` `swipe right` `swipe down on left` `swipe down on right`
:x: Folders :x: Folders
:white_check_mark: Tags :white_check_mark: Tags
:white_check_mark: Rename apps :white_check_mark: Rename apps
@ -277,7 +277,7 @@ Extremely minimal launcher with lots of forks.
### YAM Launcher ### YAM Launcher
**License:** `MIT` **License:** `MIT`
[Repository](https://codeberg.org/ottoptj/yamlauncher) | [F-Droid](https://f-droid.org/en/packages/eu.ottop.yamlauncher/) [Repository](https://codeberg.org/ottoptj/yamlauncher) | [F-Droid](https://f-droid.org/en/packages/eu.ottop.yamlauncher/)
Similar to OLauncher? Similar to OLauncher?
@ -301,11 +301,11 @@ Similar to OLauncher?
--- ---
## Directory-Based ## Directory based
### folder launcher ### folder launcher
**License:** `MIT` **License:** `MIT`
[Repository](https://github.com/Robby-Blue/SimpleFolderLauncher) | [F-Droid](https://f-droid.org/en/packages/me.robbyblue.mylauncher/) [Repository](https://github.com/Robby-Blue/SimpleFolderLauncher) | [F-Droid](https://f-droid.org/en/packages/me.robbyblue.mylauncher/)
**Main mode of interaction:** `directory navigation` **Main mode of interaction:** `directory navigation`
@ -329,7 +329,7 @@ Similar to OLauncher?
### Ion Launcher ### Ion Launcher
**License:** `GPL-3.0` **License:** `GPL-3.0`
[Repository](https://codeberg.org/zagura/ion-launcher) | [F-Droid](https://f-droid.org/en/packages/one.zagura.IonLauncher/) [Repository](https://codeberg.org/zagura/ion-launcher) | [F-Droid](https://f-droid.org/en/packages/one.zagura.IonLauncher/)
**Main mode of interaction:** `App grid` `Search` **Main mode of interaction:** `App grid` `Search`
@ -337,7 +337,7 @@ Similar to OLauncher?
#### Features: #### Features:
:warning: Search: `apps` `contacts: buggy/broken` :warning: Search: `apps` `contacts: buggy/broken`
:white_check_mark: Search history: `shows recently launched apps` :white_check_mark: Search history `shows recently launched apps`
:x: Customizable gestures :x: Customizable gestures
:warning: Folders `prebuilt` `not customizable` :warning: Folders `prebuilt` `not customizable`
:x: Tags :x: Tags
@ -351,11 +351,11 @@ Similar to OLauncher?
--- ---
## Gesture-Based ## Gesture based
### Pie Launcher ### Pie Launcher
**License:** `MIT` **License:** `MIT`
[Repository](https://github.com/markusfisch/PieLauncher) [Repository](https://github.com/markusfisch/PieLauncher)
**Main mode of interaction:** `Selection wheel` **Main mode of interaction:** `Selection wheel`
@ -379,7 +379,7 @@ Similar to OLauncher?
### µLauncher ### µLauncher
**License:** `MIT` **License:** `MIT`
[Repository](https://github.com/jrpie/launcher) | [F-Droid](https://f-droid.org/en/packages/de.jrpie.android.launcher/) [Repository](https://github.com/jrpie/launcher) | [F-Droid](https://f-droid.org/en/packages/de.jrpie.android.launcher/)
**Main mode of interaction:** `Gestures` `Search` **Main mode of interaction:** `Gestures` `Search`
@ -409,22 +409,22 @@ Similar to OLauncher?
:x: = Unsupported :x: = Unsupported
:warning: = Buggy/Broken; check this launcher's notes above :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 | 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: | | [µ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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [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: | | [Aster Launcher](#Aster-Launcher) | :warning: | :x: | :x: | :x: | :x: | :x: | :x: | :grey_question: | :white_check_mark: | :white_check_mark: | :x: | :x: |
<!-- Automating checkboxes for the table <!-- Automating checkboxes for the table

View file

@ -10,14 +10,14 @@ Besides regular apps, app drawers also show [pinned shortcuts](https://developer
&mu;Launcher treats apps and shortcuts in the same way. &mu;Launcher treats apps and shortcuts in the same way.
The idea of the app drawer is to search for apps using the keyboard. The idea of the app drawer is to search for apps using the keyboard.
By default[^2], an app is launched automatically once it is the only app matching the query. By default[^2] an app is launched automatically once it is the only app matching the query.
This can be prevented by typing a space. This can be prevented by typing space.
Usually, only two or three characters are needed, which is much faster than scrolling to find an app. Usually only two or three characters are needed which is much faster than scrolling to find an app.
[^1]: A pinned shortcut is created, for example, when pinning a website to the home screen. [^1]: A pinned shortcut is created for example when pinning a website to the home screen.
[^2]: There are [several settings](/docs/settings/#functionality) available to modify the behavior. [^2]: There are [several settings](/docs/settings/#functionality) available to modify the behavior.
When long-pressing an app, additional options are shown: When long clicking an app, additional options are shown:
* Rename the app * Rename the app
* Add to / remove from Favorites: Adds the app to the [Favorite Apps](#favorite-apps) list or removes it from there. * Add to / remove from Favorites: Adds the app to the [Favorite Apps](#favorite-apps) list or removes it from there.
* Hide / Show: This hides the app from all drawers (except from [Hidden Apps](#hidden-apps)) or makes it visible again if it was hidden. * Hide / Show: This hides the app from all drawers (except from [Hidden Apps](#hidden-apps)) or makes it visible again if it was hidden.
@ -27,26 +27,28 @@ When long-pressing an app, additional options are shown:
## All Apps ## All Apps
This lists all apps except hidden apps. This lists all apps except hidden apps.
By default, it is bound to `Swipe up`. By default it is bound to `Swipe up`.
## Favorite Apps ## Favorite Apps
Only shows favorite apps. Only shows favorite apps.
Pressing the star icon on the bottom right of any app drawer toggles whether only favorite apps should be shown. Pressing the star icon on the bottom right of any app drawer toggles whether
Additionally, the `Favorite Apps` action can be used to launch this drawer directly. only favorite apps should be shown.
By default, it is bound to `Swipe up (left edge)`. Additionally the `Favorite Apps` action can be used to launch this drawer directly.
By default it is bound to `Swipe up (left edge)`.
## Private Space ## Private Space
When [private space](/docs/profiles/#private-space) is available, this drawer When [private space](/docs/profiles/#private-space) is available, this drawer
shows only apps from the private space. shows only apps from the private space.
It can be opened using the `Private Space` action. It can be opened using the `Private Space` action.
If the private space is locked, instead of showing the list, the unlock dialog is shown. If the private space is locked, instead of showing the list the unlock dialog is shown.
By default, apps from the private space are shown in All Apps as well; however, this is [configurable](/docs/settings/#hide-private-space-from-app-list). By default, apps from the private space are shown in All Apps as well,
however this is [configurable](/docs/settings/#hide-private-space-from-app-list).
## Hidden Apps ## Hidden Apps
This list shows hidden apps. This list shows hidden apps.
It is only accessible through the settings. It is only accessible through the settings.
The feature is intended to be used only for apps that are not needed at all but [can not be uninstalled](https://en.wikipedia.org/wiki/Software_bloat#Bloatware). The feature is intended to be used only for apps which are not needed at all but [can not be uninstalled](https://en.wikipedia.org/wiki/Software_bloat#Bloatware).

View file

@ -17,7 +17,7 @@ cd Launcher
./gradlew assembleDefaultRelease ./gradlew assembleDefaultRelease
``` ```
This will create an APK file at `app/build/outputs/apk/default/release/app-default-release-unsigned.apk`. This will create an apk file at `app/build/outputs/apk/default/release/app-default-release-unsigned.apk`.
Note that you need to sign it: Note that you need to sign it:
@ -50,5 +50,5 @@ The [CI pipeline](https://github.com/jrpie/Launcher/actions) automatically creat
{{% hint warning %}} {{% hint warning %}}
Note: These builds are not signed. Note: These builds are not signed.
They are built in debug mode and are only suitable for testing. They are in built in debug mode and only suitable for testing.
{{% /hint %}} {{% /hint %}}

View file

@ -8,12 +8,12 @@ title = 'Differences to the original Launcher'
Here is an incomplete list of changes: Here is an incomplete list of changes:
<!--The last commit of the original project is [340ee731](https://github.com/jrpie/launcher/commit/340ee7315293b028c060638e058516435bca296a) <!--The last commit of the original project is [340ee731](https://github.com/jrpie/launcher/commit/340ee7315293b028c060638e058516435bca296a)
The first commit of µLauncher is [cc2e7710](https://github.com/jrpie/launcher/commit/cc2e7710c824549c367d97a81a1646d27c6c8993), The first commit of µLauncher is [cc2e7710](https://github.com/jrpie/launcher/commit/cc2e7710c824549c367d97a81a1646d27c6c8993),
which at the time was still intended as a patch for the launcher. which at the time was still intended as a patch for launcher.
The decision to create a hard fork was made two years later.--> The decision to create a hard fork was made two years later.-->
- Additional gestures: - Additional gestures:
- Back - Back
- V, Λ, <, > - V,Λ,<,>
- Edge gestures: There is a setting to allow distinguishing swiping at the edges of the screen from swiping in the center. - 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. - 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. - 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. - The font has been changed to [Hack][hack-font], other fonts can be selected.
- Font Awesome Icons were replaced by Material icons. - 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 ## 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. - The search bar was moved to the bottom of the screen.
## Technical ## Technical
- Improved gesture detection. - 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. - 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). - Dropped support for API < 21 (i.e. pre Lollypop)
- Fixed some bugs. - Fixed some bugs
- Some refactoring. - Some refactoring
The complete list of changes can be viewed [here](https://github.com/jrpie/launcher/compare/340ee731...master). The complete list of changes can be viewed [here](https://github.com/jrpie/launcher/compare/340ee731...master).

View file

@ -8,9 +8,9 @@
There are several ways to contribute to this app: There are several ways to contribute to this app:
* You can add or improve [translations][toolate]. * You can add or improve [translations][toolate].
<br><img src="https://toolate.othing.xyz/widget/jrpie-launcher/launcher/horizontal-auto.svg" alt="translation status"> <br><img src="https://toolate.othing.xyz/widget/jrpie-launcher/launcher/horizontal-auto.svg" alt="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: * You can implement a new feature yourself:
- Create a [fork][fork] of this repository. - 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. - 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. The [CI pipeline](https://github.com/jrpie/Launcher/actions) automatically creates debug builds.

View file

@ -7,14 +7,14 @@
Tweaks and customizations can be made from within the settings page. 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 &mu;Launcher for the first time) or from the settings icon in the app drawer.[^1] The settings can be opened by binding the Settings action to a gesture (this is especially useful when configuring &mu;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 ## Appearance
### Choose a wallpaper ### Choose a wallpaper
This triggers Android's mechanism to change the wallpaper using a photo app, file explorer, or native wallpaper setting app. 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. µLauncher uses the system-wide wallpaper, i.e. this change also affects other launchers.
### Font (in-app font) ### Font (in-app font)
@ -28,7 +28,7 @@ Set the font used within the app settings. This setting does not affect the date
**type:**&nbsp;`toggle` **type:**&nbsp;`toggle`
### Background (app list and settings) ### Background (app list and setting)
Defines which background should be used in app drawers, settings, etc. Defines which background should be used in app drawers, settings, etc.
to increase legibility. 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. * `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. * `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:**&nbsp;`dropdown` **type:**&nbsp;`dropdown`
@ -51,7 +51,7 @@ Remove coloring from all app icons. Can help decrease visual stimulus when enabl
## Date & Time ## 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. If the clock is removed, the settings are not used.
### Font (home screen) ### 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. Set the color for the home screen date and time.
Accepts a 6-digit RGB or 8-digit ARGB color code characters.[^2] 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. 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. 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:**&nbsp;`ARGB` **type:**&nbsp;`ARGB`
@ -110,7 +110,7 @@ Place the current time above the current date on the home screen.
### Launch search results ### 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. 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. 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 ### 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`** 1. **`Device Admin`**
@ -166,7 +166,7 @@ There are two methods to lock the screen, and unfortunately, both have downsides
- Requires excessive privileges. - Requires excessive privileges.
- μLauncher will use those privileges *only* for locking the screen. - μ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. - 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. - 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. 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:**&nbsp;`toggle` **type:**&nbsp;`toggle`
### Hide paused apps ### Hide paused apps
Remove paused apps from the app drawer. 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:**&nbsp;`toggle` **type:**&nbsp;`toggle`
### Hide private space from app list ### Hide private space from app list
Remove private space from the app drawer. 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. Private space apps can be accessed using a separate app drawer which can be opened with the Private Space action.
**type:**&nbsp;`toggle` **type:**&nbsp;`toggle`
@ -240,6 +240,6 @@ Remove the top status bar from the home screen.
### Hide navigation bar ### 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:**&nbsp;`toggle` **type:**&nbsp;`toggle`

View file

@ -7,7 +7,7 @@
&mu;Launcher allows to add [app widgets](https://developer.android.com/develop/ui/views/appwidgets/overview) to the home screen and to widget panels. &mu;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. It is configurable whether or not interaction with a widget should be enabled.
@ -17,7 +17,7 @@ However, &mu;Launcher [gestures](/docs/actions-and-gestures/) can not be execute
* If interaction is disabled, the widget does not respond to any touch events. * If interaction is disabled, the widget does not respond to any touch events.
This is recommended when using a widget only to display information. This is recommended when using a widget only to display information.
&mu;Launcher's clock behaves similarly to an app widget and can be managed in the same way.[^1] &mu;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. [^1]: However, it is technically not an app widget and cannot be used with other launchers.