This commit is contained in:
Josia Pietsch 2025-03-02 22:41:13 +01:00
commit bd1f999a0e
Signed by: jrpie
GPG key ID: E70B571D66986A2D
53 changed files with 743 additions and 68 deletions

View file

@ -59,6 +59,7 @@ The following gestures are available:
- swipe up / down / left / right,
- swipe with two fingers,
- swipe on the left / right resp. top / bottom edge,
- tap, then swipe up / down / left / right,
- draw < / > / V / Λ
- click on date / time,
- double click,

View file

@ -23,8 +23,8 @@ android {
minSdkVersion 21
targetSdkVersion 35
compileSdk 35
versionCode 37
versionName "0.0.21"
versionCode 38
versionName "0.0.22"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -95,6 +95,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.activity:activity:1.8.0'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'

View file

@ -19,6 +19,16 @@
android:supportsRtl="true"
android:theme="@style/launcherBaseTheme"
tools:ignore="UnusedAttribute">
<activity
android:name=".ui.PinShortcutActivity"
android:autoRemoveFromRecents="true"
android:excludeFromRecents="true"
android:exported="false">
<intent-filter>
<action android:name="android.content.pm.action.CONFIRM_PIN_SHORTCUT" />
<action android:name="android.content.pm.action.CONFIRM_PIN_APPWIDGET" />
</intent-filter>
</activity>
<activity
android:name=".ui.HomeActivity"
android:clearTaskOnLaunch="true"

View file

@ -137,6 +137,9 @@ class Application : android.app.Application() {
)
}
if (Build.VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
removeUnusedShortcuts(this)
}
loadApps()
}

View file

@ -9,7 +9,9 @@ import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.pm.LauncherApps
import android.content.pm.LauncherApps.ShortcutQuery
import android.content.pm.PackageManager
import android.content.pm.ShortcutInfo
import android.net.Uri
import android.os.Build
import android.os.Bundle
@ -18,8 +20,11 @@ import android.os.UserManager
import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.ShortcutAction
import de.jrpie.android.launcher.actions.shortcuts.PinnedShortcutInfo
import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.apps.DetailedAppInfo
import de.jrpie.android.launcher.apps.getPrivateSpaceUser
@ -81,6 +86,34 @@ fun getUserFromId(userId: Int?, context: Context): UserHandle {
return profiles.firstOrNull { it.hashCode() == userId } ?: profiles[0]
}
@RequiresApi(Build.VERSION_CODES.N_MR1)
fun removeUnusedShortcuts(context: Context) {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
fun getShortcuts(profile: UserHandle): List<ShortcutInfo>? {
return launcherApps.getShortcuts(
ShortcutQuery().apply {
setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED)
},
profile
)
}
val userManager = context.getSystemService(Service.USER_SERVICE) as UserManager
val boundActions: Set<PinnedShortcutInfo> =
Gesture.entries.mapNotNull { Action.forGesture(it) as? ShortcutAction }.map { it.shortcut }
.toSet()
try {
userManager.userProfiles.filter { !userManager.isQuietModeEnabled(it) }.forEach { profile ->
getShortcuts(profile)?.groupBy { it.`package` }?.forEach { (p, shortcuts) ->
launcherApps.pinShortcuts(p,
shortcuts.filter { boundActions.contains(PinnedShortcutInfo(it)) }
.map { it.id }.toList(),
profile
)
}
}
} catch (_: SecurityException) { }
}
fun openInBrowser(url: String, context: Context) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))

View file

