Compare commits

...

16 commits

Author SHA1 Message Date
toolatebot
3e632c9892 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/
2025-03-15 00:07:18 +00:00
toolatebot
268acedb2c Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/
2025-03-15 00:07:18 +00:00
anmoti
4b756d47ee Translated using Weblate (Japanese)
Currently translated at 78.4% (200 of 255 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/ja/
2025-03-15 00:07:18 +00:00
anmoti
e323309cf9 Translated using Weblate (Japanese)
Currently translated at 17.6% (3 of 17 strings)

Translation: jrpie-Launcher/metadata
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/metadata/ja/
2025-03-15 00:07:18 +00:00
class0068
47a5476978 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.4% (251 of 255 strings)

Translation: jrpie-Launcher/Launcher
Translate-URL: https://toolate.othing.xyz/projects/jrpie-launcher/launcher/zh_Hans/
2025-03-15 00:07:18 +00:00
3597baee1f
fix problem which switching from grayscale icons back to normal
Some checks are pending
Android CI / build (push) Waiting to run
2025-03-14 22:33:08 +01:00
e02ca4091f
0.1.0 2025-03-14 16:35:41 +01:00
541e60356c
implement #98 - disable functionality because of Android bug: https://issuetracker.google.com/issues/352276244#comment5 2025-03-14 16:35:13 +01:00
492749a340
remove global variables from ListActivity 2025-03-14 16:03:59 +01:00
55af392706
add donate button
Some checks are pending
Android CI / build (push) Waiting to run
2025-03-14 15:40:06 +01:00
077ee4381a
lint 2025-03-14 15:27:26 +01:00
e250a58ef4
add new action: adjust volume 2025-03-14 13:37:41 +01:00
c7af387a94
implement #98 - hide lock icon when 'hide private space when locked' setting is set 2025-03-14 04:11:47 +01:00
6cd17343fc
show questionmark when unkown app or shortcut is bound to gesture 2025-03-14 04:09:28 +01:00
b156b68d53
improve German translation
Some checks are pending
Android CI / build (push) Waiting to run
2025-03-14 02:39:30 +01:00
c9ee2c6304
handle exception when acessing shortcuts 2025-03-14 02:00:42 +01:00
37 changed files with 587 additions and 202 deletions

View file

@ -23,8 +23,8 @@ android {
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 35 targetSdkVersion 35
compileSdk 35 compileSdk 35
versionCode 39 versionCode 40
versionName "0.0.23" versionName "0.1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View file

@ -10,6 +10,8 @@ import android.content.pm.ShortcutInfo
import android.os.AsyncTask import android.os.AsyncTask
import android.os.Build import android.os.Build
import android.os.Build.VERSION_CODES import android.os.Build.VERSION_CODES
import android.os.Handler
import android.os.Looper
import android.os.UserHandle import android.os.UserHandle
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@ -108,12 +110,10 @@ class Application : android.app.Application() {
// Try to restore old preferences // Try to restore old preferences
migratePreferencesToNewVersion(this) migratePreferencesToNewVersion(this)
// First time opening the app: set defaults and start tutorial // First time opening the app: set defaults
// The tutorial is started from HomeActivity#onStart, as starting it here is blocked by android
if (!LauncherPreferences.internal().started()) { if (!LauncherPreferences.internal().started()) {
resetPreferences(this) resetPreferences(this)
LauncherPreferences.internal().started(true)
openTutorial(this)
} }
@ -134,7 +134,8 @@ class Application : android.app.Application() {
it.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE) it.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)
} }
} }
ContextCompat.registerReceiver(this, profileAvailabilityBroadcastReceiver, filter, ContextCompat.registerReceiver(
this, profileAvailabilityBroadcastReceiver, filter,
ContextCompat.RECEIVER_EXPORTED ContextCompat.RECEIVER_EXPORTED
) )
} }

View file

@ -100,7 +100,7 @@ fun removeUnusedShortcuts(context: Context) {
}, },
profile profile
) )
} catch (e: IllegalStateException) { } catch (e: Exception) {
// https://github.com/jrpie/launcher/issues/116 // https://github.com/jrpie/launcher/issues/116
return null return null
} }
@ -135,9 +135,7 @@ fun openInBrowser(url: String, context: Context) {
} }
fun openTutorial(context: Context) { fun openTutorial(context: Context) {
context.startActivity(Intent(context, TutorialActivity::class.java).apply { context.startActivity(Intent(context, TutorialActivity::class.java))
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
} }
@ -196,7 +194,7 @@ fun getApps(
loadList.add(detailedAppInfo) loadList.add(detailedAppInfo)
} }
} }
loadList.sortBy { it.getCustomLabel(context).toString() } loadList.sortBy { it.getCustomLabel(context) }
var end = System.currentTimeMillis() var end = System.currentTimeMillis()
Log.i(LOG_TAG, "${loadList.size} apps loaded (${end - start}ms)") Log.i(LOG_TAG, "${loadList.size} apps loaded (${end - start}ms)")

View file

@ -13,6 +13,7 @@ import androidx.appcompat.content.res.AppCompatResources
import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.AppFilter
import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked
import de.jrpie.android.launcher.apps.isPrivateSpaceSupported import de.jrpie.android.launcher.apps.isPrivateSpaceSupported
import de.jrpie.android.launcher.apps.togglePrivateSpaceLock import de.jrpie.android.launcher.apps.togglePrivateSpaceLock
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
@ -66,7 +67,11 @@ enum class LauncherAction(
R.string.list_other_list_private_space, R.string.list_other_list_private_space,
R.drawable.baseline_security_24, R.drawable.baseline_security_24,
{ context -> { context ->
openAppsList(context, private = true) if ((context.applicationContext as Application).privateSpaceLocked.value != true
|| !hidePrivateSpaceWhenLocked(context)
) {
openAppsList(context, private = true)
}
}, },
available = { _ -> available = { _ ->
isPrivateSpaceSupported() isPrivateSpaceSupported()
@ -83,31 +88,37 @@ enum class LauncherAction(
"volume_up", "volume_up",
R.string.list_other_volume_up, R.string.list_other_volume_up,
R.drawable.baseline_volume_up_24, R.drawable.baseline_volume_up_24,
{ context -> audioVolumeAdjust(context, true)} { context -> audioVolumeAdjust(context, AudioManager.ADJUST_RAISE) }
), ),
VOLUME_DOWN( VOLUME_DOWN(
"volume_down", "volume_down",
R.string.list_other_volume_down, R.string.list_other_volume_down,
R.drawable.baseline_volume_down_24, R.drawable.baseline_volume_down_24,
{ context -> audioVolumeAdjust(context, false)} { context -> audioVolumeAdjust(context, AudioManager.ADJUST_LOWER) }
),
VOLUME_ADJUST(
"volume_adjust",
R.string.list_other_volume_adjust,
R.drawable.baseline_volume_adjust_24,
{ context -> audioVolumeAdjust(context, AudioManager.ADJUST_SAME) }
), ),
TRACK_PLAY_PAUSE( TRACK_PLAY_PAUSE(
"play_pause_track", "play_pause_track",
R.string.list_other_track_play_pause, R.string.list_other_track_play_pause,
R.drawable.baseline_play_arrow_24, R.drawable.baseline_play_arrow_24,
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)} { context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) }
), ),
TRACK_NEXT( TRACK_NEXT(
"next_track", "next_track",
R.string.list_other_track_next, R.string.list_other_track_next,
R.drawable.baseline_skip_next_24, R.drawable.baseline_skip_next_24,
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_NEXT)} { context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_NEXT) }
), ),
TRACK_PREV( TRACK_PREV(
"previous_track", "previous_track",
R.string.list_other_track_previous, R.string.list_other_track_previous,
R.drawable.baseline_skip_previous_24, R.drawable.baseline_skip_previous_24,
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PREVIOUS)} { context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PREVIOUS) }
), ),
EXPAND_NOTIFICATIONS_PANEL( EXPAND_NOTIFICATIONS_PANEL(
"expand_notifications_panel", "expand_notifications_panel",
@ -176,17 +187,13 @@ private fun audioManagerPressKey(context: Context, key: Int) {
} }
private fun audioVolumeAdjust(context: Context, louder: Boolean) { private fun audioVolumeAdjust(context: Context, direction: Int) {
val audioManager = val audioManager =
context.getSystemService(Context.AUDIO_SERVICE) as AudioManager context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.adjustStreamVolume( audioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC, AudioManager.STREAM_MUSIC,
if (louder) { direction,
AudioManager.ADJUST_RAISE
} else {
AudioManager.ADJUST_LOWER
},
AudioManager.FLAG_SHOW_UI AudioManager.FLAG_SHOW_UI
) )
} }

View file

@ -28,15 +28,20 @@ class PinnedShortcutInfo(
fun getShortcutInfo(context: Context): ShortcutInfo? { fun getShortcutInfo(context: Context): ShortcutInfo? {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
return launcherApps.getShortcuts( return try {
ShortcutQuery().apply { launcherApps.getShortcuts(
setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED) ShortcutQuery().apply {
setPackage(packageName) setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED)
setActivity(ComponentName(packageName, activityName)) setPackage(packageName)
setShortcutIds(listOf(id)) setActivity(ComponentName(packageName, activityName))
}, setShortcutIds(listOf(id))
getUserFromId(user, context) },
)?.firstOrNull() getUserFromId(user, context)
)?.firstOrNull()
} catch(_: Exception) {
// can throw SecurityException or IllegalStateException when profile is locked
null
}
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

View file

@ -91,10 +91,17 @@ fun isPrivateSpaceLocked(context: Context): Boolean {
val privateSpaceUser = getPrivateSpaceUser(context) ?: return false val privateSpaceUser = getPrivateSpaceUser(context) ?: return false
return userManager.isQuietModeEnabled(privateSpaceUser) return userManager.isQuietModeEnabled(privateSpaceUser)
} }
fun lockPrivateSpace(context: Context, lock: Boolean) { fun lockPrivateSpace(context: Context, lock: Boolean) {
if (!isPrivateSpaceSupported()) { if (!isPrivateSpaceSupported()) {
return return
} }
// silently return when trying to unlock but hide when locked is set
if (!lock && hidePrivateSpaceWhenLocked(context)) {
return
}
val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
val privateSpaceUser = getPrivateSpaceUser(context) ?: return val privateSpaceUser = getPrivateSpaceUser(context) ?: return
userManager.requestQuietModeEnabled(lock, privateSpaceUser) userManager.requestQuietModeEnabled(lock, privateSpaceUser)
@ -116,3 +123,17 @@ fun togglePrivateSpaceLock(context: Context) {
} }
} }
fun hidePrivateSpaceWhenLocked(context: Context): Boolean {
// Trying to access the setting as a 3rd party launcher raises a security exception.
// This is an Android bug: https://issuetracker.google.com/issues/352276244#comment5
// The logic for this is implemented.
// TODO: replace this once the Android bug is fixed
return false
// TODO: perhaps this should be cached
// https://cs.android.com/android/platform/superproject/main/+/main:packages/apps/Launcher3/src/com/android/launcher3/util/SettingsCache.java;l=61;drc=56bf7ad33bc9d5ed3c18e7abefeec5c177ec75d7
// val key = "hide_privatespace_entry_point"
// return Settings.Secure.getInt(context.contentResolver, key, 0) == 1
}

View file

@ -21,8 +21,10 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
r = R.class, r = R.class,
value = { value = {
@PreferenceGroup(name = "internal", prefix = "settings_internal_", suffix = "_key", value = { @PreferenceGroup(name = "internal", prefix = "settings_internal_", suffix = "_key", value = {
// set after the user finished the tutorial
@Preference(name = "started", type = boolean.class, defaultValue = "false"), @Preference(name = "started", type = boolean.class, defaultValue = "false"),
@Preference(name = "started_time", type = long.class), @Preference(name = "started_time", type = long.class),
// see PREFERENCE_VERSION in de.jrpie.android.launcher.preferences.Preferences.kt
@Preference(name = "version_code", type = int.class, defaultValue = "-1"), @Preference(name = "version_code", type = int.class, defaultValue = "-1"),
}), }),
@PreferenceGroup(name = "apps", prefix = "settings_apps_", suffix = "_key", value = { @PreferenceGroup(name = "apps", prefix = "settings_apps_", suffix = "_key", value = {

View file

@ -100,7 +100,7 @@ private fun migrateAppInfoStringMap(key: String) {
} }
}?.toMap(HashMap()) }?.toMap(HashMap())
)?.let { )?.let {
preferences.edit().putStringSet(key, it as Set<String>).apply() preferences.edit().putStringSet(key, it).apply()
} }
} }

