mirror of
https://github.com/jrpie/Launcher.git
synced 2025-04-04 19:34:30 +02:00
Compare commits
16 commits
f048566bf6
...
3e632c9892
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3e632c9892 | ||
![]() |
268acedb2c | ||
![]() |
4b756d47ee | ||
![]() |
e323309cf9 | ||
![]() |
47a5476978 | ||
3597baee1f | |||
e02ca4091f | |||
541e60356c | |||
492749a340 | |||
55af392706 | |||
077ee4381a | |||
e250a58ef4 | |||
c7af387a94 | |||
6cd17343fc | |||
b156b68d53 | |||
c9ee2c6304 |
37 changed files with 587 additions and 202 deletions
|
@ -23,8 +23,8 @@ android {
|
|||
minSdkVersion 21
|
||||
targetSdkVersion 35
|
||||
compileSdk 35
|
||||
versionCode 39
|
||||
versionName "0.0.23"
|
||||
versionCode 40
|
||||
versionName "0.1.0"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ import android.content.pm.ShortcutInfo
|
|||
import android.os.AsyncTask
|
||||
import android.os.Build
|
||||
import android.os.Build.VERSION_CODES
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.os.UserHandle
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
|
@ -108,12 +110,10 @@ class Application : android.app.Application() {
|
|||
// Try to restore old preferences
|
||||
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()) {
|
||||
resetPreferences(this)
|
||||
|
||||
LauncherPreferences.internal().started(true)
|
||||
openTutorial(this)
|
||||
}
|
||||
|
||||
|
||||
|
@ -134,7 +134,8 @@ class Application : android.app.Application() {
|
|||
it.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)
|
||||
}
|
||||
}
|
||||
ContextCompat.registerReceiver(this, profileAvailabilityBroadcastReceiver, filter,
|
||||
ContextCompat.registerReceiver(
|
||||
this, profileAvailabilityBroadcastReceiver, filter,
|
||||
ContextCompat.RECEIVER_EXPORTED
|
||||
)
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ fun removeUnusedShortcuts(context: Context) {
|
|||
},
|
||||
profile
|
||||
)
|
||||
} catch (e: IllegalStateException) {
|
||||
} catch (e: Exception) {
|
||||
// https://github.com/jrpie/launcher/issues/116
|
||||
return null
|
||||
}
|
||||
|
@ -135,9 +135,7 @@ fun openInBrowser(url: String, context: Context) {
|
|||
}
|
||||
|
||||
fun openTutorial(context: Context) {
|
||||
context.startActivity(Intent(context, TutorialActivity::class.java).apply {
|
||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
})
|
||||
context.startActivity(Intent(context, TutorialActivity::class.java))
|
||||
}
|
||||
|
||||
|
||||
|
@ -196,7 +194,7 @@ fun getApps(
|
|||
loadList.add(detailedAppInfo)
|
||||
}
|
||||
}
|
||||
loadList.sortBy { it.getCustomLabel(context).toString() }
|
||||
loadList.sortBy { it.getCustomLabel(context) }
|
||||
|
||||
var end = System.currentTimeMillis()
|
||||
Log.i(LOG_TAG, "${loadList.size} apps loaded (${end - start}ms)")
|
||||
|
|
|
@ -13,6 +13,7 @@ import androidx.appcompat.content.res.AppCompatResources
|
|||
import de.jrpie.android.launcher.Application
|
||||
import de.jrpie.android.launcher.R
|
||||
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.togglePrivateSpaceLock
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
|
@ -66,7 +67,11 @@ enum class LauncherAction(
|
|||
R.string.list_other_list_private_space,
|
||||
R.drawable.baseline_security_24,
|
||||
{ context ->
|
||||
openAppsList(context, private = true)
|
||||
if ((context.applicationContext as Application).privateSpaceLocked.value != true
|
||||
|| !hidePrivateSpaceWhenLocked(context)
|
||||
) {
|
||||
openAppsList(context, private = true)
|
||||
}
|
||||
},
|
||||
available = { _ ->
|
||||
isPrivateSpaceSupported()
|
||||
|
@ -83,31 +88,37 @@ enum class LauncherAction(
|
|||
"volume_up",
|
||||
R.string.list_other_volume_up,
|
||||
R.drawable.baseline_volume_up_24,
|
||||
{ context -> audioVolumeAdjust(context, true)}
|
||||
{ context -> audioVolumeAdjust(context, AudioManager.ADJUST_RAISE) }
|
||||
),
|
||||
VOLUME_DOWN(
|
||||
"volume_down",
|
||||
R.string.list_other_volume_down,
|
||||
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(
|
||||
"play_pause_track",
|
||||
R.string.list_other_track_play_pause,
|
||||
R.drawable.baseline_play_arrow_24,
|
||||
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)}
|
||||
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) }
|
||||
),
|
||||
TRACK_NEXT(
|
||||
"next_track",
|
||||
R.string.list_other_track_next,
|
||||
R.drawable.baseline_skip_next_24,
|
||||
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_NEXT)}
|
||||
{ context -> audioManagerPressKey(context, KeyEvent.KEYCODE_MEDIA_NEXT) }
|
||||
),
|
||||
TRACK_PREV(
|
||||
"previous_track",
|
||||
R.string.list_other_track_previous,
|
||||
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",
|
||||
|
@ -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 =
|
||||
context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
|
||||
audioManager.adjustStreamVolume(
|
||||
AudioManager.STREAM_MUSIC,
|
||||
if (louder) {
|
||||
AudioManager.ADJUST_RAISE
|
||||
} else {
|
||||
AudioManager.ADJUST_LOWER
|
||||
},
|
||||
direction,
|
||||
AudioManager.FLAG_SHOW_UI
|
||||
)
|
||||
}
|
||||
|
|
|
@ -28,15 +28,20 @@ class PinnedShortcutInfo(
|
|||
fun getShortcutInfo(context: Context): ShortcutInfo? {
|
||||
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
|
||||
|
||||
return launcherApps.getShortcuts(
|
||||
ShortcutQuery().apply {
|
||||
setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED)
|
||||
setPackage(packageName)
|
||||
setActivity(ComponentName(packageName, activityName))
|
||||
setShortcutIds(listOf(id))
|
||||
},
|
||||
getUserFromId(user, context)
|
||||
)?.firstOrNull()
|
||||
return try {
|
||||
launcherApps.getShortcuts(
|
||||
ShortcutQuery().apply {
|
||||
setQueryFlags(ShortcutQuery.FLAG_MATCH_PINNED)
|
||||
setPackage(packageName)
|
||||
setActivity(ComponentName(packageName, activityName))
|
||||
setShortcutIds(listOf(id))
|
||||
},
|
||||
getUserFromId(user, context)
|
||||
)?.firstOrNull()
|
||||
} catch(_: Exception) {
|
||||
// can throw SecurityException or IllegalStateException when profile is locked
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
|
|
|
@ -91,10 +91,17 @@ fun isPrivateSpaceLocked(context: Context): Boolean {
|
|||
val privateSpaceUser = getPrivateSpaceUser(context) ?: return false
|
||||
return userManager.isQuietModeEnabled(privateSpaceUser)
|
||||
}
|
||||
|
||||
fun lockPrivateSpace(context: Context, lock: Boolean) {
|
||||
if (!isPrivateSpaceSupported()) {
|
||||
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 privateSpaceUser = getPrivateSpaceUser(context) ?: return
|
||||
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
|
||||
}
|
||||
|
||||
|
|
|
@ -21,8 +21,10 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
|
|||
r = R.class,
|
||||
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_time", type = long.class),
|
||||
// see PREFERENCE_VERSION in de.jrpie.android.launcher.preferences.Preferences.kt
|
||||
@Preference(name = "version_code", type = int.class, defaultValue = "-1"),
|
||||
}),
|
||||
@PreferenceGroup(name = "apps", prefix = "settings_apps_", suffix = "_key", value = {
|
||||
|
|
|
@ -100,7 +100,7 @@ private fun migrateAppInfoStringMap(key: String) {
|
|||
}
|
||||
}?.toMap(HashMap())
|
||||
)?.let {
|
||||
preferences.edit().putStringSet(key, it as Set<String>).apply()
|
||||
preferences.edit().putStringSet(key, it).apply()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import de.jrpie.android.launcher.preferences.serialization.SetAbstractAppInfoPre
|
|||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.util.HashSet
|
||||
import androidx.core.content.edit
|
||||
|
||||
/**
|
||||
* 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 {
|
||||
set.addAll(it)
|
||||
}
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
editor.putStringSet(
|
||||
key,
|
||||
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 {
|
||||
map.putAll(it)
|
||||
}
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
editor.putStringSet(key, serializer.serialize(map) as Set<String>?)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
|
@ -72,14 +75,11 @@ fun migratePreferencesFromVersion3() {
|
|||
assert(LauncherPreferences.internal().versionCode() == 3)
|
||||
|
||||
val preferences = LauncherPreferences.getSharedPreferences()
|
||||
val editor = preferences.edit()
|
||||
migrateSetAppInfo(LauncherPreferences.apps().keys().favorites(), preferences, editor)
|
||||
migrateSetAppInfo(LauncherPreferences.apps().keys().hidden(), preferences, editor)
|
||||
migrateMapAppInfoString(LauncherPreferences.apps().keys().customNames(), preferences, editor)
|
||||
|
||||
editor.apply()
|
||||
|
||||
|
||||
preferences.edit {
|
||||
migrateSetAppInfo(LauncherPreferences.apps().keys().favorites(), preferences, this)
|
||||
migrateSetAppInfo(LauncherPreferences.apps().keys().hidden(), preferences, this)
|
||||
migrateMapAppInfoString(LauncherPreferences.apps().keys().customNames(), preferences, this)
|
||||
}
|
||||
|
||||
LauncherPreferences.internal().versionCode(4)
|
||||
}
|
|
@ -27,10 +27,14 @@ fun View.blink(
|
|||
}
|
||||
|
||||
// Taken from: https://stackoverflow.com/a/30340794/12787264
|
||||
fun ImageView.transformGrayscale() {
|
||||
this.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply {
|
||||
setSaturation(0f)
|
||||
})
|
||||
fun ImageView.transformGrayscale(grayscale: Boolean) {
|
||||
this.colorFilter = if (grayscale) {
|
||||
ColorMatrixColorFilter(ColorMatrix().apply {
|
||||
setSaturation(0f)
|
||||
})
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -9,9 +9,6 @@ import android.util.DisplayMetrics
|
|||
import android.view.KeyEvent
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.Window
|
||||
import android.view.WindowInsets
|
||||
import android.view.WindowInsetsController
|
||||
import android.window.OnBackInvokedDispatcher
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
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.LauncherAction
|
||||
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.ui.tutorial.TutorialActivity
|
||||
import java.util.Locale
|
||||
|
@ -58,7 +56,6 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
super<AppCompatActivity>.onCreate(savedInstanceState)
|
||||
super<UIObject>.onCreate()
|
||||
|
||||
|
||||
val displayMetrics = DisplayMetrics()
|
||||
windowManager.defaultDisplay.getMetrics(displayMetrics)
|
||||
|
||||
|
@ -88,8 +85,6 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
binding.buttonFallbackSettings.setOnClickListener {
|
||||
LauncherAction.SETTINGS.invoke(this)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
|
@ -97,6 +92,11 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
|
||||
super<UIObject>.onStart()
|
||||
|
||||
// If the tutorial was not finished, start it
|
||||
if (!LauncherPreferences.internal().started()) {
|
||||
openTutorial(this)
|
||||
}
|
||||
|
||||
LauncherPreferences.getSharedPreferences()
|
||||
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
|
||||
|
||||
|
@ -220,7 +220,8 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
}
|
||||
|
||||
override fun onTouchEvent(event: MotionEvent): Boolean {
|
||||
return touchGestureDetector.onTouchEvent(event) || super.onTouchEvent(event)
|
||||
touchGestureDetector.onTouchEvent(event)
|
||||
return true
|
||||
}
|
||||
|
||||
override fun setOnClicks() {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package de.jrpie.android.launcher.ui
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.MotionEvent
|
||||
import android.view.ViewConfiguration
|
||||
import de.jrpie.android.launcher.actions.Gesture
|
||||
|
@ -27,6 +29,8 @@ class TouchGestureDetector(
|
|||
|
||||
private val MIN_TRIANGLE_HEIGHT = 250
|
||||
|
||||
private val longPressHandler = Handler(Looper.getMainLooper())
|
||||
|
||||
|
||||
data class Vector(val x: Float, val y: Float) {
|
||||
fun absSquared(): Float {
|
||||
|
@ -83,16 +87,28 @@ class TouchGestureDetector(
|
|||
}
|
||||
|
||||
private var paths = HashMap<Int, PointerPath>()
|
||||
private var gestureIsLongClick = false
|
||||
|
||||
private var lastTappedTime = 0L
|
||||
private var lastTappedLocation: Vector? = null
|
||||
|
||||
fun onTouchEvent(event: MotionEvent): Boolean {
|
||||
fun onTouchEvent(event: MotionEvent) {
|
||||
val pointerIdToIndex =
|
||||
(0..<event.pointerCount).associateBy { event.getPointerId(it) }
|
||||
|
||||
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
|
||||
|
@ -122,9 +138,17 @@ class TouchGestureDetector(
|
|||
}
|
||||
|
||||
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)
|
||||
}
|
||||
return true
|
||||
return
|
||||
}
|
||||
|
||||
private fun getGestureForDirection(direction: Vector): Gesture? {
|
||||
|
@ -171,10 +195,6 @@ class TouchGestureDetector(
|
|||
lastTappedTime = timeEnd
|
||||
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 {
|
||||
// detect swipes
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package de.jrpie.android.launcher.ui.list
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.res.Resources
|
||||
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.actions.LauncherAction
|
||||
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.isPrivateSpaceSetUp
|
||||
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
|
||||
|
||||
|
||||
// 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:
|
||||
* - used to view all apps and edit their settings
|
||||
|
@ -49,9 +41,34 @@ var forGesture: String? = null
|
|||
*/
|
||||
class ListActivity : AppCompatActivity(), UIObject {
|
||||
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) {
|
||||
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(
|
||||
AppCompatResources.getDrawable(
|
||||
this,
|
||||
|
@ -74,7 +91,6 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
}
|
||||
|
||||
|
||||
|
||||
enum class ListActivityIntention(val titleResource: Int) {
|
||||
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 */
|
||||
|
@ -119,20 +135,6 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
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) {
|
||||
isPrivateSpaceSetUp(this, showToast = true, launchSettings = true)
|
||||
|
@ -200,15 +202,16 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
fun updateTitle() {
|
||||
var titleResource = intention.titleResource
|
||||
if (intention == ListActivityIntention.VIEW) {
|
||||
titleResource = if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_hidden
|
||||
} else if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_private_space
|
||||
} else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_favorite
|
||||
} else {
|
||||
R.string.list_title_view
|
||||
}
|
||||
titleResource =
|
||||
if (hiddenVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_hidden
|
||||
} else if (privateSpaceVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_private_space
|
||||
} else if (favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE) {
|
||||
R.string.list_title_favorite
|
||||
} else {
|
||||
R.string.list_title_view
|
||||
}
|
||||
}
|
||||
|
||||
binding.listHeading.text = getString(titleResource)
|
||||
|
@ -255,7 +258,7 @@ private val TAB_TITLES = arrayOf(
|
|||
* The [ListSectionsPagerAdapter] returns the fragment,
|
||||
* 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) {
|
||||
|
||||
override fun getItem(position: Int): Fragment {
|
||||
|
@ -267,11 +270,11 @@ class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager
|
|||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
return context.resources.getString(TAB_TITLES[position])
|
||||
return activity.resources.getString(TAB_TITLES[position])
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return when (intention) {
|
||||
return when (activity.intention) {
|
||||
ListActivity.ListActivityIntention.VIEW -> 1
|
||||
else -> 2
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ class AppsRecyclerAdapter(
|
|||
|
||||
private val apps = (activity.applicationContext as Application).apps
|
||||
private val appsListDisplayed: MutableList<AbstractDetailedAppInfo> = mutableListOf()
|
||||
private val grayscale = LauncherPreferences.theme().monochromeIcons()
|
||||
|
||||
// temporarily disable auto launch
|
||||
var disableAutoLaunch: Boolean = false
|
||||
|
@ -67,7 +68,7 @@ class AppsRecyclerAdapter(
|
|||
override fun onClick(v: View) {
|
||||
val rect = Rect()
|
||||
img.getGlobalVisibleRect(rect)
|
||||
selectItem(adapterPosition, rect)
|
||||
selectItem(bindingAdapterPosition, rect)
|
||||
}
|
||||
|
||||
init {
|
||||
|
@ -79,20 +80,19 @@ class AppsRecyclerAdapter(
|
|||
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
|
||||
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) {
|
||||
appLabel = activity.packageManager.getUserBadgedLabel(
|
||||
appLabel,
|
||||
appsListDisplayed[i].getUser(activity)
|
||||
).toString()
|
||||
}
|
||||
|
||||
val appIcon = appsListDisplayed[i].getIcon(activity)
|
||||
|
||||
viewHolder.textView.text = appLabel
|
||||
viewHolder.img.setImageDrawable(appIcon)
|
||||
|
||||
if (LauncherPreferences.theme().monochromeIcons())
|
||||
viewHolder.img.transformGrayscale()
|
||||
|
||||
// decide when to show the options popup menu about
|
||||
if (intention == ListActivity.ListActivityIntention.VIEW) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import de.jrpie.android.launcher.apps.DetailedAppInfo
|
|||
import de.jrpie.android.launcher.apps.PinnedShortcutInfo
|
||||
import de.jrpie.android.launcher.getUserFromId
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import androidx.core.net.toUri
|
||||
|
||||
private const val LOG_TAG = "AppContextMenu"
|
||||
|
||||
|
@ -44,7 +45,7 @@ fun AbstractAppInfo.uninstall(activity: Activity) {
|
|||
Log.i(LOG_TAG, "uninstalling $this")
|
||||
|
||||
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE)
|
||||
intent.data = Uri.parse("package:$packageName")
|
||||
intent.data = "package:$packageName".toUri()
|
||||
getUserFromId(userId, activity).let { user ->
|
||||
intent.putExtra(Intent.EXTRA_USER, user)
|
||||
}
|
||||
|
|
|
@ -17,11 +17,6 @@ import de.jrpie.android.launcher.databinding.ListAppsBinding
|
|||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
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
|
||||
|
||||
|
||||
|
@ -54,7 +49,7 @@ class ListFragmentApps : Fragment(), UIObject {
|
|||
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
|
||||
|
||||
binding.listAppsCheckBoxFavorites.isChecked =
|
||||
(favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE)
|
||||
((activity as? ListActivity)?.favoritesVisibility == AppFilter.Companion.AppSetVisibility.EXCLUSIVE)
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
|
@ -67,16 +62,17 @@ class ListFragmentApps : Fragment(), UIObject {
|
|||
override fun setOnClicks() {}
|
||||
|
||||
override fun adjustLayout() {
|
||||
val listActivity = activity as? ListActivity ?: return
|
||||
|
||||
appsRecyclerAdapter =
|
||||
AppsRecyclerAdapter(
|
||||
requireActivity(), binding.root, intention, forGesture,
|
||||
listActivity, binding.root, listActivity.intention, listActivity.forGesture,
|
||||
appFilter = AppFilter(
|
||||
requireContext(),
|
||||
"",
|
||||
favoritesVisibility = favoritesVisibility,
|
||||
privateSpaceVisibility = privateSpaceVisibility,
|
||||
hiddenVisibility = hiddenVisibility
|
||||
favoritesVisibility = listActivity.favoritesVisibility,
|
||||
privateSpaceVisibility = listActivity.privateSpaceVisibility,
|
||||
hiddenVisibility = listActivity.hiddenVisibility
|
||||
),
|
||||
layout = LauncherPreferences.list().layout()
|
||||
)
|
||||
|
@ -124,7 +120,8 @@ class ListFragmentApps : Fragment(), UIObject {
|
|||
|
||||
if (newText == " " &&
|
||||
!appsRecyclerAdapter.disableAutoLaunch &&
|
||||
intention == ListActivity.ListActivityIntention.VIEW &&
|
||||
(activity as? ListActivity)?.intention
|
||||
== ListActivity.ListActivityIntention.VIEW &&
|
||||
LauncherPreferences.functionality().searchAutoLaunch()
|
||||
) {
|
||||
appsRecyclerAdapter.disableAutoLaunch = true
|
||||
|
@ -141,17 +138,17 @@ class ListFragmentApps : Fragment(), UIObject {
|
|||
})
|
||||
|
||||
binding.listAppsCheckBoxFavorites.setOnClickListener {
|
||||
favoritesVisibility =
|
||||
listActivity.favoritesVisibility =
|
||||
if (binding.listAppsCheckBoxFavorites.isChecked) {
|
||||
AppFilter.Companion.AppSetVisibility.EXCLUSIVE
|
||||
} else {
|
||||
AppFilter.Companion.AppSetVisibility.VISIBLE
|
||||
}
|
||||
appsRecyclerAdapter.setFavoritesVisibility(favoritesVisibility)
|
||||
appsRecyclerAdapter.setFavoritesVisibility(listActivity.favoritesVisibility)
|
||||
(activity as? ListActivity)?.updateTitle()
|
||||
}
|
||||
|
||||
if (intention == ListActivity.ListActivityIntention.VIEW
|
||||
if (listActivity.intention == ListActivity.ListActivityIntention.VIEW
|
||||
&& LauncherPreferences.functionality().searchAutoOpenKeyboard()
|
||||
) {
|
||||
binding.listAppsSearchview.openSoftKeyboard(requireContext())
|
||||
|
|
|
@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
|
|||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
||||
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,
|
||||
|
@ -33,10 +33,10 @@ class OtherRecyclerAdapter(val activity: Activity) :
|
|||
|
||||
|
||||
override fun onClick(v: View) {
|
||||
val pos = adapterPosition
|
||||
val pos = bindingAdapterPosition
|
||||
val content = othersList[pos]
|
||||
|
||||
forGesture?.let { returnChoiceIntent(it, content) }
|
||||
(activity as? ListActivity)?.forGesture?.let { returnChoiceIntent(it, content) }
|
||||
}
|
||||
|
||||
init {
|
||||
|
|
|
@ -11,6 +11,7 @@ import android.view.ViewGroup
|
|||
import android.widget.Button
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -94,6 +95,8 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject {
|
|||
class ActionsRecyclerAdapter(val activity: Activity) :
|
||||
RecyclerView.Adapter<ActionsRecyclerAdapter.ViewHolder>() {
|
||||
|
||||
private val drawableUnknown = AppCompatResources.getDrawable(activity, R.drawable.baseline_question_mark_24)
|
||||
|
||||
private val gesturesList: 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) {
|
||||
val action = Action.forGesture(gesture)
|
||||
val drawable = action?.getIcon(activity)
|
||||
|
||||
if (action == null || drawable == null) {
|
||||
if (action == null) {
|
||||
viewHolder.img.visibility = View.INVISIBLE
|
||||
viewHolder.removeAction.visibility = View.GONE
|
||||
viewHolder.chooseButton.visibility = View.VISIBLE
|
||||
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.removeAction.visibility = View.VISIBLE
|
||||
viewHolder.chooseButton.visibility = View.INVISIBLE
|
||||
|
@ -137,9 +143,7 @@ class ActionsRecyclerAdapter(val activity: Activity) :
|
|||
val description = gesture.getDescription(activity)
|
||||
viewHolder.descriptionTextView.text = description
|
||||
|
||||
|
||||
if (LauncherPreferences.theme().monochromeIcons())
|
||||
viewHolder.img.transformGrayscale()
|
||||
viewHolder.img.transformGrayscale(LauncherPreferences.theme().monochromeIcons())
|
||||
|
||||
updateViewHolder(gesture, viewHolder)
|
||||
viewHolder.img.setOnClickListener { chooseApp(gesture) }
|
||||
|
|
|
@ -16,6 +16,7 @@ import de.jrpie.android.launcher.copyToClipboard
|
|||
import de.jrpie.android.launcher.databinding.SettingsMetaBinding
|
||||
import de.jrpie.android.launcher.getDeviceInfo
|
||||
import de.jrpie.android.launcher.openInBrowser
|
||||
import de.jrpie.android.launcher.openTutorial
|
||||
import de.jrpie.android.launcher.preferences.resetPreferences
|
||||
import de.jrpie.android.launcher.ui.LegalInfoActivity
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
@ -47,8 +48,17 @@ class SettingsFragmentMeta : Fragment(), UIObject {
|
|||
|
||||
override fun setOnClicks() {
|
||||
|
||||
fun bindURL(view: View, urlRes: Int) {
|
||||
view.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(urlRes),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
binding.settingsMetaButtonViewTutorial.setOnClickListener {
|
||||
startActivity(Intent(this.context, TutorialActivity::class.java))
|
||||
openTutorial(requireContext())
|
||||
}
|
||||
|
||||
// prompting for settings-reset confirmation
|
||||
|
@ -69,12 +79,7 @@ class SettingsFragmentMeta : Fragment(), UIObject {
|
|||
|
||||
|
||||
// view code
|
||||
binding.settingsMetaButtonViewCode.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(R.string.settings_meta_link_github),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
bindURL(binding.settingsMetaButtonViewCode, R.string.settings_meta_link_github)
|
||||
|
||||
// report a bug
|
||||
binding.settingsMetaButtonReportBug.setOnClickListener {
|
||||
|
@ -110,37 +115,19 @@ class SettingsFragmentMeta : Fragment(), UIObject {
|
|||
}
|
||||
|
||||
// join chat
|
||||
binding.settingsMetaButtonJoinChat.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(R.string.settings_meta_chat_url),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
|
||||
bindURL(binding.settingsMetaButtonJoinChat, R.string.settings_meta_chat_url)
|
||||
|
||||
// contact developer
|
||||
binding.settingsMetaButtonContact.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(R.string.settings_meta_contact_url),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
// bindURL(binding.settingsMetaButtonContact, R.string.settings_meta_contact_url)
|
||||
|
||||
// contact fork developer
|
||||
binding.settingsMetaButtonForkContact.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(R.string.settings_meta_fork_contact_url),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
bindURL(binding.settingsMetaButtonForkContact, R.string.settings_meta_fork_contact_url)
|
||||
|
||||
// donate
|
||||
bindURL(binding.settingsMetaButtonDonate, R.string.settings_meta_donate_url)
|
||||
|
||||
// privacy policy
|
||||
binding.settingsMetaButtonPrivacy.setOnClickListener {
|
||||
openInBrowser(
|
||||
getString(R.string.settings_meta_privacy_url),
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
bindURL(binding.settingsMetaButtonPrivacy, R.string.settings_meta_privacy_url)
|
||||
|
||||
// legal info
|
||||
binding.settingsMetaButtonLicenses.setOnClickListener {
|
||||
|
|
|
@ -2,7 +2,9 @@ package de.jrpie.android.launcher.ui.tutorial
|
|||
|
||||
import android.content.Intent
|
||||
import android.content.res.Resources
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.window.OnBackInvokedDispatcher
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
|
@ -33,6 +35,19 @@ class TutorialActivity : AppCompatActivity(), UIObject {
|
|||
super<AppCompatActivity>.onCreate(savedInstanceState)
|
||||
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
|
||||
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() {
|
||||
if (LauncherPreferences.internal().started())
|
||||
super.onBackPressed()
|
||||
|
|
12
app/src/main/res/drawable/baseline_question_mark_24.xml
Normal file
12
app/src/main/res/drawable/baseline_question_mark_24.xml
Normal 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>
|
16
app/src/main/res/drawable/baseline_volume_adjust_24.xml
Normal file
16
app/src/main/res/drawable/baseline_volume_adjust_24.xml
Normal 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>
|
|
@ -59,12 +59,12 @@
|
|||
android:text="@string/settings_meta_join_chat"
|
||||
android:textAllCaps="false" />
|
||||
|
||||
<Button
|
||||
<!--<Button
|
||||
android:id="@+id/settings_meta_button_contact"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/settings_meta_contact"
|
||||
android:textAllCaps="false" />
|
||||
android:textAllCaps="false" />-->
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings_meta_button_fork_contact"
|
||||
|
@ -73,6 +73,13 @@
|
|||
android:text="@string/settings_meta_fork_contact"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64sp" />
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
-
|
||||
-->
|
||||
<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="toast_cant_open_message">Öffne die Einstellungen um für diese Geste eine Aktion zu wählen</string>
|
||||
<string name="alert_cant_open_message">App-Einstellungen anpassen?</string>
|
||||
<string name="toast_cant_open_message">Einstellungen öffnen um für diese Geste eine Aktion zu wählen</string>
|
||||
<!--
|
||||
-
|
||||
- Settings
|
||||
|
@ -97,7 +97,6 @@
|
|||
<string name="settings_launcher_change_wallpaper">Hintergrund ändern</string>
|
||||
<string name="settings_launcher_section_display">Bildschirm</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_launcher_section_functionality">Funktionalität</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_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_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_reset">Einstellungen zurücksetzen</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="settings_meta_fork_contact">Entwickler des Fork kontaktieren</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>
|
||||
<!--
|
||||
-
|
||||
|
@ -152,8 +151,9 @@
|
|||
<string name="list_other_list">Alle Anwendungen</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_volume_up">Musik: Lauter</string>
|
||||
<string name="list_other_volume_down">Musik: Leiser</string>
|
||||
<string name="list_other_volume_up">Lauter</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_previous">Musik: Zurück</string>
|
||||
<string name="list_other_nop">Nichts tun</string>
|
||||
|
@ -164,23 +164,23 @@
|
|||
-->
|
||||
<string name="list_other_torch">Taschenlampe umschalten</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_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_2">Launcher ist open-source (MIT license) und auf GitHub!\n\nSchau gerne mal dort vorbei!</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">Der Quellcode ist bei GitHub zu finden.</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_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">Der Homescreen zeigt nur das Datum und die Uhrzeit. Keine Ablenkung.</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_text">Wir haben dir ein paar Standardapps ausgewählt, du kannst sie hier gerne ändern:</string>
|
||||
<string name="tutorial_setup_text_2">Du kannst deine Auswahl in den Einstellungen später jederzeit ä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">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_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="settings">Einstellungen</string>
|
||||
<string name="ic_menu_alt">Mehr Optionen</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="undo">Rückgängig</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="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="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="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>
|
||||
|
@ -234,8 +234,8 @@
|
|||
Dies erfordert sehr weitgehende Berechtigungen.
|
||||
µLauncher wird diese ausschließlich zum Sperren des Bildschirms verwenden.
|
||||
<br/>
|
||||
(Irgeneiner 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.)
|
||||
(Irgendeiner gerade heruntergeladenen App sollte man eine solche Behauptung natürlich nicht einfach glauben.
|
||||
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/>
|
||||
|
@ -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_data_collection">Ich willige ein, dass µLauncher keine Daten sammelt.</string>
|
||||
<string name="dialog_consent_accessibility_title">Bedienungshilfe aktivieren</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
|
|
@ -63,7 +63,6 @@
|
|||
<string name="settings_launcher_change_wallpaper">Cambiar fondo de pantalla</string>
|
||||
<string name="settings_launcher_section_display">Pantalla</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_enabled_gestures_double_swipe">Deslizar con dos dedos</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_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_reset">Configuración por defecto</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="settings">Configuración</string>
|
||||
<string name="ic_menu_alt">Más opciones</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
|
|
@ -55,7 +55,6 @@
|
|||
<string name="settings_launcher_change_wallpaper">Changer le fond d\'é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_full_screen">Utiliser le plein écran</string>
|
||||
<string name="settings_launcher_section_functionality">Fonctions</string>
|
||||
<string name="settings_enabled_gestures_double_swipe">Actions de double balayage</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_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_reset">Réinitialiser</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_enabled_gestures_edge_swipe_summary">Balayer au bord de l\'écran</string>
|
||||
<string name="settings_clock_color">Couleur</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
<br/><br/><br/><br/>
|
||||
Puoi cambiare le tue scelte in seguito nelle impostazioni.
|
||||
]]></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_message">Desideri modificare le impostazioni?</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_section_display">Schermo</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_launcher_section_functionality">Funzionalità</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_search_web">Non è stata trovata un\'applicazione per gestire la ricerca.</string>
|
||||
<string name="dialog_consent_accessibility_text"><![CDATA[Stai per arrivare il servizio di accessibilità. Questo garantirà <strong>privilegi più ampi</strong> a µLauncher.<br/>µLauncher utilizzerà questi privilegi <strong>solo per bloccare lo schermo</strong>. µLauncher <strong>non raccoglierà mai alcun dato</strong>. In particolare, µLauncher non usa il servizio di accessibilità per raccogliere nessun dato.]]></string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
|
|
@ -1,2 +1,200 @@
|
|||
<?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">左上 -> 右中 -> 左下</string>
|
||||
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Reverse)]]></string>
|
||||
<string name="settings_gesture_description_swipe_larger_reverse">左下 -> 右中 -> 左上</string>
|
||||
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
|
||||
<string name="settings_gesture_description_swipe_smaller">右上 -> 左中 -> 右下</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">左上 -> 中下 -> 右上</string>
|
||||
<string name="settings_gesture_swipe_v_reverse">V (Reverse)</string>
|
||||
<string name="settings_gesture_description_swipe_v_reverse">右上 -> 中下 -> 左上</string>
|
||||
<string name="settings_gesture_swipe_lambda">Λ</string>
|
||||
<string name="settings_gesture_description_swipe_lambda">左下 -> 中上 -> 右下</string>
|
||||
<string name="settings_gesture_swipe_lambda_reverse">Λ (Reverse)</string>
|
||||
<string name="settings_gesture_description_swipe_lambda_reverse">右下 -> 中上 -> 左下</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- Finn(Launcherの作成者)と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">右下 -> 左中 -> 右上</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>
|
||||
|
|
|
@ -66,7 +66,6 @@
|
|||
<string name="settings_launcher_change_wallpaper">Alterar papel de parede</string>
|
||||
<string name="settings_launcher_section_display">Exibição</string>
|
||||
<string name="settings_display_screen_timeout_disabled">Manter a tela ligada</string>
|
||||
<string name="settings_display_full_screen">Usar tela cheia</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_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_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_reset">Redefinir configuraçãos</string>
|
||||
<string name="settings_meta_reset_confirm">Você vai descartar todas as suas preferências. Continuar?</string>
|
||||
|
|
|
@ -137,7 +137,6 @@
|
|||
<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_display_screen_timeout_disabled">Ekranı açı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_launcher_section_functionality">İşlevsellik</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_grid">Izgara</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_confirm">Tüm tercihlerinizi bir kenara bırakacaksınız. Devam mı?</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_color_hex">Renk</string>
|
||||
<string name="dialog_choose_color_title">Renk seçin</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
|
|
@ -44,14 +44,12 @@
|
|||
<string name="settings_theme_wallpaper">选择一个壁纸</string>
|
||||
<string name="settings_launcher_change_wallpaper">换壁纸</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_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_launcher_sensitivity">灵敏度</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_reset">重置设置</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_activity_not_found_search_web">没有找到处理搜索的应用。</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>
|
||||
|
|
|
@ -164,6 +164,7 @@
|
|||
<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_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>
|
||||
|
||||
<!--
|
||||
-
|
||||
|
|
|
@ -179,7 +179,7 @@
|
|||
<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_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_text">Text</string>
|
||||
|
@ -192,7 +192,6 @@
|
|||
-->
|
||||
<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_msg">Your device does not support this feature. Manage application details instead?</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_join_chat">Join µLauncher chat</string>
|
||||
<string name="settings_meta_donate">Donate</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_private_space">Private Space</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_down">Music: Quieter</string>
|
||||
<string name="list_other_volume_up">Raise Volume</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_previous">Music: Previous</string>
|
||||
<string name="list_other_track_play_pause">Music: Play / Pause</string>
|
||||
|
|
13
fastlane/metadata/android/en-US/changelogs/40.txt
Normal file
13
fastlane/metadata/android/en-US/changelogs/40.txt
Normal 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
|
22
fastlane/metadata/android/ja-JP/full_description.txt
Normal file
22
fastlane/metadata/android/ja-JP/full_description.txt
Normal file
|
@ -0,0 +1,22 @@
|
|||
µLauncherは、スワイプジェスチャとタップだけでアプリを起動できるホーム画面です。
|
||||
必要最小限で、効率的で、気が散らない。
|
||||
|
||||
ホーム画面には日付、時刻、壁紙のみが表示されます。
|
||||
戻るを押すか上にスワイプすると(これは設定可能)、
|
||||
インストールされているすべてのアプリのリストが開き、効率的に検索できます。
|
||||
|
||||
|
||||
このアプリは、Finn M Glas氏のアプリ <a href="https://f-droid.org/packages/com.finnmglas.launcher/">Launcher</a> のフォークです。
|
||||
|
||||
機能:
|
||||
* 35種のジェスチャーにアクションを設定できます。
|
||||
* アクションは以下のいずれかになります:
|
||||
- アプリを起動
|
||||
- アプリを表示
|
||||
- お気に入りのアプリを表示
|
||||
- ボリュームを上げる/下げる
|
||||
- 音楽: 次/前の曲
|
||||
- 画面をロック
|
||||
- ライトの切り替え
|
||||
- 通知 / クイック設定を表示
|
||||
* 仕事用プロファイルに対応しているので、Shelterなどのアプリも使えます。
|
1
fastlane/metadata/android/ja-JP/short_description.txt
Normal file
1
fastlane/metadata/android/ja-JP/short_description.txt
Normal file
|
@ -0,0 +1 @@
|
|||
気が散らない、最小限の Android ホーム画面。
|
1
fastlane/metadata/android/ja-JP/title.txt
Normal file
1
fastlane/metadata/android/ja-JP/title.txt
Normal file
|
@ -0,0 +1 @@
|
|||
µLauncher
|
Loading…
Add table
Reference in a new issue