@ -79,6 +79,13 @@ enum class Gesture(
R.array.default_up_right,
R.anim.bottom_up
),
TAP_AND_SWIPE_UP(
"action.tap_up",
R.string.settings_gesture_tap_up,
R.string.settings_gesture_description_tap_up,
R.array.default_up,
R.anim.bottom_up
),
SWIPE_UP_DOUBLE(
"action.double_up",
R.string.settings_gesture_double_up,
@ -107,6 +114,13 @@ enum class Gesture(
R.array.default_down_right,
R.anim.top_down
),
TAP_AND_SWIPE_DOWN(
"action.tap_down",
R.string.settings_gesture_tap_down,
R.string.settings_gesture_description_tap_down,
R.array.default_down,
R.anim.bottom_up
),
SWIPE_DOWN_DOUBLE(
"action.double_down",
R.string.settings_gesture_double_down,
@ -135,6 +149,13 @@ enum class Gesture(
R.array.default_messengers,
R.anim.right_left
),
TAP_AND_SWIPE_LEFT(
"action.tap_left",
R.string.settings_gesture_tap_left,
R.string.settings_gesture_description_tap_left,
R.array.default_messengers,
R.anim.right_left
),
SWIPE_LEFT_DOUBLE(
"action.double_left",
R.string.settings_gesture_double_left,
@ -163,6 +184,13 @@ enum class Gesture(
R.array.default_right_bottom,
R.anim.left_right
),
TAP_AND_SWIPE_RIGHT(
"action.tap_right",
R.string.settings_gesture_tap_right,
R.string.settings_gesture_description_tap_right,
R.array.default_right,
R.anim.left_right
),
SWIPE_RIGHT_DOUBLE(
"action.double_right",
R.string.settings_gesture_double_right,
@ -279,6 +307,17 @@ enum class Gesture(
}
}
fun getTapComboVariant(): Gesture {
return when (this) {
SWIPE_UP -> TAP_AND_SWIPE_UP
SWIPE_DOWN -> TAP_AND_SWIPE_DOWN
SWIPE_LEFT -> TAP_AND_SWIPE_LEFT
SWIPE_RIGHT -> TAP_AND_SWIPE_RIGHT
else -> this
}
}
fun isDoubleVariant(): Boolean {
return when (this) {
SWIPE_UP_DOUBLE,

View file

@ -0,0 +1,57 @@
package de.jrpie.android.launcher.actions
import android.app.Service
import android.content.Context
import android.content.pm.LauncherApps
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.os.Build
import de.jrpie.android.launcher.actions.shortcuts.PinnedShortcutInfo
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
@SerialName("action:shortcut")
class ShortcutAction(val shortcut: PinnedShortcutInfo) : Action {
override fun invoke(context: Context, rect: Rect?): Boolean {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
// TODO
return false
}
shortcut.getShortcutInfo(context)?.let {
launcherApps.startShortcut(it, rect, null)
}
// TODO: handle null
return true
}
override fun label(context: Context): String {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
return "?"
}
return shortcut.getShortcutInfo(context)?.longLabel?.toString() ?: "?"
}
override fun getIcon(context: Context): Drawable? {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
return null
}
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
return shortcut.getShortcutInfo(context)?.let { launcherApps.getShortcutBadgedIconDrawable(it, 0) }
}
override fun isAvailable(context: Context): Boolean {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
return false
}
return shortcut.getShortcutInfo(context) != null
}
override fun canReachSettings(): Boolean {
return false
}
}

View file

@ -0,0 +1,60 @@
package de.jrpie.android.launcher.actions.shortcuts
import android.app.Service
import android.content.ComponentName
import android.content.Context
import android.content.pm.LauncherApps
import android.content.pm.LauncherApps.ShortcutQuery
import android.content.pm.ShortcutInfo
import android.os.Build
import androidx.annotation.RequiresApi
import de.jrpie.android.launcher.getUserFromId
import kotlinx.serialization.Serializable
@RequiresApi(Build.VERSION_CODES.N_MR1)
@Serializable
class PinnedShortcutInfo(
val id: String,
val packageName: String,
val activityName: String,
val user: Int
) {
constructor(info: ShortcutInfo) : this(info.id, info.`package`, info.activity?.className ?: "", info.userHandle.hashCode())
fun getShortcutInfo(context: Context): ShortcutInfo? {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
return launcherApps.getShortcuts(
ShortcutQuery().apply {
setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED)
setPackage(packageName)
setActivity(ComponentName(packageName, activityName))
setShortcutIds(listOf(id))
},
getUserFromId(user, context)
)?.firstOrNull()
}
override fun equals(other: Any?): Boolean {
return (other as? PinnedShortcutInfo)?.let {
packageName == this.packageName &&
activityName == this.activityName &&
id == this.id &&
user == this.user
} ?: false
}
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + packageName.hashCode()
result = 31 * result + activityName.hashCode()
result = 31 * result + user
return result
}
override fun toString(): String {
return "PinnedShortcutInfo { package=$packageName, activity=$activityName, user=$user, id=$id}"
}
}

View file

@ -0,0 +1,128 @@
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
import android.content.res.Resources
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.ShortcutAction
import de.jrpie.android.launcher.actions.shortcuts.PinnedShortcutInfo
import de.jrpie.android.launcher.databinding.ActivityPinShortcutBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences
class PinShortcutActivity : AppCompatActivity(), UIObject {
private lateinit var binding: ActivityPinShortcutBinding
private var isBound = false
override fun onCreate(savedInstanceState: Bundle?) {
super<AppCompatActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate()
enableEdgeToEdge()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
finish()
return
}
binding = ActivityPinShortcutBinding.inflate(layoutInflater)
setContentView(binding.root)
val launcherApps = getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
val request = launcherApps.getPinItemRequest(intent)
if (request == null || request.requestType != PinItemRequest.REQUEST_TYPE_SHORTCUT) {
finish()
return
}
binding.pinShortcutLabel.text = request.shortcutInfo!!.shortLabel ?: "?"
binding.pinShortcutLabel.setCompoundDrawables(
launcherApps.getShortcutBadgedIconDrawable(request.shortcutInfo, 0).also {
val size = (40 * resources.displayMetrics.density).toInt()
it.setBounds(0,0, size, size)
}, null, null, null)
binding.pinShortcutButtonBind.setOnClickListener {
AlertDialog.Builder(this, R.style.AlertDialogCustom)
.setTitle(getString(R.string.pin_shortcut_button_bind))
.setView(R.layout.dialog_select_gesture)
.setNegativeButton(android.R.string.cancel, null)
.create().also { it.show() }.let { dialog ->
val viewManager = LinearLayoutManager(dialog.context)
val viewAdapter = GestureRecyclerAdapter (dialog.context) { gesture ->
if (!isBound) {
isBound = true
request.accept()
}
val editor = LauncherPreferences.getSharedPreferences().edit()
ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture(editor, gesture.id)
editor.apply()
dialog.dismiss()
}
dialog.findViewById<RecyclerView>(R.id.dialog_select_gesture_recycler).apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = viewAdapter
}
}
}
binding.pinShortcutClose.setOnClickListener { finish() }
}
override fun onStart() {
super<AppCompatActivity>.onStart()
super<UIObject>.onStart()
}
override fun getTheme(): Resources.Theme {
return modifyTheme(super.getTheme())
}
inner class GestureRecyclerAdapter(val context: Context, val onClick: (Gesture) -> Unit): RecyclerView.Adapter<GestureRecyclerAdapter.ViewHolder>() {
val gestures = Gesture.entries.filter { it.isEnabled() }.toList()
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val label = itemView.findViewById<TextView>(R.id.dialog_select_gesture_row_name)
val description = itemView.findViewById<TextView>(R.id.dialog_select_gesture_row_description)
val icon = itemView.findViewById<ImageView>(R.id.dialog_select_gesture_row_icon)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view: View = inflater.inflate(R.layout.dialog_select_gesture_row, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val gesture = gestures[position]
holder.label.text = gesture.getLabel(context)
holder.description.text = gesture.getDescription(context)
holder.icon.setImageDrawable(
Action.forGesture(gesture)?.getIcon(context)
)
holder.itemView.setOnClickListener {
onClick(gesture)
}
}
override fun getItemCount(): Int {
return gestures.size
}
}
}