View file

@ -11,6 +11,7 @@ import de.jrpie.android.launcher.preferences.serialization.SetAbstractAppInfoPre
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.util.HashSet import java.util.HashSet
import androidx.core.content.edit
/** /**
* Migrate preferences from version 3 (used until version 0.0.23) to the current format * Migrate preferences from version 3 (used until version 0.0.23) to the current format
@ -42,6 +43,7 @@ private fun migrateSetAppInfo(key: String, preferences: SharedPreferences, edito
deserializeSet(preferences.getStringSet(key, null))?.let { deserializeSet(preferences.getStringSet(key, null))?.let {
set.addAll(it) set.addAll(it)
} }
@Suppress("UNCHECKED_CAST")
editor.putStringSet( editor.putStringSet(
key, key,
serializer.serialize(set as java.util.Set<AbstractAppInfo>) as Set<String>? serializer.serialize(set as java.util.Set<AbstractAppInfo>) as Set<String>?
@ -60,6 +62,7 @@ private fun migrateMapAppInfoString(key: String, preferences: SharedPreferences,
deserializeMap(preferences.getStringSet(key, null))?.let { deserializeMap(preferences.getStringSet(key, null))?.let {
map.putAll(it) map.putAll(it)
} }
@Suppress("UNCHECKED_CAST")
editor.putStringSet(key, serializer.serialize(map) as Set<String>?) editor.putStringSet(key, serializer.serialize(map) as Set<String>?)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
@ -72,14 +75,11 @@ fun migratePreferencesFromVersion3() {
assert(LauncherPreferences.internal().versionCode() == 3) assert(LauncherPreferences.internal().versionCode() == 3)
val preferences = LauncherPreferences.getSharedPreferences() val preferences = LauncherPreferences.getSharedPreferences()
val editor = preferences.edit() preferences.edit {
migrateSetAppInfo(LauncherPreferences.apps().keys().favorites(), preferences, editor) migrateSetAppInfo(LauncherPreferences.apps().keys().favorites(), preferences, this)
migrateSetAppInfo(LauncherPreferences.apps().keys().hidden(), preferences, editor) migrateSetAppInfo(LauncherPreferences.apps().keys().hidden(), preferences, this)
migrateMapAppInfoString(LauncherPreferences.apps().keys().customNames(), preferences, editor) migrateMapAppInfoString(LauncherPreferences.apps().keys().customNames(), preferences, this)
}
editor.apply()
LauncherPreferences.internal().versionCode(4) LauncherPreferences.internal().versionCode(4)
} }

View file

@ -27,10 +27,14 @@ fun View.blink(
} }
// Taken from: https://stackoverflow.com/a/30340794/12787264 // Taken from: https://stackoverflow.com/a/30340794/12787264
fun ImageView.transformGrayscale() { fun ImageView.transformGrayscale(grayscale: Boolean) {
this.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply { this.colorFilter = if (grayscale) {
setSaturation(0f) ColorMatrixColorFilter(ColorMatrix().apply {
}) setSaturation(0f)
})
} else {
null
}
} }

View file

@ -9,9 +9,6 @@ import android.util.DisplayMetrics
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.Window
import android.view.WindowInsets
import android.view.WindowInsetsController
import android.window.OnBackInvokedDispatcher import android.window.OnBackInvokedDispatcher
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -20,6 +17,7 @@ import de.jrpie.android.launcher.actions.Action
import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.actions.Gesture
import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.databinding.HomeBinding import de.jrpie.android.launcher.databinding.HomeBinding
import de.jrpie.android.launcher.openTutorial
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.tutorial.TutorialActivity import de.jrpie.android.launcher.ui.tutorial.TutorialActivity
import java.util.Locale import java.util.Locale
@ -58,7 +56,6 @@ class HomeActivity : UIObject, AppCompatActivity() {
super<AppCompatActivity>.onCreate(savedInstanceState) super<AppCompatActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate() super<UIObject>.onCreate()
val displayMetrics = DisplayMetrics() val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics) windowManager.defaultDisplay.getMetrics(displayMetrics)
@ -88,8 +85,6 @@ class HomeActivity : UIObject, AppCompatActivity() {
binding.buttonFallbackSettings.setOnClickListener { binding.buttonFallbackSettings.setOnClickListener {
LauncherAction.SETTINGS.invoke(this) LauncherAction.SETTINGS.invoke(this)
} }
} }
override fun onStart() { override fun onStart() {
@ -97,6 +92,11 @@ class HomeActivity : UIObject, AppCompatActivity() {
super<UIObject>.onStart() super<UIObject>.onStart()
// If the tutorial was not finished, start it
if (!LauncherPreferences.internal().started()) {
openTutorial(this)
}
LauncherPreferences.getSharedPreferences() LauncherPreferences.getSharedPreferences()
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener) .registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
@ -220,7 +220,8 @@ class HomeActivity : UIObject, AppCompatActivity() {
} }
override fun onTouchEvent(event: MotionEvent): Boolean { override fun onTouchEvent(event: MotionEvent): Boolean {
return touchGestureDetector.onTouchEvent(event) || super.onTouchEvent(event) touchGestureDetector.onTouchEvent(event)
return true
} }
override fun setOnClicks() { override fun setOnClicks() {

View file

@ -1,6 +1,8 @@
package de.jrpie.android.launcher.ui package de.jrpie.android.launcher.ui
import android.content.Context import android.content.Context
import android.os.Handler
import android.os.Looper
import android.view.MotionEvent import android.view.MotionEvent
import android.view.ViewConfiguration import android.view.ViewConfiguration
import de.jrpie.android.launcher.actions.Gesture import de.jrpie.android.launcher.actions.Gesture
@ -27,6 +29,8 @@ class TouchGestureDetector(
private val MIN_TRIANGLE_HEIGHT = 250 private val MIN_TRIANGLE_HEIGHT = 250
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 {
@ -83,16 +87,28 @@ class TouchGestureDetector(
} }
private var paths = HashMap<Int, PointerPath>() private var paths = HashMap<Int, PointerPath>()
private var gestureIsLongClick = false
private var lastTappedTime = 0L private var lastTappedTime = 0L
private var lastTappedLocation: Vector? = null private var lastTappedLocation: Vector? = null
fun onTouchEvent(event: MotionEvent): Boolean { fun onTouchEvent(event: MotionEvent) {
val pointerIdToIndex = val pointerIdToIndex =
(0..<event.pointerCount).associateBy { event.getPointerId(it) } (0..<event.pointerCount).associateBy { event.getPointerId(it) }
if (event.actionMasked == MotionEvent.ACTION_DOWN) { if (event.actionMasked == MotionEvent.ACTION_DOWN) {
paths = HashMap() synchronized(this@TouchGestureDetector) {
paths = HashMap()
gestureIsLongClick = false
}
longPressHandler.postDelayed({
synchronized(this@TouchGestureDetector) {
if (paths.entries.size == 1 && paths.entries.firstOrNull()?.value?.isTap() == true) {
gestureIsLongClick = true
Gesture.LONG_CLICK.invoke(context)
}
}
}, LONG_PRESS_TIMEOUT.toLong())
} }
// add new pointers // add new pointers
@ -122,9 +138,17 @@ class TouchGestureDetector(
} }
if (event.actionMasked == MotionEvent.ACTION_UP) { if (event.actionMasked == MotionEvent.ACTION_UP) {
synchronized(this@TouchGestureDetector) {
// if the long press handler is still running, kill it
longPressHandler.removeCallbacksAndMessages(null)
// if the gesture was already detected as a long click, there is nothing to do
if (gestureIsLongClick) {
return
}
}
classifyPaths(paths, event.downTime, event.eventTime) classifyPaths(paths, event.downTime, event.eventTime)
} }
return true return
} }
private fun getGestureForDirection(direction: Vector): Gesture? { private fun getGestureForDirection(direction: Vector): Gesture? {
@ -171,10 +195,6 @@ class TouchGestureDetector(
lastTappedTime = timeEnd lastTappedTime = timeEnd
lastTappedLocation = mainPointerPath.last lastTappedLocation = mainPointerPath.last
} }
} else if (duration > LONG_PRESS_TIMEOUT) {
// TODO: Don't wait until the finger is lifted.
// Instead set a timer to start long click as soon as LONG_PRESS_TIMEOUT is reached
Gesture.LONG_CLICK.invoke(context)
} }
} else { } else {
// detect swipes // detect swipes

View file

@ -1,7 +1,6 @@
package de.jrpie.android.launcher.ui.list package de.jrpie.android.launcher.ui.list
import android.app.Activity import android.app.Activity
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Rect import android.graphics.Rect
@ -22,6 +21,7 @@ import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.REQUEST_UNINSTALL import de.jrpie.android.launcher.REQUEST_UNINSTALL
import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.apps.AppFilter import de.jrpie.android.launcher.apps.AppFilter
import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked
import de.jrpie.android.launcher.apps.isPrivateSpaceLocked import de.jrpie.android.launcher.apps.isPrivateSpaceLocked
import de.jrpie.android.launcher.apps.isPrivateSpaceSetUp import de.jrpie.android.launcher.apps.isPrivateSpaceSetUp
import de.jrpie.android.launcher.apps.togglePrivateSpaceLock import de.jrpie.android.launcher.apps.togglePrivateSpaceLock
@ -32,14 +32,6 @@ import de.jrpie.android.launcher.ui.list.apps.ListFragmentApps
import de.jrpie.android.launcher.ui.list.other.ListFragmentOther import de.jrpie.android.launcher.ui.list.other.ListFragmentOther
// TODO: Better solution for this intercommunication functionality (used in list-fragments)
var intention = ListActivity.ListActivityIntention.VIEW
var favoritesVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.VISIBLE
var privateSpaceVisibility: AppFilter.Companion.AppSetVisibility =
AppFilter.Companion.AppSetVisibility.VISIBLE
var hiddenVisibility: AppFilter.Companion.AppSetVisibility = AppFilter.Companion.AppSetVisibility.HIDDEN
var forGesture: String? = null
/** /**
* The [ListActivity] is the most general purpose activity in Launcher: * The [ListActivity] is the most general purpose activity in Launcher:
* - used to view all apps and edit their settings * - used to view all apps and edit their settings
@ -49,9 +41,34 @@ var forGesture: String? = null
*/ */
class ListActivity : AppCompatActivity(), UIObject { class ListActivity : AppCompatActivity(), UIObject {
private lateinit var binding: ListBinding private lateinit var binding: ListBinding
var intention = ListActivityIntention.VIEW
var favoritesVisibility: AppFilter.Companion.AppSetVisibility =
AppFilter.Companion.AppSetVisibility.VISIBLE
var privateSpaceVisibility: AppFilter.Companion.AppSetVisibility =
AppFilter.Companion.AppSetVisibility.VISIBLE
var hiddenVisibility: AppFilter.Companion.AppSetVisibility =
AppFilter.Companion.AppSetVisibility.HIDDEN
var forGesture: String? = null
private fun updateLockIcon(locked: Boolean) { private fun updateLockIcon(locked: Boolean) {
if (
// only show lock for VIEW intention
(intention != ListActivityIntention.VIEW)
// hide lock when private space does not exist
|| !isPrivateSpaceSetUp(this)
// hide lock when private space apps are hidden from the main list and we are not in the private space list
|| (LauncherPreferences.apps().hidePrivateSpaceApps()
&& privateSpaceVisibility != AppFilter.Companion.AppSetVisibility.EXCLUSIVE)
// hide lock when private space is locked and the hidden when locked setting is set
|| (locked && hidePrivateSpaceWhenLocked(this))
) {
binding.listLock.visibility = View.GONE
return
}
binding.listLock.visibility = View.VISIBLE
binding.listLock.setImageDrawable( binding.listLock.setImageDrawable(
AppCompatResources.getDrawable( AppCompatResources.getDrawable(
this, this,
@ -74,7 +91,6 @@ class ListActivity : AppCompatActivity(), UIObject {
} }
enum class ListActivityIntention(val titleResource: Int) { enum class ListActivityIntention(val titleResource: Int) {
VIEW(R.string.list_title_view), /* view list of apps */ VIEW(R.string.list_title_view), /* view list of apps */
PICK(R.string.list_title_pick) /* choose app or action to associate to a gesture */ PICK(R.string.list_title_pick) /* choose app or action to associate to a gesture */
@ -119,20 +135,6 @@ class ListActivity : AppCompatActivity(), UIObject {
LauncherAction.SETTINGS.launch(this@ListActivity) LauncherAction.SETTINGS.launch(this@ListActivity)
} }
binding.listLock.visibility =
if (intention != ListActivityIntention.VIEW) {
View.GONE
} else if (!isPrivateSpaceSetUp(this)) {
View.GONE
} else if (LauncherPreferences.apps().hidePrivateSpaceApps()) {
if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
View.VISIBLE
} else {
View.GONE
}
} else {
View.VISIBLE
}
if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
isPrivateSpaceSetUp(this, showToast = true, launchSettings = true) isPrivateSpaceSetUp(this, showToast = true, launchSettings = true)
@ -200,15 +202,16 @@ class ListActivity : AppCompatActivity(), UIObject {
fun updateTitle() { fun updateTitle() {
var titleResource = intention.titleResource var titleResource = intention.titleResource
if (intention == ListActivityIntention.VIEW) { if (intention == ListActivityIntention.VIEW) {
titleResource = if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { titleResource =
R.string.list_title_hidden if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
} else if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_hidden
R.string.list_title_private_space } else if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
} else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) { R.string.list_title_private_space
R.string.list_title_favorite } else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
} else { R.string.list_title_favorite
R.string.list_title_view } else {
} R.string.list_title_view
}
} }
binding.listHeading.text = getString(titleResource) binding.listHeading.text = getString(titleResource)
@ -255,7 +258,7 @@ private val TAB_TITLES = arrayOf(
* The [ListSectionsPagerAdapter] returns the fragment, * The [ListSectionsPagerAdapter] returns the fragment,
* which corresponds to the selected tab in [ListActivity]. * which corresponds to the selected tab in [ListActivity].
*/ */
class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) : class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentManager) :
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
@ -267,11 +270,11 @@ class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager
} }
override fun getPageTitle(position: Int): CharSequence { override fun getPageTitle(position: Int): CharSequence {
return context.resources.getString(TAB_TITLES[position]) return activity.resources.getString(TAB_TITLES[position])
} }
override fun getCount(): Int { override fun getCount(): Int {
return when (intention) { return when (activity.intention) {
ListActivity.ListActivityIntention.VIEW -> 1 ListActivity.ListActivityIntention.VIEW -> 1
else -> 2 else -> 2
} }

View file

@ -47,6 +47,7 @@ class AppsRecyclerAdapter(
private val apps = (activity.applicationContext as Application).apps private val apps = (activity.applicationContext as Application).apps
private val appsListDisplayed: MutableList<AbstractDetailedAppInfo> = mutableListOf() private val appsListDisplayed: MutableList<AbstractDetailedAppInfo> = mutableListOf()
private val grayscale = LauncherPreferences.theme().monochromeIcons()
// temporarily disable auto launch // temporarily disable auto launch
var disableAutoLaunch: Boolean = false var disableAutoLaunch: Boolean = false
@ -67,7 +68,7 @@ class AppsRecyclerAdapter(
override fun onClick(v: View) { override fun onClick(v: View) {
val rect = Rect() val rect = Rect()
img.getGlobalVisibleRect(rect) img.getGlobalVisibleRect(rect)
selectItem(adapterPosition, rect) selectItem(bindingAdapterPosition, rect)
} }
init { init {
@ -79,20 +80,19 @@ class AppsRecyclerAdapter(
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
var appLabel = appsListDisplayed[i].getCustomLabel(activity) var appLabel = appsListDisplayed[i].getCustomLabel(activity)
val appIcon = appsListDisplayed[i].getIcon(activity)
viewHolder.img.transformGrayscale(grayscale)
viewHolder.img.setImageDrawable(appIcon.constantState?.newDrawable() ?: appIcon)
if (layout.useBadgedText) { if (layout.useBadgedText) {
appLabel = activity.packageManager.getUserBadgedLabel( appLabel = activity.packageManager.getUserBadgedLabel(
appLabel, appLabel,
appsListDisplayed[i].getUser(activity) appsListDisplayed[i].getUser(activity)
).toString() ).toString()
} }
val appIcon = appsListDisplayed[i].getIcon(activity)
viewHolder.textView.text = appLabel viewHolder.textView.text = appLabel
viewHolder.img.setImageDrawable(appIcon)
if (LauncherPreferences.theme().monochromeIcons())
viewHolder.img.transformGrayscale()
// decide when to show the options popup menu about // decide when to show the options popup menu about
if (intention == ListActivity.ListActivityIntention.VIEW) { if (intention == ListActivity.ListActivityIntention.VIEW) {

View file

@ -22,6 +22,7 @@ import de.jrpie.android.launcher.apps.DetailedAppInfo
import de.jrpie.android.launcher.apps.PinnedShortcutInfo import de.jrpie.android.launcher.apps.PinnedShortcutInfo
import de.jrpie.android.launcher.getUserFromId import de.jrpie.android.launcher.getUserFromId
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import androidx.core.net.toUri
private const val LOG_TAG = "AppContextMenu" private const val LOG_TAG = "AppContextMenu"
@ -44,7 +45,7 @@ fun AbstractAppInfo.uninstall(activity: Activity) {
Log.i(LOG_TAG, "uninstalling $this") Log.i(LOG_TAG, "uninstalling $this")
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE)
intent.data = Uri.parse("package:$packageName") intent.data = "package:$packageName".toUri()
getUserFromId(userId, activity).let { user -> getUserFromId(userId, activity).let { user ->
intent.putExtra(Intent.EXTRA_USER, user) intent.putExtra(Intent.EXTRA_USER, user)
} }

View file

@ -17,11 +17,6 @@ import de.jrpie.android.launcher.databinding.ListAppsBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.UIObject
import de.jrpie.android.launcher.ui.list.ListActivity import de.jrpie.android.launcher.ui.list.ListActivity
import de.jrpie.android.launcher.ui.list.favoritesVisibility
import de.jrpie.android.launcher.ui.list.forGesture
import de.jrpie.android.launcher.ui.list.hiddenVisibility
import de.jrpie.android.launcher.ui.list.intention
import de.jrpie.android.launcher.ui.list.privateSpaceVisibility
import de.jrpie.android.launcher.ui.openSoftKeyboard import de.jrpie.android.launcher.ui.openSoftKeyboard
@ -54,7 +49,7 @@ class ListFragmentApps : Fragment(), UIObject {
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener) .registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
binding.listAppsCheckBoxFavorites.isChecked = binding.listAppsCheckBoxFavorites.isChecked =
(favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) ((activity as? ListActivity)?.favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE)
} }
override fun onStop() { override fun onStop() {
@ -67,16 +62,17 @@ class ListFragmentApps : Fragment(), UIObject {
override fun setOnClicks() {} override fun setOnClicks() {}
override fun adjustLayout() { override fun adjustLayout() {
val listActivity = activity as? ListActivity ?: return
appsRecyclerAdapter = appsRecyclerAdapter =
AppsRecyclerAdapter( AppsRecyclerAdapter(
requireActivity(), binding.root, intention, forGesture, listActivity, binding.root, listActivity.intention, listActivity.forGesture,
appFilter = AppFilter( appFilter = AppFilter(
requireContext(), requireContext(),
"", "",
favoritesVisibility = favoritesVisibility, favoritesVisibility = listActivity.favoritesVisibility,
privateSpaceVisibility = privateSpaceVisibility, privateSpaceVisibility = listActivity.privateSpaceVisibility,
hiddenVisibility = hiddenVisibility hiddenVisibility = listActivity.hiddenVisibility
), ),
layout = LauncherPreferences.list().layout() layout = LauncherPreferences.list().layout()
) )
@ -124,7 +120,8 @@ class ListFragmentApps : Fragment(), UIObject {
if (newText == " " && if (newText == " " &&
!appsRecyclerAdapter.disableAutoLaunch && !appsRecyclerAdapter.disableAutoLaunch &&
intention == ListActivity.ListActivityIntention.VIEW && (activity as? ListActivity)?.intention
== ListActivity.ListActivityIntention.VIEW &&
LauncherPreferences.functionality().searchAutoLaunch() LauncherPreferences.functionality().searchAutoLaunch()
) { ) {
appsRecyclerAdapter.disableAutoLaunch = true appsRecyclerAdapter.disableAutoLaunch = true
@ -141,17 +138,17 @@ class ListFragmentApps : Fragment(), UIObject {
}) })
binding.listAppsCheckBoxFavorites.setOnClickListener { binding.listAppsCheckBoxFavorites.setOnClickListener {
favoritesVisibility = listActivity.favoritesVisibility =
if (binding.listAppsCheckBoxFavorites.isChecked) { if (binding.listAppsCheckBoxFavorites.isChecked) {
AppFilter.Companion.AppSetVisibility.EXCLUSIVE AppFilter.Companion.AppSetVisibility.EXCLUSIVE
} else { } else {
AppFilter.Companion.AppSetVisibility.VISIBLE AppFilter.Companion.AppSetVisibility.VISIBLE
} }
appsRecyclerAdapter.setFavoritesVisibility(favoritesVisibility) appsRecyclerAdapter.setFavoritesVisibility(listActivity.favoritesVisibility)
(activity as? ListActivity)?.updateTitle() (activity as? ListActivity)?.updateTitle()
} }
if (intention == ListActivity.ListActivityIntention.VIEW if (listActivity.intention == ListActivity.ListActivityIntention.VIEW
&& LauncherPreferences.functionality().searchAutoOpenKeyboard() && LauncherPreferences.functionality().searchAutoOpenKeyboard()
) { ) {
binding.listAppsSearchview.openSoftKeyboard(requireContext()) binding.listAppsSearchview.openSoftKeyboard(requireContext())

View file

@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
import de.jrpie.android.launcher.actions.LauncherAction import de.jrpie.android.launcher.actions.LauncherAction
import de.jrpie.android.launcher.ui.list.forGesture import de.jrpie.android.launcher.ui.list.ListActivity
/** /**
* The [OtherRecyclerAdapter] will only be displayed in the ListActivity, * The [OtherRecyclerAdapter] will only be displayed in the ListActivity,
@ -33,10 +33,10 @@ class OtherRecyclerAdapter(val activity: Activity) :
override fun onClick(v: View) { override fun onClick(v: View) {
val pos = adapterPosition val pos = bindingAdapterPosition
val content = othersList[pos] val content = othersList[pos]
forGesture?.let { returnChoiceIntent(it, content) } (activity as? ListActivity)?.forGesture?.let { returnChoiceIntent(it, content) }
} }
init { init {

View file

@ -11,6 +11,7 @@ import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -94,6 +95,8 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject {
class ActionsRecyclerAdapter(val activity: Activity) : class ActionsRecyclerAdapter(val activity: Activity) :
RecyclerView.Adapter<ActionsRecyclerAdapter.ViewHolder>() { RecyclerView.Adapter<ActionsRecyclerAdapter.ViewHolder>() {
private val drawableUnknown = AppCompatResources.getDrawable(activity, R.drawable.baseline_question_mark_24)
private val gesturesList: ArrayList<Gesture> = private val gesturesList: ArrayList<Gesture> =
Gesture.entries.filter(Gesture::isEnabled) as ArrayList<Gesture> Gesture.entries.filter(Gesture::isEnabled) as ArrayList<Gesture>
@ -115,15 +118,18 @@ class ActionsRecyclerAdapter(val activity: Activity) :
private fun updateViewHolder(gesture: Gesture, viewHolder: ViewHolder) { private fun updateViewHolder(gesture: Gesture, viewHolder: ViewHolder) {
val action = Action.forGesture(gesture) val action = Action.forGesture(gesture)
val drawable = action?.getIcon(activity)
if (action == null || drawable == null) { if (action == null) {
viewHolder.img.visibility = View.INVISIBLE viewHolder.img.visibility = View.INVISIBLE
viewHolder.removeAction.visibility = View.GONE viewHolder.removeAction.visibility = View.GONE
viewHolder.chooseButton.visibility = View.VISIBLE viewHolder.chooseButton.visibility = View.VISIBLE
return return
} }
// Use the unknown icon if there is an action, but we can't find its icon.
// Probably an app was uninstalled.
val drawable = action.getIcon(activity) ?: drawableUnknown
viewHolder.img.visibility = View.VISIBLE viewHolder.img.visibility = View.VISIBLE
viewHolder.removeAction.visibility = View.VISIBLE viewHolder.removeAction.visibility = View.VISIBLE
viewHolder.chooseButton.visibility = View.INVISIBLE viewHolder.chooseButton.visibility = View.INVISIBLE
@ -137,9 +143,7 @@ class ActionsRecyclerAdapter(val activity: Activity) :
val description = gesture.getDescription(activity) val description = gesture.getDescription(activity)
viewHolder.descriptionTextView.text = description viewHolder.descriptionTextView.text = description
viewHolder.img.transformGrayscale(LauncherPreferences.theme().monochromeIcons())
if (LauncherPreferences.theme().monochromeIcons())
viewHolder.img.transformGrayscale()
updateViewHolder(gesture, viewHolder) updateViewHolder(gesture, viewHolder)
viewHolder.img.setOnClickListener { chooseApp(gesture) } viewHolder.img.setOnClickListener { chooseApp(gesture) }

View file

@ -16,6 +16,7 @@ import de.jrpie.android.launcher.copyToClipboard
import de.jrpie.android.launcher.databinding.SettingsMetaBinding import de.jrpie.android.launcher.databinding.SettingsMetaBinding
import de.jrpie.android.launcher.getDeviceInfo import de.jrpie.android.launcher.getDeviceInfo
import de.jrpie.android.launcher.openInBrowser import de.jrpie.android.launcher.openInBrowser
import de.jrpie.android.launcher.openTutorial
import de.jrpie.android.launcher.preferences.resetPreferences import de.jrpie.android.launcher.preferences.resetPreferences
import de.jrpie.android.launcher.ui.LegalInfoActivity import de.jrpie.android.launcher.ui.LegalInfoActivity
import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.UIObject
@ -47,8 +48,17 @@ class SettingsFragmentMeta : Fragment(), UIObject {
override fun setOnClicks() { override fun setOnClicks() {
fun bindURL(view: View, urlRes: Int) {
view.setOnClickListener {
openInBrowser(
getString(urlRes),
requireContext()
)
}
}
binding.settingsMetaButtonViewTutorial.setOnClickListener { binding.settingsMetaButtonViewTutorial.setOnClickListener {
startActivity(Intent(this.context, TutorialActivity::class.java)) openTutorial(requireContext())
} }
// prompting for settings-reset confirmation // prompting for settings-reset confirmation
@ -69,12 +79,7 @@ class SettingsFragmentMeta : Fragment(), UIObject {
// view code // view code
binding.settingsMetaButtonViewCode.setOnClickListener { bindURL(binding.settingsMetaButtonViewCode, R.string.settings_meta_link_github)
openInBrowser(
getString(R.string.settings_meta_link_github),
requireContext()
)
}
// report a bug // report a bug
binding.settingsMetaButtonReportBug.setOnClickListener { binding.settingsMetaButtonReportBug.setOnClickListener {
@ -110,37 +115,19 @@ class SettingsFragmentMeta : Fragment(), UIObject {
} }
// join chat // join chat
binding.settingsMetaButtonJoinChat.setOnClickListener { bindURL(binding.settingsMetaButtonJoinChat, R.string.settings_meta_chat_url)
openInBrowser(
getString(R.string.settings_meta_chat_url),
requireContext()
)
}
// contact developer // contact developer
binding.settingsMetaButtonContact.setOnClickListener { // bindURL(binding.settingsMetaButtonContact, R.string.settings_meta_contact_url)
openInBrowser(
getString(R.string.settings_meta_contact_url),
requireContext()
)
}
// contact fork developer // contact fork developer
binding.settingsMetaButtonForkContact.setOnClickListener { bindURL(binding.settingsMetaButtonForkContact, R.string.settings_meta_fork_contact_url)
openInBrowser(
getString(R.string.settings_meta_fork_contact_url), // donate
requireContext() bindURL(binding.settingsMetaButtonDonate, R.string.settings_meta_donate_url)
)
}
// privacy policy // privacy policy
binding.settingsMetaButtonPrivacy.setOnClickListener { bindURL(binding.settingsMetaButtonPrivacy, R.string.settings_meta_privacy_url)
openInBrowser(
getString(R.string.settings_meta_privacy_url),
requireContext()
)
}
// legal info // legal info
binding.settingsMetaButtonLicenses.setOnClickListener { binding.settingsMetaButtonLicenses.setOnClickListener {

View file

@ -2,7 +2,9 @@ package de.jrpie.android.launcher.ui.tutorial
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.window.OnBackInvokedDispatcher
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
@ -33,6 +35,19 @@ class TutorialActivity : AppCompatActivity(), UIObject {
super<AppCompatActivity>.onCreate(savedInstanceState) super<AppCompatActivity>.onCreate(savedInstanceState)
super<UIObject>.onCreate() super<UIObject>.onCreate()
// Handle back key / gesture on Android 13+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
onBackInvokedDispatcher.registerOnBackInvokedCallback(
OnBackInvokedDispatcher.PRIORITY_OVERLAY
) {
// prevent going back when the tutorial is shown for the first time
if (!LauncherPreferences.internal().started()) {
return@registerOnBackInvokedCallback
}
finish()
}
}
// Initialise layout // Initialise layout
setContentView(R.layout.tutorial) setContentView(R.layout.tutorial)
@ -60,7 +75,7 @@ class TutorialActivity : AppCompatActivity(), UIObject {
} }
} }
// Default: prevent going back, allow if viewed again later // prevent going back when the tutorial is shown for the first time
override fun onBackPressed() { override fun onBackPressed() {
if (LauncherPreferences.internal().started()) if (LauncherPreferences.internal().started())
super.onBackPressed() super.onBackPressed()

View file

@ -0,0 +1,12 @@
<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
android:fillColor="@android:color/white"
android:pathData="M11.07,12.85c0.77,-1.39 2.25,-2.21 3.11,-3.44c0.91,-1.29 0.4,-3.7 -2.18,-3.7c-1.69,0 -2.52,1.28 -2.87,2.34L6.54,6.96C7.25,4.83 9.18,3 11.99,3c2.35,0 3.96,1.07 4.78,2.41c0.7,1.15 1.11,3.3 0.03,4.9c-1.2,1.77 -2.35,2.31 -2.97,3.45c-0.25,0.46 -0.35,0.76 -0.35,2.24h-2.89C10.58,15.22 10.46,13.95 11.07,12.85zM14,20c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2S14,18.9 14,20z" />
</vector>

View file

@ -0,0 +1,16 @@
<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="m 3,9 v 6 h 4 l 5,5 V 4 L 7,9 Z m 13.5,3 C 16.5,10.23 15.48,8.71 14,7.97 v 8.05 c 1.48,-0.73 2.5,-2.25 2.5,-4.02 z" />
<path
android:fillAlpha="0.5"
android:fillColor="?android:textColor"
android:pathData="m 14,3.23 v 2.06 c 2.89,0.86 5,3.54 5,6.71 0,3.17 -2.11,5.85 -5,6.71 v 2.06 C 18.01,19.86 21,16.28 21,12 21,7.72 18.01,4.14 14,3.23 Z"
android:strokeAlpha="0.5" />
</vector>

View file

@ -59,12 +59,12 @@
android:text="@string/settings_meta_join_chat" android:text="@string/settings_meta_join_chat"
android:textAllCaps="false" /> android:textAllCaps="false" />
<Button <!--<Button
android:id="@+id/settings_meta_button_contact" android:id="@+id/settings_meta_button_contact"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/settings_meta_contact" android:text="@string/settings_meta_contact"
android:textAllCaps="false" /> android:textAllCaps="false" />-->
<Button <Button
android:id="@+id/settings_meta_button_fork_contact" android:id="@+id/settings_meta_button_fork_contact"
@ -73,6 +73,13 @@
android:text="@string/settings_meta_fork_contact" android:text="@string/settings_meta_fork_contact"
android:textAllCaps="false" /> android:textAllCaps="false" />
<Button
android:id="@+id/settings_meta_button_donate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/settings_meta_donate"
android:textAllCaps="false" />
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="64sp" /> android:layout_height="64sp" />

View file

@ -6,8 +6,8 @@
- -
--> -->
<string name="alert_cant_open_title">App kann nicht geöffnet werden</string> <string name="alert_cant_open_title">App kann nicht geöffnet werden</string>
<string name="alert_cant_open_message">Möchtest du die App-Einstellungen anpassen?</string> <string name="alert_cant_open_message">App-Einstellungen anpassen?</string>
<string name="toast_cant_open_message">Öffne die Einstellungen um für diese Geste eine Aktion zu wählen</string> <string name="toast_cant_open_message">Einstellungen öffnen um für diese Geste eine Aktion zu wählen</string>
<!-- <!--
- -
- Settings - Settings
@ -97,7 +97,6 @@
<string name="settings_launcher_change_wallpaper">Hintergrund ändern</string> <string name="settings_launcher_change_wallpaper">Hintergrund ändern</string>
<string name="settings_launcher_section_display">Bildschirm</string> <string name="settings_launcher_section_display">Bildschirm</string>
<string name="settings_display_screen_timeout_disabled">Bildschirm nicht ausschalten</string> <string name="settings_display_screen_timeout_disabled">Bildschirm nicht ausschalten</string>
<string name="settings_display_full_screen">Vollbild</string>
<string name="settings_display_rotate_screen">Bildschirm drehen</string> <string name="settings_display_rotate_screen">Bildschirm drehen</string>
<string name="settings_launcher_section_functionality">Funktionalität</string> <string name="settings_launcher_section_functionality">Funktionalität</string>
<string name="settings_enabled_gestures_double_swipe">Doppelte Wischaktionen</string> <string name="settings_enabled_gestures_double_swipe">Doppelte Wischaktionen</string>
@ -118,7 +117,6 @@
<string name="settings_list_layout_item_grid">Raster</string> <string name="settings_list_layout_item_grid">Raster</string>
<string name="settings_general_choose_home_screen">Launcher wählen</string> <string name="settings_general_choose_home_screen">Launcher wählen</string>
<string name="settings_meta_cant_select_launcher">App Info</string> <string name="settings_meta_cant_select_launcher">App Info</string>
<string name="settings_meta_cant_select_launcher_msg">Dein Gerät unterstützt diese Funktion nicht. Stattdessen die App Details bearbeiten?</string>
<string name="settings_meta_show_tutorial">Zum Tutorial</string> <string name="settings_meta_show_tutorial">Zum Tutorial</string>
<string name="settings_meta_reset">Einstellungen zurücksetzen</string> <string name="settings_meta_reset">Einstellungen zurücksetzen</string>
<string name="settings_meta_reset_confirm">Alle Einstellungen gehen verloren. Weitermachen?</string> <string name="settings_meta_reset_confirm">Alle Einstellungen gehen verloren. Weitermachen?</string>
@ -129,6 +127,7 @@
<string name="dialog_report_bug_create_report">Report erstellen</string> <string name="dialog_report_bug_create_report">Report erstellen</string>
<string name="settings_meta_fork_contact">Entwickler des Fork kontaktieren</string> <string name="settings_meta_fork_contact">Entwickler des Fork kontaktieren</string>
<string name="settings_meta_join_chat">Dem µLauncher-Chat beitreten</string> <string name="settings_meta_join_chat">Dem µLauncher-Chat beitreten</string>
<string name="settings_meta_donate">Spenden</string>
<string name="settings_meta_privacy">Datenschutzerklärung</string> <string name="settings_meta_privacy">Datenschutzerklärung</string>
<!-- <!--
- -
@ -152,8 +151,9 @@
<string name="list_other_list">Alle Anwendungen</string> <string name="list_other_list">Alle Anwendungen</string>
<string name="list_other_list_favorites">Favoriten</string> <string name="list_other_list_favorites">Favoriten</string>
<string name="list_other_toggle_private_space_lock">Privaten Bereich (ent)sperren</string> <string name="list_other_toggle_private_space_lock">Privaten Bereich (ent)sperren</string>
<string name="list_other_volume_up">Musik: Lauter</string> <string name="list_other_volume_up">Lauter</string>
<string name="list_other_volume_down">Musik: Leiser</string> <string name="list_other_volume_down">Leiser</string>
<string name="list_other_volume_adjust">Lautstärke ändern</string>
<string name="list_other_track_next">Musik: Weiter</string> <string name="list_other_track_next">Musik: Weiter</string>
<string name="list_other_track_previous">Musik: Zurück</string> <string name="list_other_track_previous">Musik: Zurück</string>
<string name="list_other_nop">Nichts tun</string> <string name="list_other_nop">Nichts tun</string>
@ -164,23 +164,23 @@
--> -->
<string name="list_other_torch">Taschenlampe umschalten</string> <string name="list_other_torch">Taschenlampe umschalten</string>
<string name="tutorial_title">Tutorial</string> <string name="tutorial_title">Tutorial</string>
<string name="tutorial_start_text">Nimm dir kurz Zeit und lerne, wie du diesen Launcher verwendest!</string> <string name="tutorial_start_text">Hier eine kurze Erklärung, wie dieser Launcher funktioniert.</string>
<string name="tutorial_concept_title">Konzept</string> <string name="tutorial_concept_title">Konzept</string>
<string name="tutorial_concept_text">µLauncher bietet eine minimalistische, effiziente und ablenkungsfreie digitale Umgebung.\n\nDie App kostet dich nichts, enthält keine Werbung und sammelt keinerlei Daten.</string> <string name="tutorial_concept_text">µLauncher bietet eine minimalistische, effiziente und ablenkungsfreie digitale Umgebung.\n\nDie App ist freie Software, enthält keine Werbung und sammelt keinerlei Daten.</string>
<string name="tutorial_concept_text_2">Launcher ist open-source (MIT license) und auf GitHub!\n\nSchau gerne mal dort vorbei!</string> <string name="tutorial_concept_text_2">Der Quellcode ist bei GitHub zu finden.</string>
<string name="tutorial_usage_title">Benutzung</string> <string name="tutorial_usage_title">Benutzung</string>
<string name="tutorial_usage_text">Auf deinem Homescreen siehst du nur das Datum und die Uhrzeit. Keine Ablenkung.</string> <string name="tutorial_usage_text">Der Homescreen zeigt nur das Datum und die Uhrzeit. Keine Ablenkung.</string>
<string name="tutorial_usage_text_2">Du öffnest Apps indem du über den Bildschirm wischt oder die Lautstärketasten drückst. Gleich wählst du deine Apps.</string> <string name="tutorial_usage_text_2">Häufig verwendete Apps können mittels Gesten, z.B. Wischen oder den Lautstärketasten geöffnet werden. Gleich können die Apps ausgewählt werden.</string>
<string name="tutorial_setup_title">Einrichtung</string> <string name="tutorial_setup_title">Einrichtung</string>
<string name="tutorial_setup_text">Wir haben dir ein paar Standardapps ausgewählt, du kannst sie hier gerne ändern:</string> <string name="tutorial_setup_text">Es wurden Standardapps ausgewählt, die Zuordnung kann hier angepasst werden:</string>
<string name="tutorial_setup_text_2">Du kannst deine Auswahl in den Einstellungen später jederzeit ändern.</string> <string name="tutorial_setup_text_2">Die Auswahl kann in den Einstellungen später jederzeit geändert werden.</string>
<string name="tutorial_finish_title">Los gehts!</string> <string name="tutorial_finish_title">Los gehts!</string>
<string name="tutorial_finish_text">Du bist bereit loszulegen!\n\nIch hoffe diese App ist nützlich für dich!\n\n- Finn (der Entwickler)\n\tund Josia (der einige Änderungen vorgenommen hat und den Fork μLauncher entwickelt)</string> <string name="tutorial_finish_text">Es kann losgehen!\n\nWir hoffen, dass diese App hilfreich ist!\n\n- Finn (der Entwickler)\n\tund Josia (der einige Änderungen vorgenommen hat und den Fork μLauncher entwickelt)</string>
<string name="tutorial_finish_button">Starten</string> <string name="tutorial_finish_button">Starten</string>
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="ic_menu_alt">Mehr Optionen</string> <string name="ic_menu_alt">Mehr Optionen</string>
<string name="list_other_expand_notifications_panel">Benachrichtigungen</string> <string name="list_other_expand_notifications_panel">Benachrichtigungen</string>
<string name="alert_cant_expand_status_bar_panel">Fehler: Diese Funktion wird von deinem Gerät leider nicht unterstützt.</string> <string name="alert_cant_expand_status_bar_panel">Fehler: Die Funktion wird von diesem Gerät leider nicht unterstützt.</string>
<string name="settings_clock_show_seconds">Sekunden anzeigen</string> <string name="settings_clock_show_seconds">Sekunden anzeigen</string>
<string name="undo">Rückgängig</string> <string name="undo">Rückgängig</string>
<string name="list_other_expand_settings_panel">Schnelleinstellungen</string> <string name="list_other_expand_settings_panel">Schnelleinstellungen</string>
@ -195,7 +195,7 @@
<string name="alert_requires_android_v">Diese Funktionalität benötigt Android 15 oder neuer.</string> <string name="alert_requires_android_v">Diese Funktionalität benötigt Android 15 oder neuer.</string>
<string name="snackbar_app_hidden">Die App wurde versteckt. Sie kann in den Einstellungen wieder sichtbar gemacht werden.</string> <string name="snackbar_app_hidden">Die App wurde versteckt. Sie kann in den Einstellungen wieder sichtbar gemacht werden.</string>
<string name="toast_device_admin_not_enabled">µLauncher muss Geräteadministrator sein, um den Bildschirm sperren zu dürfen.</string> <string name="toast_device_admin_not_enabled">µLauncher muss Geräteadministrator sein, um den Bildschirm sperren zu dürfen.</string>
<string name="device_admin_explanation">Dies ist erforderlich, damit µLauncher den Bildschirm spreen kann.</string> <string name="device_admin_explanation">Dies ist erforderlich, damit µLauncher den Bildschirm sperren kann.</string>
<string name="device_admin_description">Die Aktion \"Bildschirm sperren\" aktivieren</string> <string name="device_admin_description">Die Aktion \"Bildschirm sperren\" aktivieren</string>
<string name="alert_no_torch_found">Es wurde keine geeignete Kamera gefunden.</string> <string name="alert_no_torch_found">Es wurde keine geeignete Kamera gefunden.</string>
<string name="alert_torch_access_exception">Fehler: Kein Zugriff auf die Kamera möglich.</string> <string name="alert_torch_access_exception">Fehler: Kein Zugriff auf die Kamera möglich.</string>
@ -234,8 +234,8 @@
Dies erfordert sehr weitgehende Berechtigungen. Dies erfordert sehr weitgehende Berechtigungen.
µLauncher wird diese ausschließlich zum Sperren des Bildschirms verwenden. µLauncher wird diese ausschließlich zum Sperren des Bildschirms verwenden.
<br/> <br/>
(Irgeneiner gerade heruntergeladenen App sollte man eine solche Behauptung natürlich nicht einfach glauben. (Irgendeiner gerade heruntergeladenen App sollte man eine solche Behauptung natürlich nicht einfach glauben.
Du kannst jedoch den <a href=\"https://github.com/jrpie/Launcher\">Source Code</a> selbst prüfen.) Der <a href=\"https://github.com/jrpie/Launcher\">Quelltext</a> dieser App ist jedoch frei verfügbar und kann überprüft werden.)
<br/><br/><br/><br/> <br/><br/><br/><br/>
@ -277,4 +277,4 @@
<string name="dialog_consent_accessibility_consent">Ich willige ein, dass µLauncher eine Bedienungshilfe für Zwecke verwendet, die nicht unter Barrierefreiheit fallen.</string> <string name="dialog_consent_accessibility_consent">Ich willige ein, dass µLauncher eine Bedienungshilfe für Zwecke verwendet, die nicht unter Barrierefreiheit fallen.</string>
<string name="dialog_consent_accessibility_data_collection">Ich willige ein, dass µLauncher keine Daten sammelt.</string> <string name="dialog_consent_accessibility_data_collection">Ich willige ein, dass µLauncher keine Daten sammelt.</string>
<string name="dialog_consent_accessibility_title">Bedienungshilfe aktivieren</string> <string name="dialog_consent_accessibility_title">Bedienungshilfe aktivieren</string>
</resources> </resources>

View file

@ -63,7 +63,6 @@
<string name="settings_launcher_change_wallpaper">Cambiar fondo de pantalla</string> <string name="settings_launcher_change_wallpaper">Cambiar fondo de pantalla</string>
<string name="settings_launcher_section_display">Pantalla</string> <string name="settings_launcher_section_display">Pantalla</string>
<string name="settings_display_screen_timeout_disabled">Mantener encendida</string> <string name="settings_display_screen_timeout_disabled">Mantener encendida</string>
<string name="settings_display_full_screen">Pantalla completa</string>
<string name="settings_launcher_section_functionality">Funciones</string> <string name="settings_launcher_section_functionality">Funciones</string>
<string name="settings_enabled_gestures_double_swipe">Deslizar con dos dedos</string> <string name="settings_enabled_gestures_double_swipe">Deslizar con dos dedos</string>
<string name="settings_functionality_auto_launch">Auto-lanzar búsquedas</string> <string name="settings_functionality_auto_launch">Auto-lanzar búsquedas</string>
@ -76,7 +75,6 @@
--> -->
<string name="settings_general_choose_home_screen">Seleccionar Launcher</string> <string name="settings_general_choose_home_screen">Seleccionar Launcher</string>
<string name="settings_meta_cant_select_launcher">Información de la aplicación</string> <string name="settings_meta_cant_select_launcher">Información de la aplicación</string>
<string name="settings_meta_cant_select_launcher_msg">Su dispositivo no posee esta caracrerística. Desea cambiar los detalles de la aplicación?</string>
<string name="settings_meta_show_tutorial">Ver tutorial de Launcher</string> <string name="settings_meta_show_tutorial">Ver tutorial de Launcher</string>
<string name="settings_meta_reset">Configuración por defecto</string> <string name="settings_meta_reset">Configuración por defecto</string>
<string name="settings_meta_reset_confirm">Todas sus preferencias se eliminarán. Desea continuar?</string> <string name="settings_meta_reset_confirm">Todas sus preferencias se eliminarán. Desea continuar?</string>
@ -127,4 +125,4 @@
<string name="tutorial_finish_button">Iniciar</string> <string name="tutorial_finish_button">Iniciar</string>
<string name="settings">Configuración</string> <string name="settings">Configuración</string>
<string name="ic_menu_alt">Más opciones</string> <string name="ic_menu_alt">Más opciones</string>
</resources> </resources>

View file

@ -55,7 +55,6 @@
<string name="settings_launcher_change_wallpaper">Changer le fond d\'écran</string> <string name="settings_launcher_change_wallpaper">Changer le fond d\'écran</string>
<string name="settings_launcher_section_display">Écran</string> <string name="settings_launcher_section_display">Écran</string>
<string name="settings_display_screen_timeout_disabled">Garder l\'écran allumé</string> <string name="settings_display_screen_timeout_disabled">Garder l\'écran allumé</string>
<string name="settings_display_full_screen">Utiliser le plein écran</string>
<string name="settings_launcher_section_functionality">Fonctions</string> <string name="settings_launcher_section_functionality">Fonctions</string>
<string name="settings_enabled_gestures_double_swipe">Actions de double balayage</string> <string name="settings_enabled_gestures_double_swipe">Actions de double balayage</string>
<string name="settings_functionality_auto_launch">Lancer apps par recherche</string> <string name="settings_functionality_auto_launch">Lancer apps par recherche</string>
@ -68,7 +67,6 @@
--> -->
<string name="settings_general_choose_home_screen">Choisir μLauncher comme application d\'écran d\'accueil par défaut</string> <string name="settings_general_choose_home_screen">Choisir μLauncher comme application d\'écran d\'accueil par défaut</string>
<string name="settings_meta_cant_select_launcher">Informations sur l\'application</string> <string name="settings_meta_cant_select_launcher">Informations sur l\'application</string>
<string name="settings_meta_cant_select_launcher_msg">Votre appareil ne prend pas en charge cette fonctionnalité. Souhaitez-vous plutôt accéder aux détails de l\'application ?</string>
<string name="settings_meta_show_tutorial">Regarder le tutoriel</string> <string name="settings_meta_show_tutorial">Regarder le tutoriel</string>
<string name="settings_meta_reset">Réinitialiser</string> <string name="settings_meta_reset">Réinitialiser</string>
<string name="settings_meta_reset_confirm">Vous allez réinitialiser tous vos paramètres. Souhaitez-vous poursuivre ?</string> <string name="settings_meta_reset_confirm">Vous allez réinitialiser tous vos paramètres. Souhaitez-vous poursuivre ?</string>
@ -231,4 +229,4 @@
<string name="settings_gesture_description_down_left_edge">Balayer vers le bas au bord gauche de l\'écran</string> <string name="settings_gesture_description_down_left_edge">Balayer vers le bas au bord gauche de l\'écran</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Balayer au bord de l\'écran</string> <string name="settings_enabled_gestures_edge_swipe_summary">Balayer au bord de l\'écran</string>
<string name="settings_clock_color">Couleur</string> <string name="settings_clock_color">Couleur</string>
</resources> </resources>

View file

@ -34,7 +34,6 @@
<br/><br/><br/><br/> <br/><br/><br/><br/>
Puoi cambiare le tue scelte in seguito nelle impostazioni. Puoi cambiare le tue scelte in seguito nelle impostazioni.
]]></string> ]]></string>
<string name="settings_meta_cant_select_launcher_msg">Il tuo dispositivo non supporta questa funzione. Vuoi aprire la pagina di dettaglio dell\'applicazione?</string>
<string name="alert_cant_open_title">Impossibile aprire l\'applicazione</string> <string name="alert_cant_open_title">Impossibile aprire l\'applicazione</string>
<string name="alert_cant_open_message">Desideri modificare le impostazioni?</string> <string name="alert_cant_open_message">Desideri modificare le impostazioni?</string>
<string name="toast_cant_open_message">Apri le impostazioni per abbinare un\'azione a questo gesto</string> <string name="toast_cant_open_message">Apri le impostazioni per abbinare un\'azione a questo gesto</string>
@ -115,7 +114,6 @@
<string name="settings_launcher_change_wallpaper">Cambia immagine di sfondo</string> <string name="settings_launcher_change_wallpaper">Cambia immagine di sfondo</string>
<string name="settings_launcher_section_display">Schermo</string> <string name="settings_launcher_section_display">Schermo</string>
<string name="settings_display_screen_timeout_disabled">Mantieni lo schermo acceso</string> <string name="settings_display_screen_timeout_disabled">Mantieni lo schermo acceso</string>
<string name="settings_display_full_screen">Schermo intero</string>
<string name="settings_display_rotate_screen">Ruota lo schermo</string> <string name="settings_display_rotate_screen">Ruota lo schermo</string>
<string name="settings_launcher_section_functionality">Funzionalità</string> <string name="settings_launcher_section_functionality">Funzionalità</string>
<string name="settings_functionality_auto_keyboard">Apri automaticamente la tastiera per cercare</string> <string name="settings_functionality_auto_keyboard">Apri automaticamente la tastiera per cercare</string>
@ -237,4 +235,4 @@
<string name="toast_activity_not_found_browser">Impossibile aprire l\'URL: nessun browser trovato.</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="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> <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> </resources>

View file

@ -1,2 +1,200 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="alert_cant_open_title">アプリを開けません</string>
<string name="alert_cant_open_message">設定を変更しますか?</string>
<string name="settings_title">設定</string>
<string name="settings_tab_app">アプリ</string>
<string name="settings_tab_launcher">ランチャー</string>
<string name="settings_tab_meta">その他</string>
<string name="toast_cant_open_message">このジェスチャのアクションを選択するには設定を開きます</string>
<string name="settings_gesture_description_up">上にスワイプ</string>
<string name="settings_gesture_description_tap_up">タップしてから上にスワイプ</string>
<string name="settings_gesture_double_up">Double Up</string>
<string name="settings_gesture_tap_up">Tap + Up</string>
<string name="settings_gesture_up">Up</string>
<string name="settings_gesture_back">Back</string>
<string name="settings_gesture_description_double_up">2本指で上にスワイプ</string>
<string name="settings_gesture_down">Down</string>
<string name="settings_gesture_description_down">下にスワイプ</string>
<string name="settings_gesture_tap_down">Tap + Down</string>
<string name="settings_gesture_description_tap_down">タップしてから下にスワイプ</string>
<string name="settings_gesture_double_down">Double Down</string>
<string name="settings_gesture_description_double_down">2本指で下にスワイプ</string>
<string name="settings_gesture_left">Left</string>
<string name="settings_gesture_description_left">左にスワイプ</string>
<string name="settings_gesture_tap_left">Tap + Left</string>
<string name="settings_gesture_description_tap_left">タップしてから左にスワイプ</string>
<string name="settings_gesture_double_left">Double Left</string>
<string name="settings_gesture_description_double_left">2本指で左にスワイプ</string>
<string name="settings_gesture_right">Right</string>
<string name="settings_gesture_description_right">右にスワイプ</string>
<string name="settings_gesture_description_tap_right">タップしてから右にスワイプ</string>
<string name="settings_gesture_double_right">Double Right</string>
<string name="settings_gesture_right_top_edge">Right (Top)</string>
<string name="settings_gesture_description_right_top_edge">画面の上部で右にスワイプ</string>
<string name="settings_gesture_right_bottom_edge">Right (Bottom)</string>
<string name="settings_gesture_description_right_bottom_edge">画面の下部で右にスワイプ</string>
<string name="settings_gesture_left_bottom_edge">Left (Bottom)</string>
<string name="settings_gesture_description_left_bottom_edge">画面の下部で左にスワイプ</string>
<string name="settings_gesture_left_top_edge">Left (Top)</string>
<string name="settings_gesture_description_left_top_edge">画面の上部で左にスワイプ</string>
<string name="settings_gesture_up_left_edge">Up (Left Edge)</string>
<string name="settings_gesture_up_right_edge">Up (Right Edge)</string>
<string name="settings_gesture_description_up_right_edge">画面の右端で上にスワイプ</string>
<string name="settings_gesture_down_left_edge">Down (Left Edge)</string>
<string name="settings_gesture_description_down_left_edge">画面の左端で下にスワイプ</string>
<string name="settings_gesture_down_right_edge">Down (Right Edge)</string>
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
<string name="settings_gesture_description_swipe_larger">左上 -&gt; 右中 -&gt; 左下</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Reverse)]]></string>
<string name="settings_gesture_description_swipe_larger_reverse">左下 -&gt; 右中 -&gt; 左上</string>
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
<string name="settings_gesture_description_swipe_smaller">右上 -&gt; 左中 -&gt; 右下</string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Reverse)]]></string>
<string name="settings_gesture_swipe_v">V</string>
<string name="settings_gesture_description_swipe_v">左上 -&gt; 中下 -&gt; 右上</string>
<string name="settings_gesture_swipe_v_reverse">V (Reverse)</string>
<string name="settings_gesture_description_swipe_v_reverse">右上 -&gt; 中下 -&gt; 左上</string>
<string name="settings_gesture_swipe_lambda">Λ</string>
<string name="settings_gesture_description_swipe_lambda">左下 -&gt; 中上 -&gt; 右下</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (Reverse)</string>
<string name="settings_gesture_description_swipe_lambda_reverse">右下 -&gt; 中上 -&gt; 左下</string>
<string name="settings_gesture_vol_down">Volume Down</string>
<string name="settings_gesture_description_vol_down">音量ダウンボタンを押す</string>
<string name="settings_gesture_double_click">Double Click</string>
<string name="settings_gesture_description_double_click">空白部分をダブルタップ</string>
<string name="settings_gesture_long_click">Long Click</string>
<string name="settings_gesture_date">Date</string>
<string name="settings_gesture_description_date">日付をタップ</string>
<string name="settings_gesture_time">Time</string>
<string name="settings_gesture_description_time">時刻をタップ</string>
<string name="settings_apps_choose">アプリを選択</string>
<string name="settings_launcher_section_appearance">外観</string>
<string name="settings_theme_color_theme">カラーテーマ</string>
<string name="settings_theme_color_theme_item_default">デフォルト</string>
<string name="settings_theme_color_theme_item_dark">ダーク</string>
<string name="settings_theme_color_theme_item_dynamic">ダイナミック</string>
<string name="settings_theme_text_shadow">文字の影</string>
<string name="settings_theme_background_item_transparent">透明</string>
<string name="settings_theme_background_item_blur">ブラー</string>
<string name="settings_theme_background_item_solid">ソリッド</string>
<string name="settings_theme_font">フォント</string>
<string name="settings_theme_font_item_system_default">システムデフォルト</string>
<string name="settings_theme_monochrome_icons">モノクロのアプリアイコン</string>
<string name="settings_launcher_section_date_time"><![CDATA[Date & time]]></string>
<string name="settings_clock_color"></string>
<string name="settings_clock_time_visible">時刻を表示</string>
<string name="settings_clock_date_visible">日付を表示</string>
<string name="settings_clock_localized">ローカライズされた日付形式を使用する</string>
<string name="settings_clock_show_seconds">秒を表示</string>
<string name="settings_clock_flip_date_time">日付と時刻を反転</string>
<string name="settings_theme_wallpaper">壁紙を選択</string>
<string name="settings_launcher_change_wallpaper">壁紙を変更</string>
<string name="settings_launcher_section_display">表示</string>
<string name="settings_display_screen_timeout_disabled">画面オンを維持</string>
<string name="settings_display_rotate_screen">画面の回転</string>
<string name="settings_enabled_gestures_double_swipe_summary">2本指でスワイプ</string>
<string name="settings_enabled_gestures_edge_swipe">Edgeスワイプアクション</string>
<string name="settings_enabled_gestures_edge_swipe_summary">画面端でスワイプ</string>
<string name="settings_functionality_search_web_summary">アプリリストで検索中にリターンキーを押すとWeb検索が起動します。</string>
<string name="settings_functionality_search_web">Webで検索</string>
<string name="settings_functionality_auto_keyboard">検索時にキーボードを表示</string>
<string name="settings_launcher_section_apps">アプリ</string>
<string name="settings_apps_hide_bound_apps">ジェスチャーに設定されたアプリをアプリ一覧に表示しない</string>
<string name="settings_apps_hide_paused_apps">一時停止されたアプリを隠す</string>
<string name="settings_list_layout">アプリ一覧のレイアウト</string>
<string name="settings_list_reverse_layout">アプリ一覧を反転</string>
<string name="settings_list_layout_item_default">デフォルト</string>
<string name="settings_list_layout_item_text">テキスト</string>
<string name="settings_list_layout_item_grid">グリッド</string>
<string name="settings_meta_show_tutorial">ランチャーのチュートリアルを見る</string>
<string name="settings_meta_reset">設定をリセット</string>
<string name="settings_meta_reset_confirm">すべての設定を破棄します。続行しますか?</string>
<string name="settings_meta_view_code">ソースコードを見る</string>
<string name="dialog_report_bug_title">バグを報告</string>
<string name="dialog_report_bug_button_clipboard">クリップボードにコピー</string>
<string name="dialog_report_bug_security_info">セキュリティ上の脆弱性をGitHubに公開しないでください。代わりに以下を使用してください。</string>
<string name="dialog_report_bug_button_security">セキュリティ上の脆弱性を報告</string>
<string name="dialog_report_bug_create_report">レポートを作成</string>
<string name="settings_meta_join_chat">µLauncherのチャットに入る</string>
<string name="settings_meta_privacy">プライバシーポリシー</string>
<string name="settings_meta_discord">Discordに参加してください</string>
<string name="list_title_hidden">非表示のアプリ</string>
<string name="list_title_private_space">プライベートスペース</string>
<string name="list_title_pick">アプリを選択</string>
<string name="list_tab_app">アプリ</string>
<string name="list_tab_other">その他</string>
<string name="list_app_delete">アンインストール</string>
<string name="list_app_info">アプリ情報</string>
<string name="list_app_favorite_remove">お気に入りから削除</string>
<string name="list_app_hidden_add">隠す</string>
<string name="list_app_rename">名称を変更</string>
<string name="list_not_removed">アプリを削除できませんでした</string>
<string name="list_apps_search_hint">検索</string>
<string name="list_apps_search_hint_no_auto_launch">検索(自動起動なし)</string>
<string name="list_other_settings">µLauncherの設定</string>
<string name="list_other_list">すべてのアプリ</string>
<string name="list_other_toggle_private_space_lock">プライベートスペースのロックを切り替え</string>
<string name="list_other_volume_up">音楽: うるさい</string>
<string name="list_other_volume_down">音楽: ひっそり</string>
<string name="list_other_track_next">音楽: 次</string>
<string name="list_other_track_previous">音楽: 前</string>
<string name="list_other_expand_notifications_panel">通知パネルを表示</string>
<string name="list_other_nop">なにもしねぇ</string>
<string name="list_other_lock_screen">画面をロック</string>
<string name="list_other_torch">ライトを切り替え</string>
<string name="pin_shortcut_title">ショートカットを追加</string>
<string name="pin_shortcut_button_bind">ジェシュチャーに設定</string>
<string name="pin_shortcut_button_ok">Ok</string>
<string name="pin_shortcut_switch_visible">アプリ一覧に表示</string>
<string name="tutorial_title">チュートリアル</string>
<string name="tutorial_concept_title">コンセプト</string>
<string name="tutorial_usage_title">使い方</string>
<string name="tutorial_usage_text">ホーム画面には現地の日付と時刻が表示されます。邪魔されることはありません。</string>
<string name="tutorial_usage_text_2">1回のスワイプまたはボタンのタップでアプリを起動できます。次のスライドでいくつか選択してください。</string>
<string name="tutorial_setup_title">セットアップ</string>
<string name="tutorial_setup_text_2">選択内容は後で変更することもできます。</string>
<string name="tutorial_finish_title">さあ行きましょう!</string>
<string name="tutorial_finish_button">始める</string>
<string name="settings">設定</string>
<string name="settings_gesture_description_back">戻るボタン / 戻るジェスチャ</string>
<string name="settings_theme_color_theme_item_light">ライト</string>
<string name="settings_enabled_gestures_double_swipe">Doubleスワイプアクション</string>
<string name="settings_functionality_auto_launch">検索結果を起動</string>
<string name="list_title_favorite">お気に入りのアプリ</string>
<string name="settings_gesture_description_vol_up">音量アップボタンを押す</string>
<string name="settings_gesture_description_long_click">空白部分をロングタップ</string>
<string name="settings_launcher_section_functionality">機能性</string>
<string name="dialog_report_bug_info">µLauncherの改善にご協力いただきありがとうございます。\nバグレポートに次の情報を追加することを検討してください。</string>
<string name="list_app_favorite_add">お気に入りに追加</string>
<string name="settings_gesture_description_up_left_edge">画面の左端で上にスワイプ</string>
<string name="settings_gesture_description_down_right_edge">画面の右端で下にスワイプ</string>
<string name="settings_apps_install">アプリをインストール</string>
<string name="list_removed">選択されたアプリを削除しました</string>
<string name="tutorial_finish_text">始める準備はできました!これがあなたにとって大きな価値となることを願っています! \t- FinnLauncherの作成者とJosiaいくつかの改良を行い、フォーク μLauncher を保守)</string>
<string name="settings_gesture_tap_right">Tap + Right</string>
<string name="settings_gesture_description_double_right">2本指で右にスワイプ</string>
<string name="settings_apps_hidden">非表示のアプリ</string>
<string name="settings_general_choose_home_screen">μLauncherホーム画面に設定</string>
<string name="settings_meta_fork_contact">フォークの開発者に問い合わせ</string>
<string name="settings_meta_contact">オリジナルの開発者に問い合わせる</string>
<string name="list_other_list_favorites">お気に入りのアプリ</string>
<string name="list_other_track_play_pause">音楽: 再生 / 一時停止</string>
<string name="settings_theme_background_item_dim">薄暗い</string>
<string name="settings_launcher_sensitivity">感度</string>
<string name="settings_meta_cant_select_launcher">アプリ情報</string>
<string name="settings_gesture_vol_up">Volume Up</string>
<string name="list_title_view">すべてのアプリ</string>
<string name="list_app_hidden_remove">表示</string>
<string name="settings_gesture_description_swipe_smaller_reverse">右下 -&gt; 左中 -&gt; 右上</string>
<string name="settings_theme_background">背景(アプリ一覧と設定)</string>
<string name="settings_enabled_gestures_edge_swipe_edge_width">端の幅</string>
<string name="settings_functionality_auto_launch_summary">この機能を一時的に無効にするにはスペースキーを押します。</string>
<string name="list_other_list_private_space">プライベートスペース</string>
<string name="settings_apps_hide_private_space_apps">アプリ一覧からプライベートスペースを隠す</string>
<string name="settings_meta_report_bug">バグを報告</string>
<string name="tutorial_start_text">このランチャーの使い方を学ぶのにほんの数秒しかかかりません</string>
<string name="tutorial_concept_text">Launcherは、最小限かつ効率的で、邪魔にならないように設計されています。支払い、広告、追跡サービスは一切ありません。</string>
<string name="tutorial_concept_text_2">このアプリはオープンソースMIT ライセンスであり、GitHub で入手できます!リポジトリを必ずチェックしてください!</string>
<string name="tutorial_setup_text">デフォルトのアプリをいくつか選択しました。必要に応じて今すぐ変更できます。</string>
</resources>

View file

@ -66,7 +66,6 @@
<string name="settings_launcher_change_wallpaper">Alterar 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_launcher_section_display">Exibição</string>
<string name="settings_display_screen_timeout_disabled">Manter a tela ligada</string> <string name="settings_display_screen_timeout_disabled">Manter a tela ligada</string>
<string name="settings_display_full_screen">Usar tela cheia</string>
<string name="settings_launcher_section_functionality">Funcionalidades</string> <string name="settings_launcher_section_functionality">Funcionalidades</string>
<string name="settings_enabled_gestures_double_swipe">Gestos com 2 dedos</string> <string name="settings_enabled_gestures_double_swipe">Gestos com 2 dedos</string>
<string name="settings_enabled_gestures_edge_swipe">Ações de deslize nas bordas</string> <string name="settings_enabled_gestures_edge_swipe">Ações de deslize nas bordas</string>
@ -80,7 +79,6 @@
--> -->
<string name="settings_general_choose_home_screen">Definir o μLauncher como tela inicial</string> <string name="settings_general_choose_home_screen">Definir o μLauncher como tela inicial</string>
<string name="settings_meta_cant_select_launcher">Informações do aplicativo</string> <string name="settings_meta_cant_select_launcher">Informações do aplicativo</string>
<string name="settings_meta_cant_select_launcher_msg">Seu dispositivo não é compatível com esse recurso. Gerenciar detalhes do app em vez disso?</string>
<string name="settings_meta_show_tutorial">Ver tutorial do launcher</string> <string name="settings_meta_show_tutorial">Ver tutorial do launcher</string>
<string name="settings_meta_reset">Redefinir configuraçãos</string> <string name="settings_meta_reset">Redefinir configuraçãos</string>
<string name="settings_meta_reset_confirm">Você vai descartar todas as suas preferências. Continuar?</string> <string name="settings_meta_reset_confirm">Você vai descartar todas as suas preferências. Continuar?</string>

View file

@ -137,7 +137,6 @@
<string name="settings_launcher_change_wallpaper">Duvar kağıdını değiştir</string> <string name="settings_launcher_change_wallpaper">Duvar kağıdını değiştir</string>
<string name="settings_launcher_section_display">Ekran</string> <string name="settings_launcher_section_display">Ekran</string>
<string name="settings_display_screen_timeout_disabled">Ekranıık tut</string> <string name="settings_display_screen_timeout_disabled">Ekranıık tut</string>
<string name="settings_display_full_screen">Tam ekran kullan</string>
<string name="settings_display_rotate_screen">Ekranı döndür</string> <string name="settings_display_rotate_screen">Ekranı döndür</string>
<string name="settings_launcher_section_functionality">İşlevsellik</string> <string name="settings_launcher_section_functionality">İşlevsellik</string>
<string name="settings_enabled_gestures_edge_swipe_summary">Ekranın köşesinden kaydırın</string> <string name="settings_enabled_gestures_edge_swipe_summary">Ekranın köşesinden kaydırın</string>
@ -165,7 +164,6 @@
<string name="settings_list_layout_item_text">Metin</string> <string name="settings_list_layout_item_text">Metin</string>
<string name="settings_list_layout_item_grid">Izgara</string> <string name="settings_list_layout_item_grid">Izgara</string>
<string name="settings_meta_cant_select_launcher">Uygulama Detayı</string> <string name="settings_meta_cant_select_launcher">Uygulama Detayı</string>
<string name="settings_meta_cant_select_launcher_msg">Sizin cihazınız bu özelliği desteklemiyor. Onun yerine uygulama detaylarını düzenleyin?</string>
<string name="settings_meta_reset">Ayarları Sıfırlayın</string> <string name="settings_meta_reset">Ayarları Sıfırlayın</string>
<string name="settings_meta_reset_confirm">Tüm tercihlerinizi bir kenara bırakacaksınız. Devam mı?</string> <string name="settings_meta_reset_confirm">Tüm tercihlerinizi bir kenara bırakacaksınız. Devam mı?</string>
<string name="settings_theme_font_item_monospace">Tek uzay</string> <string name="settings_theme_font_item_monospace">Tek uzay</string>
@ -209,4 +207,4 @@
<string name="dialog_select_color_ok">OK</string> <string name="dialog_select_color_ok">OK</string>
<string name="dialog_select_color_color_hex">Renk</string> <string name="dialog_select_color_color_hex">Renk</string>
<string name="dialog_choose_color_title">Renk seçin</string> <string name="dialog_choose_color_title">Renk seçin</string>
</resources> </resources>

View file

@ -44,14 +44,12 @@
<string name="settings_theme_wallpaper">选择一个壁纸</string> <string name="settings_theme_wallpaper">选择一个壁纸</string>
<string name="settings_launcher_change_wallpaper">换壁纸</string> <string name="settings_launcher_change_wallpaper">换壁纸</string>
<string name="settings_display_screen_timeout_disabled">保持屏幕常亮</string> <string name="settings_display_screen_timeout_disabled">保持屏幕常亮</string>
<string name="settings_display_full_screen">使用全屏</string>
<string name="settings_launcher_section_functionality">功能</string> <string name="settings_launcher_section_functionality">功能</string>
<string name="settings_enabled_gestures_edge_swipe">边缘滑动动作</string> <string name="settings_enabled_gestures_edge_swipe">边缘滑动动作</string>
<string name="settings_functionality_auto_launch">零点击启动唯一搜索结果</string> <string name="settings_functionality_auto_launch">直接启动匹配搜索内容的应用</string>
<string name="settings_functionality_auto_keyboard">搜索时呼出键盘</string> <string name="settings_functionality_auto_keyboard">搜索时呼出键盘</string>
<string name="settings_launcher_sensitivity">灵敏度</string> <string name="settings_launcher_sensitivity">灵敏度</string>
<string name="settings_meta_cant_select_launcher">应用信息</string> <string name="settings_meta_cant_select_launcher">应用信息</string>
<string name="settings_meta_cant_select_launcher_msg">您的设备不支持此功能。要不打开应用程序详细?</string>
<string name="settings_meta_show_tutorial">查看启动器教程</string> <string name="settings_meta_show_tutorial">查看启动器教程</string>
<string name="settings_meta_reset">重置设置</string> <string name="settings_meta_reset">重置设置</string>
<string name="settings_meta_reset_confirm">你将放弃你所有的配置。继续吗?</string> <string name="settings_meta_reset_confirm">你将放弃你所有的配置。继续吗?</string>
@ -213,4 +211,63 @@
<string name="toast_private_space_default_home_screen">µLauncher 需要作为默认的主屏幕来访问私人空间。</string> <string name="toast_private_space_default_home_screen">µLauncher 需要作为默认的主屏幕来访问私人空间。</string>
<string name="toast_activity_not_found_search_web">没有找到处理搜索的应用。</string> <string name="toast_activity_not_found_search_web">没有找到处理搜索的应用。</string>
<string name="toast_activity_not_found_browser">无法打开 URL找不到浏览器。</string> <string name="toast_activity_not_found_browser">无法打开 URL找不到浏览器。</string>
<string name="dialog_consent_accessibility_privileges">我已知晓,这将赋予 µLauncher 广泛且重要的权限。</string>
<string name="settings_apps_hide_private_space_apps">在应用程序列表中隐藏私人空间</string>
<string name="settings_apps_hide_paused_apps">隐藏已被暂停的应用</string>
<string name="settings_gesture_description_back">返回按键 / 返回手势</string>
<string name="settings_gesture_description_tap_down">先单击然后再下滑</string>
<string name="settings_functionality_search_web">在网络上搜索</string>
<string name="settings_gesture_description_swipe_smaller">(从)右上 (滑向)中左(滑向)右下</string>
<string name="settings_functionality_search_web_summary">通过按回车键在应用列表搜索界面激活网络搜索。</string>
<string name="settings_gesture_description_swipe_lambda">(从)左下 (滑向)中上(滑向)右下</string>
<string name="screen_lock_method_dialog_text"><![CDATA[
<h1>选择锁定设备的方式</h1>
有2种方式可以用来锁定屏幕。
遗憾的是,两者都有缺点:<br/><br/>
<h3>通过设置“设备管理应用”</h3>
无法和指纹解锁和脸部解锁共同使用。
<br/>
<br/>
<h3>通过“无障碍”功能</h3>
需要更多的权限。
µLauncher 将这些权限仅用于锁定屏幕。
<br/>
(对于任何一个从网上下载的应用所做的类似声明,你都不应该抱持“默认为可信”的态度,你可以并应该检查一下它的<a href=\"https://github.com/jrpie/Launcher\">源代码</a>.)
<br/>
在某些设备上激活辅助功能服务后启动PIN码将不再用于加密数据。
如果遇到该问题,可以通过<a href="https://issuetracker.google.com/issues/37010136#comment36">该方法</a>重新激活启动PIN码用于数据加密。
<br/><br/><br/><br/>
你可以在设置中随时更改这个选项。
]]></string>
<string name="list_apps_search_hint_no_auto_launch">搜索(不触发自动启动应用程序)</string>
<string name="dialog_consent_accessibility_text"><![CDATA[您即将激活“无障碍”服务。这将授予 µLauncher <strong>广泛且重要的权限</strong>。<br/>µLauncher 将这些权限<strong>仅用于锁定屏幕</strong>。µLauncher <strong>绝不会收集任何数据</strong>。尤其是µLauncher 不会使用“无障碍”服务来收集任何数据。]]></string>
<string name="settings_gesture_description_swipe_larger">(从)左上 (滑向)中右(滑向)左下</string>
<string name="settings_gesture_tap_up">单击 + 上滑</string>
<string name="settings_gesture_tap_down">单击 + 下滑</string>
<string name="settings_gesture_tap_left">单击 + 左滑</string>
<string name="settings_gesture_description_tap_left">先单击然后再左滑</string>
<string name="settings_gesture_description_tap_up">先单击然后再上滑</string>
<string name="settings_gesture_tap_right">单击 + 右滑</string>
<string name="settings_gesture_description_tap_right">先单击然后再右滑</string>
<string name="settings_gesture_description_swipe_larger_reverse">(从)左下 (滑向)中右(滑向)左上</string>
<string name="settings_gesture_description_swipe_smaller_reverse">(从)右下 (滑向)中左(滑向)右上</string>
<string name="settings_gesture_description_swipe_v">(从)左上 (滑向)中下(滑向)右上</string>
<string name="settings_gesture_description_swipe_v_reverse">(从)右上 (滑向)中下(滑向)左上</string>
<string name="settings_gesture_description_swipe_lambda_reverse">(从)右下 (滑向)中上(滑向)左下</string>
<string name="settings_gesture_swipe_lambda_reverse">Λ (反向)</string>
<string name="settings_gesture_swipe_v_reverse">V反向</string>
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (反向)]]></string>
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (反向)]]></string>
<string name="settings_functionality_auto_launch_summary">按空格键临时暂停该功能。</string>
<string name="settings_list_layout">应用程序列表样式</string>
<string name="pin_shortcut_button_bind">绑定到手势</string>
<string name="list_other_track_play_pause">音乐:播放 / 暂停</string>
<string name="dialog_report_bug_button_security">报告安全漏洞</string>
<string name="dialog_report_bug_security_info">安全漏洞请不要在 Github 上以公开的方式提交,而是使用以下方式进行报告:</string>
<string name="dialog_report_bug_info">感谢您帮助改进 µLauncher\n请考虑在您的应用程序错误报告中添加以下信息</string>
<string name="dialog_consent_accessibility_other_options">我已知晓,还有其他替代方法(使用设备管理员权限或电源按键)。</string>
</resources> </resources>

View file

@ -164,6 +164,7 @@
<string name="settings_meta_privacy_url" translatable="false">https://s.jrpie.de/android-legal</string> <string name="settings_meta_privacy_url" translatable="false">https://s.jrpie.de/android-legal</string>
<string name="settings_meta_contact_url" translatable="false">https://www.finnmglas.com/contact/</string> <string name="settings_meta_contact_url" translatable="false">https://www.finnmglas.com/contact/</string>
<string name="settings_meta_chat_url" translatable="false">https://s.jrpie.de/launcher-chat</string> <string name="settings_meta_chat_url" translatable="false">https://s.jrpie.de/launcher-chat</string>
<string name="settings_meta_donate_url" translatable="false">https://s.jrpie.de/launcher-donate</string>
<!-- <!--
- -

View file

@ -179,7 +179,7 @@
<string name="settings_apps_hide_paused_apps">Hide paused apps</string> <string name="settings_apps_hide_paused_apps">Hide paused apps</string>
<string name="settings_apps_hide_private_space_apps">Hide private space from app list</string> <string name="settings_apps_hide_private_space_apps">Hide private space from app list</string>
<string name="settings_list_layout">Layout of app list</string> <string name="settings_list_layout">Layout of app list</string>
<string name="settings_list_reverse_layout">Reverse app list</string> <string name="settings_list_reverse_layout">Reverse the app list</string>
<string name="settings_list_layout_item_default">Default</string> <string name="settings_list_layout_item_default">Default</string>
<string name="settings_list_layout_item_text">Text</string> <string name="settings_list_layout_item_text">Text</string>
@ -192,7 +192,6 @@
--> -->
<string name="settings_general_choose_home_screen">Set μLauncher as home screen</string> <string name="settings_general_choose_home_screen">Set μLauncher as home screen</string>
<string name="settings_meta_cant_select_launcher">App Info</string> <string name="settings_meta_cant_select_launcher">App Info</string>
<string name="settings_meta_cant_select_launcher_msg">Your device does not support this feature. Manage application details instead?</string>
<string name="settings_meta_show_tutorial">View Launcher Tutorial</string> <string name="settings_meta_show_tutorial">View Launcher Tutorial</string>
@ -211,6 +210,7 @@
<string name="settings_meta_fork_contact">Contact the developer of the fork</string> <string name="settings_meta_fork_contact">Contact the developer of the fork</string>
<string name="settings_meta_join_chat">Join µLauncher chat</string> <string name="settings_meta_join_chat">Join µLauncher chat</string>
<string name="settings_meta_donate">Donate</string>
<string name="settings_meta_privacy">Privacy Policy</string> <string name="settings_meta_privacy">Privacy Policy</string>
@ -251,8 +251,9 @@
<string name="list_other_list_favorites">Favorite Applications</string> <string name="list_other_list_favorites">Favorite Applications</string>
<string name="list_other_list_private_space">Private Space</string> <string name="list_other_list_private_space">Private Space</string>
<string name="list_other_toggle_private_space_lock">Toggle Private Space Lock</string> <string name="list_other_toggle_private_space_lock">Toggle Private Space Lock</string>
<string name="list_other_volume_up">Music: Louder</string> <string name="list_other_volume_up">Raise Volume</string>
<string name="list_other_volume_down">Music: Quieter</string> <string name="list_other_volume_down">Lower Volume</string>
<string name="list_other_volume_adjust">Adjust Volume</string>
<string name="list_other_track_next">Music: Next</string> <string name="list_other_track_next">Music: Next</string>
<string name="list_other_track_previous">Music: Previous</string> <string name="list_other_track_previous">Music: Previous</string>
<string name="list_other_track_play_pause">Music: Play / Pause</string> <string name="list_other_track_play_pause">Music: Play / Pause</string>

View file

@ -0,0 +1,13 @@
* Pinned shortcuts can now be added to app list
* New action: adjust volume (thank you, zabrinu!)
* Added option to hide navigation bar (thank you, acanoe!)
* Added option to reverse the app list (thank you, spacefrogg!)
* Show question mark icon when an unknown app is bound to a gesture
* Improved German translation
* Improved Portuguese translation (thank you, "Vossa Excelencia"!)
* Fixed detection of long click gesture
* Fixed blurred text in dialogs
* Fixed a crash when private space is locked after app restarts (thank you, alexytomi!)
* Fixed some additional bugs

View file

@ -0,0 +1,22 @@
µLauncherは、スワイプジェスチャとタップだけでアプリを起動できるホーム画面です。
必要最小限で、効率的で、気が散らない。
ホーム画面には日付、時刻、壁紙のみが表示されます。
戻るを押すか上にスワイプすると(これは設定可能)、
インストールされているすべてのアプリのリストが開き、効率的に検索できます。
このアプリは、Finn M Glas氏のアプリ <a href="https://f-droid.org/packages/com.finnmglas.launcher/">Launcher</a> のフォークです。
機能:
* 35種のジェスチャーにアクションを設定できます。
* アクションは以下のいずれかになります:
- アプリを起動
- アプリを表示
- お気に入りのアプリを表示
- ボリュームを上げる/下げる
- 音楽: 次/前の曲
- 画面をロック
- ライトの切り替え
- 通知 / クイック設定を表示
* 仕事用プロファイルに対応しているので、Shelterなどのアプリも使えます。

View file

@ -0,0 +1 @@
気が散らない、最小限の Android ホーム画面。

View file

@ -0,0 +1 @@
µLauncher