View file

@ -240,6 +240,10 @@ class TouchGestureDetector(
gesture = gesture?.getEdgeVariant(Gesture.Edge.BOTTOM)
}
}
if (timeStart - lastTappedTime < 2 * DOUBLE_TAP_TIMEOUT) {
gesture = gesture?.getTapComboVariant()
}
gesture?.invoke(context)
}
}

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?android:textColor"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -2,9 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="?android:textColor"
android:pathData="M240,880Q207,880 183.5,856.5Q160,833 160,800L160,400Q160,367 183.5,343.5Q207,320 240,320L280,320L280,240Q280,157 338.5,98.5Q397,40 480,40Q563,40 621.5,98.5Q680,157 680,240L680,320L720,320Q753,320 776.5,343.5Q800,367 800,400L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM240,800L720,800Q720,800 720,800Q720,800 720,800L720,400Q720,400 720,400Q720,400 720,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800ZM480,680Q513,680 536.5,656.5Q560,633 560,600Q560,567 536.5,543.5Q513,520 480,520Q447,520 423.5,543.5Q400,567 400,600Q400,633 423.5,656.5Q447,680 480,680ZM360,320L600,320L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,320ZM240,800Q240,800 240,800Q240,800 240,800L240,400Q240,400 240,400Q240,400 240,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800Z"/>
android:viewportHeight="960">
<path
android:fillColor="?android:textColor"
android:pathData="M240,880Q207,880 183.5,856.5Q160,833 160,800L160,400Q160,367 183.5,343.5Q207,320 240,320L280,320L280,240Q280,157 338.5,98.5Q397,40 480,40Q563,40 621.5,98.5Q680,157 680,240L680,320L720,320Q753,320 776.5,343.5Q800,367 800,400L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM240,800L720,800Q720,800 720,800Q720,800 720,800L720,400Q720,400 720,400Q720,400 720,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800ZM480,680Q513,680 536.5,656.5Q560,633 560,600Q560,567 536.5,543.5Q513,520 480,520Q447,520 423.5,543.5Q400,567 400,600Q400,633 423.5,656.5Q447,680 480,680ZM360,320L600,320L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,320ZM240,800Q240,800 240,800Q240,800 240,800L240,400Q240,400 240,400Q240,400 240,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800Z" />
</vector>

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path

View file

@ -1,5 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="?android:textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
<path
android:fillColor="?android:textColor"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" />
</vector>

View file

@ -1,5 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp">
<path android:fillColor="?android:textColor" android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
<path
android:fillColor="?android:textColor"
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
</vector>

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,6 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -2,7 +2,6 @@
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -2,7 +2,6 @@
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.PinShortcutActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/pin_shortcut_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
app:elevation="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/list_heading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:minHeight="?actionBarSize"
android:padding="@dimen/appbar_padding"
android:text="@string/pin_shortcut_title"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
android:textSize="30sp"
app:layout_constraintEnd_toStartOf="@id/pin_shortcut_close"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/pin_shortcut_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:gravity="center"
android:includeFontPadding="true"
android:paddingLeft="16sp"
android:paddingRight="16sp"
android:src="@drawable/baseline_close_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/pin_shortcut_appbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="20dp"
android:orientation="vertical">
<TextView
android:id="@+id/pin_shortcut_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="50dp"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:minHeight="40dp"
tools:drawableLeft="@drawable/baseline_settings_24"
tools:text="Shortcut name" />
<!--
<Space
android:layout_width="match_parent"
android:layout_height="10dp" />
<CheckBox
android:id="@+id/pin_shortcut_switch_visible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColor"
android:text="@string/pin_shortcut_switch_visible" />
-->
<Space
android:layout_width="match_parent"
android:layout_height="10dp" />
<Button
android:id="@+id/pin_shortcut_button_bind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/pin_shortcut_button_bind" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialog_select_gesture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/dialog_select_gesture_recycler"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:fadeScrollbars="false"
app:fastScrollEnabled="true"
app:fastScrollHorizontalThumbDrawable="@drawable/fast_scroll_thumb_drawable"
app:fastScrollHorizontalTrackDrawable="@drawable/fast_scroll_track_drawable"
app:fastScrollVerticalThumbDrawable="@drawable/fast_scroll_thumb_drawable"
app:fastScrollVerticalTrackDrawable="@drawable/fast_scroll_track_drawable" >
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/dialog_select_gesture_row_container"
style="@style/AlertDialogCustom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:gravity="start"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/dialog_select_gesture_row_icon"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/dialog_select_gesture_row_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="15sp"
tools:text="Action label" />
<TextView
android:id="@+id/dialog_select_gesture_row_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="11sp"
android:visibility="visible"
tools:text="A verbose description of how to perform the action" />
</LinearLayout>
<ImageView
android:id="@+id/dialog_select_gesture_row_icon"
android:layout_width="@dimen/app_icon_side"
android:layout_height="@dimen/app_icon_side"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@drawable/baseline_flashlight_on_24"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -4,7 +4,7 @@
<string name="settings_launcher_section_appearance">Aspetto</string>
<string name="settings_apps_choose">Scegliere l\'applicazione</string>
<string name="settings_theme_color_theme">Tema</string>
<string name="tutorial_concept_text">Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni.\n\nNon contiene pagamenti, pubblicità o servizi di tracciamento.</string>
<string name="tutorial_concept_text">Questo launcher è progettato per essere minimale, efficiente e privo di distrazioni. Non contiene pagamenti, pubblicità o servizi di tracciamento.</string>
<string name="settings_theme_color_theme_item_default">Predefinito</string>
<string name="settings_apps_hide_bound_apps">Non mostrare applicazioni collegate a gesti nella lista delle app</string>
<string name="settings_list_layout_item_text">Testo</string>
@ -45,11 +45,11 @@
<string name="settings_gesture_description_double_down">Scorri verso il basso con due dita</string>
<string name="settings_gesture_left">Sinistra</string>
<string name="settings_gesture_description_left">Scorrere verso sinistra</string>
<string name="settings_gesture_double_left">Doppio a sinistra</string>
<string name="settings_gesture_double_left">Due dita verso sinistra</string>
<string name="settings_gesture_description_double_left">Scorrere verso sinistra con due dita</string>
<string name="settings_gesture_right">Destra</string>
<string name="settings_gesture_description_right">Scorri verso destra</string>
<string name="settings_gesture_double_right">Doppio a destra</string>
<string name="settings_gesture_double_right">Due dita verso destra</string>
<string name="settings_gesture_description_double_right">Scorri a destra con due dita</string>
<string name="settings_gesture_right_top_edge">Destra (in alto)</string>
<string name="settings_gesture_description_right_top_edge">Scorri verso destra sul bordo superiore dello schermo</string>
@ -125,12 +125,12 @@
<string name="tutorial_setup_text">Abbiamo impostato alcune app predefinite per te. Puoi modificarle ora se lo desideri:</string>
<string name="tutorial_setup_text_2">Puoi anche cambiare la tua selezione in seguito.</string>
<string name="tutorial_finish_title">Iniziamo!</string>
<string name="tutorial_finish_text">Sei pronto per iniziare!\n\nSpero questa applicazione ti risulti preziosa!\n\n- Finn (che ha ideato il launcher)\n\t e Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher)</string>
<string name="tutorial_finish_text">Sei pronto per iniziare! Spero questa applicazione ti risulti preziosa! - Finn (che ha ideato il launcher)\n \te Josia (che ha aggiunto qualche miglioramento e mantiene il fork μLauncher)</string>
<string name="tutorial_finish_button">Inizia</string>
<string name="settings">Impostazioni</string>
<string name="ic_menu_alt">Altre opzioni</string>
<string name="tutorial_usage_text_2">Puoi aprire le tue app facendo scorrere il dito sullo schermo o premendo un pulsante. Configura i gesti nella prossima slide.</string>
<string name="alert_cant_expand_status_bar_panel">Errore: impossibile espandere la barra di stato.\nQuesta azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo.</string>
<string name="alert_cant_expand_status_bar_panel">Errore: impossibile espandere la barra di stato. Questa azione utilizza funzionalità non incluse nelle API Android pubbliche. Sfortunatamente, non sembra funzionare sul tuo dispositivo.</string>
<string name="snackbar_app_hidden">Applicazione nascosta. Puoi renderla nuovamente visibile nelle impostazioni.</string>
<string name="toast_device_admin_not_enabled">µLauncher deve essere autorizzato come amministratore del dispositivo per bloccare lo schermo.</string>
<string name="device_admin_description">Abilita il blocco dello schermo</string>
@ -182,7 +182,7 @@
<string name="list_app_hidden_remove">Mostra</string>
<string name="list_app_rename">Rinomina</string>
<string name="list_removed">Le applicazioni selezionate sono state rimosse</string>
<string name="list_apps_search_hint">Cerca tra le applicazioni</string>
<string name="list_apps_search_hint">Cerca</string>
<string name="list_other_settings">Impostazioni μLauncher</string>
<string name="list_other_expand_notifications_panel">Espandi il pannello notifiche</string>
<string name="list_other_nop">Non fare niente</string>
@ -191,11 +191,50 @@
<string name="tutorial_title">Tutorial</string>
<string name="tutorial_start_text">Prenditi qualche secondo per imparare ad usare questo launcher!</string>
<string name="tutorial_concept_title">Concetto</string>
<string name="tutorial_concept_text_2">L\'app è open source (sotto licenza MIT) e disponibile su GitHub!\n\nVisita il nostro archivio!</string>
<string name="tutorial_concept_text_2">L\'app è open source (sotto licenza MIT) e disponibile su GitHub! Visita il nostro archivio!</string>
<string name="tutorial_usage_title">Utilizzo</string>
<string name="tutorial_usage_text">La schermata principale contiene solo data e ora. Nessuna distrazione.</string>
<string name="alert_requires_android_m">Questa funzione richiede Android 6.0 o successivi.</string>
<string name="alert_requires_android_m">Questa funzione richiede Android 6 o successivi.</string>
<string name="dialog_rename_ok">Ok</string>
<string name="dialog_rename_title">Rinomina %1$s</string>
<string name="list_not_removed">Impossibile rimuovere l\'applicazione</string>
<string name="settings_theme_color_theme_item_dynamic">Dinamico</string>
<string name="settings_clock_color">Colore</string>
<string name="settings_gesture_double_up">Due dita verso l\'alto</string>
<string name="dialog_consent_accessibility_privileges">Sono consapevole che questo concederà privilegi estesi a µLauncher.</string>
<string name="dialog_consent_accessibility_consent">Accetto che µLauncher utilizzi il servizio di accessibilità per fornire funzionalità non correlate all\'accessibilità.</string>
<string name="dialog_consent_accessibility_data_collection">Accetto che µLauncher non raccolga alcun dato.</string>
<string name="settings_apps_hide_paused_apps">Nascondi le app in pausa</string>
<string name="list_other_toggle_private_space_lock">Attiva/Disattiva Blocco Spazio Privato</string>
<string name="alert_requires_android_v">Questa funzionalità richiede Android 15 o successivi.</string>
<string name="dialog_select_color_red">Rosso</string>
<string name="dialog_select_color_alpha">Trasparente</string>
<string name="dialog_select_color_blue">Blu</string>
<string name="dialog_select_color_green">Verde</string>
<string name="dialog_select_color_ok">Ok</string>
<string name="dialog_select_color_color_hex">Colore</string>
<string name="dialog_choose_color_title">Scegli colore</string>
<string name="dialog_consent_accessibility_ok">Attiva Servizi di Accessibilità</string>
<string name="dialog_consent_accessibility_other_options">Sono consapevole che esistono altre opzioni (utilizzando i privilegi di amministratore del dispositivo o il pulsante di accensione).</string>
<string name="dialog_consent_accessibility_title">Attivazione dei Servizi di Accessibilità</string>
<string name="settings_functionality_search_web">Cerca su internet</string>
<string name="settings_functionality_search_web_summary">Premi invio durante la ricerca nell\'elenco delle app per avviare una ricerca su internet.</string>
<string name="list_apps_search_hint_no_auto_launch">Cerca (senza avvio automatico)</string>
<string name="settings_meta_licenses">Licenze Open Source</string>
<string name="legal_info_title">Licenze Open Source</string>
<string name="dialog_report_bug_title">Segnala un bug</string>
<string name="dialog_report_bug_info">Grazie per aver contribuito a migliorare µLauncher!\nSi prega di aggiungere le seguenti informazioni alla segnalazione del bug:</string>
<string name="dialog_report_bug_button_clipboard">Copia negli appunti</string>
<string name="dialog_report_bug_security_info">Non segnalare pubblicamente le vulnerabilità di sicurezza su GitHub, ma utilizza invece:</string>
<string name="dialog_cancel">Annulla</string>
<string name="settings_functionality_auto_launch_summary">Premi spazio per disabilitare temporaneamente questa funzionalità.</string>
<string name="dialog_report_bug_button_security">Segnala una vulnerabilità di sicurezza</string>
<string name="dialog_report_bug_create_report">Crea una segnalazione</string>
<string name="toast_private_space_locked">Spazio privato bloccato</string>
<string name="toast_private_space_unlocked">Spazio privato sbloccato</string>
<string name="toast_private_space_not_available">Spazio privato non disponibile</string>
<string name="toast_private_space_default_home_screen">µLauncher deve essere la schermata iniziale predefinita per accedere allo spazio privato.</string>
<string name="toast_activity_not_found_browser">Impossibile aprire l\'URL: nessun browser trovato.</string>
<string name="toast_activity_not_found_search_web">Non è stata trovata un\'applicazione per gestire la ricerca.</string>
<string name="dialog_consent_accessibility_text"><![CDATA[Stai per arrivare il servizio di accessibilità. Questo garantirà <strong>privilegi più ampi</strong> a µLauncher.<br/>µLauncher utilizzerà questi privilegi <strong>solo per bloccare lo schermo</strong>. µLauncher <strong>non raccoglierà mai alcun dato</strong>. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]></string>
</resources>

View file

@ -30,14 +30,14 @@
<string name="settings_gesture_double_left">2 dedos para esquerda</string>
<string name="settings_gesture_right">Para direita</string>
<string name="settings_gesture_double_right">2 dedos para direita</string>
<string name="settings_gesture_right_top_edge">Para direita (No topo)</string>
<string name="settings_gesture_right_top_edge">Para direita (no topo)</string>
<string name="settings_gesture_right_bottom_edge">Para direita (em baixo)</string>
<string name="settings_gesture_left_bottom_edge">Para esquerda (Em baixo)</string>
<string name="settings_gesture_left_top_edge">Para esquerda (No topo)</string>
<string name="settings_gesture_up_left_edge">Para cima (Borda esquerda)</string>
<string name="settings_gesture_up_right_edge">Para cima (Borda direita)</string>
<string name="settings_gesture_down_left_edge">Para baixo (Borda esquerda)</string>
<string name="settings_gesture_down_right_edge">Para baixo (Borda direita)</string>
<string name="settings_gesture_left_bottom_edge">Para esquerda (em baixo)</string>
<string name="settings_gesture_left_top_edge">Para esquerda (no topo)</string>
<string name="settings_gesture_up_left_edge">Para cima (borda esquerda)</string>
<string name="settings_gesture_up_right_edge">Para cima (borda direita)</string>
<string name="settings_gesture_down_left_edge">Para baixo (borda esquerda)</string>
<string name="settings_gesture_down_right_edge">Para baixo (borda direita)</string>
<string name="settings_gesture_vol_up">Aumento de volume</string>
<string name="settings_gesture_vol_down">Diminuição de volume</string>
<string name="settings_gesture_double_click">Toque duplo</string>
@ -62,7 +62,7 @@
<string name="settings_clock_date_visible">Mostrar Data</string>
<string name="settings_clock_localized">Use formato de data localizado</string>
<string name="settings_clock_flip_date_time">Inverter data e hora</string>
<string name="settings_theme_wallpaper">Escolha um papel de parede</string>
<string name="settings_theme_wallpaper">Escolha papel de parede</string>
<string name="settings_launcher_change_wallpaper">Alterar papel de parede</string>
<string name="settings_launcher_section_display">Exibição</string>
<string name="settings_display_screen_timeout_disabled">Manter a tela ligada</string>
@ -121,11 +121,11 @@
<string name="tutorial_concept_text">O Launcher foi criado para ser minimalista, eficiente e livre de distrações. Ele é livre de pagamentos, anúncios e serviços de rastreamento.</string>
<string name="tutorial_concept_text_2">O app é de código aberto (licença MIT) e está disponível no GitHub! Não deixe de conferir o repositório!</string>
<string name="tutorial_usage_title">Uso</string>
<string name="tutorial_usage_text">Sua tela inicial contém a data e hora local. Sem distração.</string>
<string name="tutorial_usage_text_2">Você pode iniciar seus aplicativos com um toque único ou pressionando um botão. Escolha algumas ações no próximo slide.</string>
<string name="tutorial_usage_text">Sua tela inicial contém a data e hora local. Sem distrações.</string>
<string name="tutorial_usage_text_2">Você pode iniciar seus aplicativos com um gesto único ou apertando um botão. Escolha algumas ações no próximo slide.</string>
<string name="tutorial_setup_title">Configurar</string>
<string name="tutorial_setup_text">Selecionamos alguns aplicativos padrão para você. Se quiser, você pode alterá-los agora:</string>
<string name="tutorial_setup_text_2">Você também pode alterar suas escolhas mais tarde.</string>
<string name="tutorial_setup_text_2">Você pode alterar suas escolhas mais tarde.</string>
<string name="tutorial_finish_title">Vamos lá!</string>
<string name="tutorial_finish_text">Tá todo pronto para começar! Espero que isso seja de grande valor para você! - Finn (que criou o Launcher) \te Josia (que fez algumas melhorias e tb mantém o fork do μLauncher)</string>
<string name="tutorial_finish_button">Começar</string>
@ -162,9 +162,9 @@
<string name="screen_lock_method_use_accessibility">Usar o Serviço de acessibilidade</string>
<string name="screen_lock_method_use_device_admin">Usar o Administrador do dispositivo</string>
<string name="screen_lock_method_dialog_title">Escolha um método de bloqueio</string>
<string name="settings_actions_lock_method">Escolha um método de bloqueio da tela</string>
<string name="settings_actions_lock_method">Escolha método de bloqueio da tela</string>
<string name="list_other_expand_settings_panel">Configurações rápidas</string>
<string name="alert_requires_android_m">Essa funcionalidade requer o Android 6.0 ou mais recente.</string>
<string name="alert_requires_android_m">Essa funcionalidade requer o Android 6 ou mais recente.</string>
<string name="alert_no_torch_found">Nenhuma câmera com lanterna detectada.</string>
<string name="toast_lock_screen_not_supported">Erro: O bloqueio da tela via Serviço de acessibilidade não é compatível com este aparelho. Tente usar Administrador do dispositivo como método alternativo.</string>
<string name="accessibility_service_description">Definindo µLauncher como Serviço de acessibilidade permite a ele bloquear a tela. Considere que é necessário conceder as permissões elevadas. Você nunca deveria autorizar essas permissões a qualquer aplicativo sem avaliação. O µLauncher usará o Serviço de acessibilidade somente para bloquear a tela. Você pode verificar o código-fonte para ter certeza. O bloqueio da tela também pode ser realizado dando ao µLauncher permissões de Administrador do dispositivo. Apesar de que esse método não funciona com impressão digital e desbloqueio facial.</string>
@ -260,7 +260,7 @@
<string name="legal_info_title">Licenças de código aberto</string>
<string name="settings_apps_hide_paused_apps">Ocultar apps pausados</string>
<string name="list_other_toggle_private_space_lock">Ativar o Espaço privado</string>
<string name="alert_requires_android_v">Essa funcionalidade requer o Android 15.0 ou mais recente.</string>
<string name="alert_requires_android_v">Essa funcionalidade requer o Android 15 ou mais recente.</string>
<string name="toast_private_space_locked">Espaço privado trancado</string>
<string name="toast_private_space_unlocked">Espaço privado liberado</string>
<string name="toast_private_space_not_available">Espaço privado indisponível</string>
@ -271,4 +271,14 @@
<string name="dialog_report_bug_create_report">Criar relatório</string>
<string name="dialog_report_bug_title">Relatar um bug</string>
<string name="dialog_report_bug_info">Obrigado por ajudar a melhorar o µLauncher!\nConsidere adicionar as seguintes informações ao relatório de bug:</string>
<string name="settings_functionality_auto_launch_summary">Toque no espaço para temporariamente desativar esta funcionalidade.</string>
<string name="toast_activity_not_found_browser">Não foi possível abrir a URL: nenhum navegador encontrado.</string>
<string name="toast_activity_not_found_search_web">Nenhum app encontrado para efetuar a pesquisa.</string>
<string name="settings_gesture_back">Voltar</string>
<string name="settings_gesture_description_back">Botão Voltar / gesto de Voltar</string>
<string name="settings_apps_hide_private_space_apps">Ocultar espaço privado na lista de apps</string>
<string name="list_title_private_space">Espaço privado</string>
<string name="list_other_list_private_space">Espaço privado</string>
<string name="tooltip_lock_private_space">Trancar espaço privado</string>
<string name="tooltip_unlock_private_space">Liberar espaço privado</string>
</resources>

View file

@ -29,18 +29,26 @@
<string name="settings_gesture_description_back">Back button / back gesture</string>
<string name="settings_gesture_up">Up</string>
<string name="settings_gesture_description_up">Swipe up</string>
<string name="settings_gesture_tap_up">Tap + Up</string>
<string name="settings_gesture_description_tap_up">Tap and swipe up</string>
<string name="settings_gesture_double_up">Double Up</string>
<string name="settings_gesture_description_double_up">Swipe up with two fingers</string>
<string name="settings_gesture_down">Down</string>
<string name="settings_gesture_description_down">Swipe down</string>
<string name="settings_gesture_tap_down">Tap + Down</string>
<string name="settings_gesture_description_tap_down">Tap and swipe down</string>
<string name="settings_gesture_double_down">Double Down</string>
<string name="settings_gesture_description_double_down">Swipe down with two fingers</string>
<string name="settings_gesture_left">Left</string>
<string name="settings_gesture_description_left">Swipe left</string>
<string name="settings_gesture_tap_left">Tap + Left</string>
<string name="settings_gesture_description_tap_left">Tap and swipe left</string>
<string name="settings_gesture_double_left">Double Left</string>
<string name="settings_gesture_description_double_left">Swipe left with two fingers</string>
<string name="settings_gesture_right">Right</string>
<string name="settings_gesture_description_right">Swipe right</string>
<string name="settings_gesture_tap_right">Tap + Right</string>
<string name="settings_gesture_description_tap_right">Tap and swipe right</string>
<string name="settings_gesture_double_right">Double Right</string>
<string name="settings_gesture_description_double_right">Swipe right with two fingers</string>
<string name="settings_gesture_right_top_edge">Right (Top)</string>
@ -62,19 +70,19 @@
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="settings_gesture_description_swipe_larger">Top left -> mid right -> bottom left</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (reverse)]]></string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Reverse)]]></string>
<string name="settings_gesture_description_swipe_larger_reverse">Bottom left -> mid right -> top left</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="settings_gesture_description_swipe_smaller">Top right -> mid left -> bottom right</string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (reverse)]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Reverse)]]></string>
<string name="settings_gesture_description_swipe_smaller_reverse">Bottom right -> mid left -> top right</string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_description_swipe_v">Top left -> bottom mid -> top right</string>
<string name="settings_gesture_swipe_v_reverse">V (reverse)</string>
<string name="settings_gesture_swipe_v_reverse">V (Reverse)</string>
<string name="settings_gesture_description_swipe_v_reverse">Top right -> bottom mid -> top left</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_gesture_description_swipe_lambda">Bottom left -> top mid -> bottom right</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (reverse)</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Reverse)</string>
<string name="settings_gesture_description_swipe_lambda_reverse">Bottom right -> top mid -> bottom left</string>
<string name="settings_gesture_vol_up">Volume Up</string>
@ -251,6 +259,11 @@
<string name="list_other_lock_screen">Lock Screen</string>
<string name="list_other_torch">Toggle Torch</string>
<!-- Pin shortcuts -->
<string name="pin_shortcut_title">Add Shortcut</string>
<string name="pin_shortcut_button_bind">Bind to gesture</string>
<string name="pin_shortcut_switch_visible">Show in app list</string>
<!--
-
- Tutorial

View file

@ -2,7 +2,7 @@
buildscript {
ext.kotlin_version = '2.0.0'
ext.android_plugin_version = '8.8.0'
ext.android_plugin_version = '8.8.1'
repositories {
google()
mavenCentral()
@ -10,7 +10,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:8.8.0'
classpath 'com.android.tools.build:gradle:8.8.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.android.tools.build:gradle:$android_plugin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"

View file

@ -11,7 +11,7 @@ Es handelt sich um einen Fork von <a href="https://f-droid.org/packages/com.finn
App Launcher</a>.
<b>Funktionen:</b>
* Aktionen können an 22 verschiedene Gesten gebunden werden.
* Aktionen können an 35 verschiedene Gesten gebunden werden.
* Die folgenden Aktionen stehen zur Verfügung:
- Eine App starten
- Alle Apps auflisten

View file

@ -0,0 +1 @@
µLauncher

View file

@ -0,0 +1,7 @@
* Fixed bug in detection of two finger gestures
* Added 8 new gestures: <,>,V,Λ and reversed versions
* Back is now treated as a regular gesture and can be assigned freely
* Improved support for private space
* Improved Portuguese translation (thank you, "Vossa Excelencia"!)
* Improved Turkish translation (thank you, Ahmet Çeliker!)
* Improved Italian translation (thank you, Nicola Bortoletto!)

View file

@ -10,7 +10,7 @@ This is a fork of the app <a href="https://f-droid.org/packages/com.finnmglas.la
by Finn M Glas.
Features:
* You can bind actions to 22 different gestures.
* You can bind actions to 35 different gestures.
* An action can be one of the following:
- Launch an app
- List all apps

View file

@ -1,23 +1,23 @@
O µLauncher é uma tela inicial que permite abrir aplicativos através gestos de deslize e botões físicos.
O µLauncher é uma tela inicial que permite abrir apps através de gestos e botões físicos.
O launcher é minimalista, eficiente e livre de distrações.
Sua tela inicial exibe apenas a data, hora e papel de parede.
A tela inicial mostra apenas a data, hora e papel de parede.
Ao usar Voltar ou deslize para cima (pode ser configurado depois) você abre a lista
com todos os aplicativos instalados, que podem ser encontrados rápido.
Ao usar botão Voltar ou gesto pra cima (pode ser redefinido depois)
você abre com facilidade e rapidez a lista com todos os apps instalados.
Esta é uma modificação do app <a href="https://f-droid.org/packages/com.finnmglas.launcher/">Launcher</a>
feita por Finn M Glas.
O app é uma modificação do <a href="https://f-droid.org/packages/com.finnmglas.launcher/">Launcher</a>
feito por Finn M Glas.
Funcionalidades:
* Você pode associar várias ações a 22 gestos diferentes.
* Também pode definir algumas das seguintes acções:
- Iniciar algum app
* Você pode associar várias ações a 35 gestos diferentes.
* Pode definir algumas das seguintes ações:
- Iniciar vários apps
- Listar todos aplicativos
- Listar apps favoritos
- Aumentar / diminuir o volume
- Música: faixa anterior / seguinte
- Música: passar pra faixa anterior / seguinte
- Bloquear a tela
- Ligar a lanterna
- Mostrar notificações / configurações rápidas
* Compatível com Perfil de trabalho, desta forma apps como Shelter podem ser usados.
* App é compatível com Perfil de trabalho e pode ser usado com apps tipo Shelter.

View file

@ -1 +1 @@
Uma tela inicial minimalista e sem distrações para Android.
Tela inicial minimalista e sem distrações para Android.

View file

@ -0,0 +1,15 @@
- Çince çeviri (teşekkürler, yzqzss!)
- Fransızca çeviri iyileştirildi (teşekkürler, toby-bro!)
- Almanca çeviri iyileştirildi
Tüm Uygulamalar:
- Uygulama listesindeki üç nokta kaldırıldı (bunun yerine uzun tıklama kullanın)
- Enter'a basıldığında sorguyla eşleşen ilk uygulama açılıyor
- Klavyeyi tam ekran modunda açarken oluşan hata için geçici çözüm düzeltildi
- Sistem uygulamaları için kaldırma seçeneği kaldırıldı
- Ana Sayfa Düğmesi artık düzgün çalışıyor
Ayarlar:
- Küçük ekranlar için ayarlar düzeltildi
- Hassasiyet ayarı kaldırıldı (herkes zaten maksimuma ayarlıyordu)
- Tarih ve saat ayarları yeniden düzenlendi

View file

@ -0,0 +1,8 @@
* Renk teması, yazı tipi, arka plan, monokrom simgeler için seçenekler eklendi
* Tarih ve saat için seçenekler eklendi
* Döndürmeye izin verme seçeneği eklendi
* İyileştirilmiş arama algoritması
* Brezilya Portekizcesine çeviri - teşekkürler, Jonatas de Almeida Barros!
* Ayarlardan seçilen uygulamaların kaybolmasına neden olan bir hata düzeltildi
* İyileştirilmiş kod kalitesi
* Güncellenmiş çeviriler

View file

@ -0,0 +1,4 @@
* Favori uygulamalar
* Uygulamaları gizleme seçeneği
* Birden fazla ana aktiviteye sahip uygulamalar için destek
* Küçük ekranlarda ayarların düzeni düzeltildi

View file

@ -0,0 +1 @@
hata düzeltme

View file

@ -0,0 +1,9 @@
* Matrix ve Discord'da sohbet
* Hareket algılama iyileştirildi
* Hareket açıklamaları iyileştirildi
* Yeni eylem: Ekranı kilitle - teşekkürler, yzqzss!
* Yeni eylem: Meşaleyi aç
* Yeni eylem: Hızlı ayarları
* Fransızca çevirisi iyileştirildi - teşekkürler, toby-bro!
* Portekizce çevirisi iyileştirildi - teşekkürler, "Vossa Excelencia"!
* Bazı hatalar düzeltildi

View file

@ -0,0 +1 @@
Ekranı kilitlemek için Cihaz Yöneticisi yerine Erişilebilirlik Hizmetini kullanma seçeneği eklendi.

View file

@ -0,0 +1,11 @@
* Uygulamaları yeniden adlandırma seçeneği
* Uygulama listesinden hareketlere bağlı uygulamaları otomatik olarak gizleme seçeneği
* Uygulama listesinden µLauncher'ı varsayılan olarak gizle
* Varsayılan uygulamaların seçimi iyileştirildi
* Açık tema (deneysel)
* Aramadaki hata düzeltildi
* Kilit ekranı iletişim kutusundaki hata düzeltildi (teşekkürler, yzqzss ve jeroen!)
* Portekizce çeviri güncellendi (teşekkürler, "Vossa Excelencia"!)
* Almanca çeviri güncellendi

View file

@ -0,0 +1,5 @@
* Uygulama listesi için alternatif düzenler (ızgara, metin)
* Hata düzeltildi: Uygulamaların yeniden adlandırılması artık düzgün çalışıyor
* Çince çeviri güncellendi (teşekkürler, yzqzss!)
* Portekizce çeviri güncellendi (teşekkürler, "Vossa Excelencia"!)

View file

@ -0,0 +1,9 @@
* Saat rengini seçme seçeneği
* Dinamik renk teması eklendi; açık tema kaldırıldı
* Erişilebilirlik hizmeti için onay iletişim kutusu eklendi
* Türkçe çeviri eklendi (teşekkürler, Ahmet Çeliker!)
* İtalyanca çeviri eklendi (teşekkürler, Samantha!)
* Portekizce çeviri iyileştirildi (teşekkürler, "Vossa Excelencia"!)
* Uygulama çekmecesinde hareketle gezinmeyle ilgili hata düzeltildi. Artık geri basıldığında çekmece hemen kapanıyor.

View file

@ -0,0 +1,6 @@
* Ayarlar için depolama biçimi yeniden düzenlendi. Eski biçim otomatik olarak dönüştürülecek.
* Uygulama listesinden web'de arama yapma seçeneği eklendi.
* Ekranı kilitlemek için tercih edilen yöntem olarak cihaz yöneticisini ayarlayın.
* Bir erişilebilirlik hizmetini etkinleştirmenin şifrelemeyle çakışabileceğine dair bir uyarı eklendi.
* Yeniden adlandırma iletişim kutusundaki bir hata düzeltildi.
* Kilit ekranı iletişim kutusu kaydırılabilir hale getirildi.

View file

@ -0,0 +1,6 @@
* yeni özellik: otomatik başlatmayı geçici olarak devre dışı bırakmak için boşluk içeren önek sorgusu
* iyileştirilmiş arama: sorguda görünmedikleri sürece diakritik işaretler artık yok sayılıyor. (Android 7+)
* açık kaynak lisanslarının listesi eklendi
* erişilebilirlik hizmeti uyarısı güncellendi
* iyileştirilmiş Fransızca çeviri (teşekkürler, Alexandre Ancel ve Nin Dan!)
* iyileştirilmiş Portekizce çeviri (teşekkürler, "Vossa Excelencia"!)

View file

@ -0,0 +1,8 @@
* private space için temel destek (Android 15)
* light tema yeniden tanıtıldı
* Portekizce çeviri iyileştirildi (teşekkürler, "Vossa Excelencia"!)
* Almanca çeviri iyileştirildi
* ayarlara sürüm adı eklendi
* hata raporları için iletişim kutusu
* saat performansı iyileştirildi
* bazı hatalar düzeltildi