Compare commits
32 commits
Author | SHA1 | Date | |
---|---|---|---|
653d16b269 | |||
5d695ec0ea | |||
b4608ef153 | |||
8e140e2e69 | |||
7fc58fe384 | |||
54409b6312 | |||
865cd47583 | |||
58ddd3c8cc | |||
0baa889de5 | |||
fa34cbae90 | |||
7ac09bd465 | |||
![]() |
c8d7a1cc3e | ||
7094d55484 | |||
b3e4d8834a | |||
008d0242ee | |||
![]() |
65034bf2fb | ||
![]() |
3cec2c36c6 | ||
00350d4c3a | |||
0941062270 | |||
c783a51658 | |||
da115bb2d9 | |||
90434617e7 | |||
47940811b4 | |||
![]() |
232046e986 | ||
![]() |
ff108ee323 | ||
![]() |
943867d938 | ||
![]() |
59f4a29044 | ||
![]() |
bd70b822cf | ||
72f9c0595f | |||
75b22400c5 | |||
c1511cd475 | |||
3597baee1f |
|
@ -23,8 +23,8 @@ android {
|
|||
minSdkVersion 21
|
||||
targetSdkVersion 35
|
||||
compileSdk 35
|
||||
versionCode 40
|
||||
versionName "0.1.0"
|
||||
versionCode 43
|
||||
versionName "0.1.3"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
@ -85,17 +85,17 @@ android {
|
|||
// Disables dependency metadata when building Android App Bundles.
|
||||
includeInBundle = false
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
lint {
|
||||
abortOnError false
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'androidx.activity:activity:1.8.0'
|
||||
implementation 'androidx.activity:activity-ktx:1.8.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.core:core-ktx:1.15.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
<service
|
||||
android:name=".actions.lock.LauncherAccessibilityService"
|
||||
android:exported="true"
|
||||
android:label="@string/accessibility_service_name"
|
||||
android:label="@string/app_name"
|
||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||
<intent-filter>
|
||||
<action android:name="android.accessibilityservice.AccessibilityService" />
|
||||
|
@ -97,4 +97,4 @@
|
|||
</service>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
||||
|
|
|
@ -7,11 +7,8 @@ import android.content.IntentFilter
|
|||
import android.content.SharedPreferences
|
||||
import android.content.pm.LauncherApps
|
||||
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
|
||||
|
@ -23,6 +20,9 @@ import de.jrpie.android.launcher.apps.isPrivateSpaceLocked
|
|||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.preferences.migratePreferencesToNewVersion
|
||||
import de.jrpie.android.launcher.preferences.resetPreferences
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class Application : android.app.Application() {
|
||||
val apps = MutableLiveData<List<AbstractDetailedAppInfo>>()
|
||||
|
@ -153,6 +153,8 @@ class Application : android.app.Application() {
|
|||
|
||||
private fun loadApps() {
|
||||
privateSpaceLocked.postValue(isPrivateSpaceLocked(this))
|
||||
AsyncTask.execute { apps.postValue(getApps(packageManager, applicationContext)) }
|
||||
CoroutineScope(Dispatchers.Default).launch {
|
||||
apps.postValue(getApps(packageManager, applicationContext))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@ import android.content.pm.LauncherApps
|
|||
import android.content.pm.LauncherApps.ShortcutQuery
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.pm.ShortcutInfo
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.UserHandle
|
||||
|
@ -34,17 +33,13 @@ import de.jrpie.android.launcher.apps.getPrivateSpaceUser
|
|||
import de.jrpie.android.launcher.apps.isPrivateSpaceSupported
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.ui.tutorial.TutorialActivity
|
||||
import androidx.core.net.toUri
|
||||
|
||||
|
||||
/* REQUEST CODES */
|
||||
|
||||
const val REQUEST_CHOOSE_APP = 1
|
||||
const val REQUEST_UNINSTALL = 2
|
||||
|
||||
const val REQUEST_SET_DEFAULT_HOME = 42
|
||||
|
||||
const val LOG_TAG = "Launcher"
|
||||
|
||||
const val REQUEST_SET_DEFAULT_HOME = 42
|
||||
|
||||
fun isDefaultHomeScreen(context: Context): Boolean {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
val roleManager = context.getSystemService(RoleManager::class.java)
|
||||
|
@ -66,7 +61,7 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) {
|
|||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||
&& context is Activity
|
||||
&& !isDefault // using role manager only works when µLauncher is not already the default.
|
||||
&& checkDefault // using role manager only works when µLauncher is not already the default.
|
||||
) {
|
||||
val roleManager = context.getSystemService(RoleManager::class.java)
|
||||
context.startActivityForResult(
|
||||
|
@ -125,7 +120,7 @@ fun removeUnusedShortcuts(context: Context) {
|
|||
}
|
||||
|
||||
fun openInBrowser(url: String, context: Context) {
|
||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
||||
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
|
||||
intent.putExtras(Bundle().apply { putBoolean("new_window", true) })
|
||||
try {
|
||||
context.startActivity(intent)
|
||||
|
@ -194,7 +189,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)")
|
||||
|
@ -212,14 +207,6 @@ fun getApps(
|
|||
return loadList
|
||||
}
|
||||
|
||||
|
||||
// Used in Tutorial and Settings `ActivityOnResult`
|
||||
fun saveListActivityChoice(data: Intent?) {
|
||||
val forGesture = data?.getStringExtra("forGesture") ?: return
|
||||
Gesture.byId(forGesture)?.let { Action.setActionForGesture(it, Action.fromIntent(data)) }
|
||||
}
|
||||
|
||||
|
||||
// used for the bug report button
|
||||
fun getDeviceInfo(): String {
|
||||
return """
|
||||
|
|
|
@ -2,7 +2,6 @@ package de.jrpie.android.launcher.actions
|
|||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences.Editor
|
||||
import android.graphics.Rect
|
||||
import android.graphics.drawable.Drawable
|
||||
|
@ -12,6 +11,7 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences
|
|||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import androidx.core.content.edit
|
||||
|
||||
|
||||
@Serializable
|
||||
|
@ -29,10 +29,6 @@ sealed interface Action {
|
|||
prefEditor.putString(id, Json.encodeToString(this))
|
||||
}
|
||||
|
||||
fun writeToIntent(intent: Intent) {
|
||||
intent.putExtra("action", Json.encodeToString(this))
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
fun forGesture(gesture: Gesture): Action? {
|
||||
|
@ -44,23 +40,23 @@ sealed interface Action {
|
|||
}
|
||||
|
||||
fun resetToDefaultActions(context: Context) {
|
||||
val editor = LauncherPreferences.getSharedPreferences().edit()
|
||||
val boundActions = HashSet<String>()
|
||||
Gesture.entries.forEach { gesture ->
|
||||
context.resources
|
||||
.getStringArray(gesture.defaultsResource)
|
||||
.filterNot { boundActions.contains(it) }
|
||||
.map { Pair(it, Json.decodeFromString<Action>(it)) }
|
||||
.firstOrNull { it.second.isAvailable(context) }
|
||||
?.apply {
|
||||
// allow to bind CHOOSE to multiple gestures
|
||||
if (second != LauncherAction.CHOOSE) {
|
||||
boundActions.add(first)
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
val boundActions = HashSet<String>()
|
||||
Gesture.entries.forEach { gesture ->
|
||||
context.resources
|
||||
.getStringArray(gesture.defaultsResource)
|
||||
.filterNot { boundActions.contains(it) }
|
||||
.map { Pair(it, Json.decodeFromString<Action>(it)) }
|
||||
.firstOrNull { it.second.isAvailable(context) }
|
||||
?.apply {
|
||||
// allow to bind CHOOSE to multiple gestures
|
||||
if (second != LauncherAction.CHOOSE) {
|
||||
boundActions.add(first)
|
||||
}
|
||||
second.bindToGesture(this@edit, gesture.id)
|
||||
}
|
||||
second.bindToGesture(editor, gesture.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
editor.apply()
|
||||
}
|
||||
|
||||
fun setActionForGesture(gesture: Gesture, action: Action?) {
|
||||
|
@ -68,15 +64,15 @@ sealed interface Action {
|
|||
clearActionForGesture(gesture)
|
||||
return
|
||||
}
|
||||
val editor = LauncherPreferences.getSharedPreferences().edit()
|
||||
action.bindToGesture(editor, gesture.id)
|
||||
editor.apply()
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
action.bindToGesture(this, gesture.id)
|
||||
}
|
||||
}
|
||||
|
||||
fun clearActionForGesture(gesture: Gesture) {
|
||||
LauncherPreferences.getSharedPreferences().edit()
|
||||
.remove(gesture.id)
|
||||
.apply()
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
remove(gesture.id)
|
||||
}
|
||||
}
|
||||
|
||||
fun launch(
|
||||
|
@ -87,6 +83,9 @@ sealed interface Action {
|
|||
) {
|
||||
if (action != null && action.invoke(context)) {
|
||||
if (context is Activity) {
|
||||
// There does not seem to be a good alternative to overridePendingTransition.
|
||||
// Note that we can't use overrideActivityTransition here.
|
||||
@Suppress("deprecation")
|
||||
context.overridePendingTransition(animationIn, animationOut)
|
||||
}
|
||||
} else {
|
||||
|
@ -97,10 +96,5 @@ sealed interface Action {
|
|||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
fun fromIntent(data: Intent): Action? {
|
||||
val json = data.getStringExtra("action") ?: return null
|
||||
return Json.decodeFromString(json)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -250,7 +250,7 @@ enum class Gesture(
|
|||
"action.back",
|
||||
R.string.settings_gesture_back,
|
||||
R.string.settings_gesture_description_back,
|
||||
R.array.default_up
|
||||
R.array.default_back
|
||||
);
|
||||
|
||||
enum class Edge {
|
||||
|
|
|
@ -11,7 +11,9 @@ import android.view.KeyEvent
|
|||
import android.widget.Toast
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import de.jrpie.android.launcher.Application
|
||||
import de.jrpie.android.launcher.BuildConfig
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
|
||||
import de.jrpie.android.launcher.apps.AppFilter
|
||||
import de.jrpie.android.launcher.apps.hidePrivateSpaceWhenLocked
|
||||
import de.jrpie.android.launcher.apps.isPrivateSpaceSupported
|
||||
|
@ -132,6 +134,14 @@ enum class LauncherAction(
|
|||
R.drawable.baseline_settings_applications_24,
|
||||
::expandSettingsPanel
|
||||
),
|
||||
RECENT_APPS(
|
||||
"recent_apps",
|
||||
R.string.list_other_recent_apps,
|
||||
R.drawable.baseline_apps_24,
|
||||
LauncherAccessibilityService::openRecentApps,
|
||||
false,
|
||||
{ _ -> BuildConfig.USE_ACCESSIBILITY_SERVICE }
|
||||
),
|
||||
LOCK_SCREEN(
|
||||
"lock_screen",
|
||||
R.string.list_other_lock_screen,
|
||||
|
@ -142,7 +152,13 @@ enum class LauncherAction(
|
|||
"toggle_torch",
|
||||
R.string.list_other_torch,
|
||||
R.drawable.baseline_flashlight_on_24,
|
||||
::toggleTorch
|
||||
::toggleTorch,
|
||||
),
|
||||
LAUNCH_OTHER_LAUNCHER(
|
||||
"launcher_other_launcher",
|
||||
R.string.list_other_launch_other_launcher,
|
||||
R.drawable.baseline_home_24,
|
||||
::launchOtherLauncher
|
||||
),
|
||||
NOP("nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {});
|
||||
|
||||
|
@ -248,6 +264,15 @@ private fun expandSettingsPanel(context: Context) {
|
|||
}
|
||||
}
|
||||
|
||||
private fun launchOtherLauncher(context: Context) {
|
||||
context.startActivity(
|
||||
Intent.createChooser(
|
||||
Intent(Intent.ACTION_MAIN).also { it.addCategory(Intent.CATEGORY_HOME) },
|
||||
context.getString(R.string.list_other_launch_other_launcher)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun openSettings(context: Context) {
|
||||
context.startActivity(Intent(context, SettingsActivity::class.java))
|
||||
}
|
||||
|
|
|
@ -22,26 +22,44 @@ class LauncherAccessibilityService : AccessibilityService() {
|
|||
|
||||
companion object {
|
||||
private const val TAG = "Launcher Accessibility"
|
||||
private const val ACTION_REQUEST_ENABLE = "ACTION_REQUEST_ENABLE"
|
||||
const val ACTION_LOCK_SCREEN = "ACTION_LOCK_SCREEN"
|
||||
const val ACTION_RECENT_APPS = "ACTION_RECENT_APPS"
|
||||
|
||||
fun lockScreen(context: Context) {
|
||||
private fun invoke(context: Context, action: String, failureMessageRes: Int) {
|
||||
try {
|
||||
context.startService(
|
||||
Intent(
|
||||
context,
|
||||
LauncherAccessibilityService::class.java
|
||||
).apply {
|
||||
action = ACTION_LOCK_SCREEN
|
||||
this.action = action
|
||||
})
|
||||
} catch (e: Exception) {
|
||||
} catch (_: Exception) {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(R.string.alert_lock_screen_failed),
|
||||
context.getString(failureMessageRes),
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
fun lockScreen(context: Context) {
|
||||
if (!isEnabled(context)) {
|
||||
showEnableDialog(context)
|
||||
} else {
|
||||
invoke(context, ACTION_LOCK_SCREEN, R.string.alert_lock_screen_failed)
|
||||
}
|
||||
}
|
||||
|
||||
fun openRecentApps(context: Context) {
|
||||
if (!isEnabled(context)) {
|
||||
showEnableDialog(context)
|
||||
} else {
|
||||
invoke(context, ACTION_RECENT_APPS, R.string.alert_recent_apps_failed)
|
||||
}
|
||||
}
|
||||
|
||||
fun isEnabled(context: Context): Boolean {
|
||||
val enabledServices = Settings.Secure.getString(
|
||||
context.contentResolver,
|
||||
|
@ -58,7 +76,7 @@ class LauncherAccessibilityService : AccessibilityService() {
|
|||
setView(R.layout.dialog_consent_accessibility)
|
||||
setTitle(R.string.dialog_consent_accessibility_title)
|
||||
setPositiveButton(R.string.dialog_consent_accessibility_ok) { _, _ ->
|
||||
lockScreen(context)
|
||||
invoke(context, ACTION_REQUEST_ENABLE, R.string.alert_enable_accessibility_failed)
|
||||
}
|
||||
setNegativeButton(R.string.dialog_cancel) { _, _ -> }
|
||||
}.create().also { it.show() }.apply {
|
||||
|
@ -94,7 +112,9 @@ class LauncherAccessibilityService : AccessibilityService() {
|
|||
}
|
||||
|
||||
when (action) {
|
||||
ACTION_REQUEST_ENABLE -> {} // do nothing
|
||||
ACTION_LOCK_SCREEN -> handleLockScreen()
|
||||
ACTION_RECENT_APPS -> performGlobalAction(GLOBAL_ACTION_RECENTS)
|
||||
}
|
||||
}
|
||||
return super.onStartCommand(intent, flags, startId)
|
||||
|
|
|
@ -6,10 +6,10 @@ import android.widget.Button
|
|||
import androidx.appcompat.app.AlertDialog
|
||||
import de.jrpie.android.launcher.BuildConfig
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.actions.lock.LauncherAccessibilityService
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
|
||||
|
||||
@Suppress("unused")
|
||||
enum class LockMethod(
|
||||
private val lock: (Context) -> Unit,
|
||||
private val isEnabled: (Context) -> Boolean,
|
||||
|
|
|
@ -15,19 +15,7 @@ import kotlinx.serialization.Serializable
|
|||
*/
|
||||
@Serializable
|
||||
@SerialName("app")
|
||||
class AppInfo(val packageName: String, val activityName: String?, val user: Int = INVALID_USER): AbstractAppInfo {
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if(other is AppInfo) {
|
||||
return other.user == user && other.packageName == packageName
|
||||
&& other.activityName == activityName
|
||||
}
|
||||
return super.equals(other)
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return packageName.hashCode()
|
||||
}
|
||||
data class AppInfo(val packageName: String, val activityName: String?, val user: Int = INVALID_USER): AbstractAppInfo {
|
||||
|
||||
fun getLauncherActivityInfo(
|
||||
context: Context
|
||||
|
@ -38,10 +26,4 @@ class AppInfo(val packageName: String, val activityName: String?, val user: Int
|
|||
return activityList.firstOrNull { app -> app.name == activityName }
|
||||
?: activityList.firstOrNull()
|
||||
}
|
||||
|
||||
|
||||
override fun toString(): String {
|
||||
return "AppInfo {package=$packageName, activity=$activityName, user=$user}"
|
||||
}
|
||||
|
||||
}
|
|
@ -16,7 +16,7 @@ import kotlinx.serialization.Serializable
|
|||
@RequiresApi(Build.VERSION_CODES.N_MR1)
|
||||
@Serializable
|
||||
@SerialName("shortcut")
|
||||
class PinnedShortcutInfo(
|
||||
data class PinnedShortcutInfo(
|
||||
val id: String,
|
||||
val packageName: String,
|
||||
val activityName: String,
|
||||
|
@ -43,25 +43,4 @@ class PinnedShortcutInfo(
|
|||
null
|
||||
}
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return (other as? PinnedShortcutInfo)?.let {
|
||||
packageName == this.packageName &&
|
||||
activityName == this.activityName &&
|
||||
id == this.id &&
|
||||
user == this.user
|
||||
} ?: false
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = id.hashCode()
|
||||
result = 31 * result + packageName.hashCode()
|
||||
result = 31 * result + activityName.hashCode()
|
||||
result = 31 * result + user
|
||||
return result
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "PinnedShortcutInfo { package=$packageName, activity=$activityName, user=$user, id=$id}"
|
||||
}
|
||||
}
|
|
@ -123,6 +123,7 @@ fun togglePrivateSpaceLock(context: Context) {
|
|||
}
|
||||
}
|
||||
|
||||
@Suppress("SameReturnValue")
|
||||
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
|
||||
|
|
|
@ -17,6 +17,7 @@ import androidx.core.graphics.green
|
|||
import androidx.core.graphics.red
|
||||
import androidx.preference.Preference
|
||||
import de.jrpie.android.launcher.R
|
||||
import androidx.core.graphics.toColorInt
|
||||
|
||||
class ColorPreference(context: Context, attrs: AttributeSet?) :
|
||||
Preference(context, attrs) {
|
||||
|
@ -52,7 +53,7 @@ class ColorPreference(context: Context, attrs: AttributeSet?) :
|
|||
AlertDialog.Builder(context, R.style.AlertDialogCustom).apply {
|
||||
setView(R.layout.dialog_choose_color)
|
||||
setTitle(R.string.dialog_choose_color_title)
|
||||
setPositiveButton(R.string.dialog_select_color_ok) { _, _ ->
|
||||
setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
persistInt(currentColor)
|
||||
summary = currentColor.getHex()
|
||||
}
|
||||
|
@ -83,10 +84,10 @@ class ColorPreference(context: Context, attrs: AttributeSet?) :
|
|||
override fun onTextChanged(text: CharSequence?, p1: Int, p2: Int, p3: Int) {}
|
||||
override fun afterTextChanged(editable: Editable?) {
|
||||
preview.hasFocus() || return
|
||||
val newText = editable?.toString()
|
||||
newText.isNullOrBlank() && return
|
||||
val newText = editable?.toString() ?: return
|
||||
newText.isBlank() && return
|
||||
try {
|
||||
val newColor = Color.parseColor(newText.toString())
|
||||
val newColor = newText.toColorInt()
|
||||
currentColor = newColor
|
||||
updateColor(false)
|
||||
} catch (_: IllegalArgumentException) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package de.jrpie.android.launcher.preferences
|
||||
|
||||
import android.content.Context
|
||||
import android.util.TypedValue
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -27,8 +28,10 @@ enum class ListLayout(
|
|||
GRID(
|
||||
{ c ->
|
||||
val displayMetrics = c.resources.displayMetrics
|
||||
val widthSp = displayMetrics.widthPixels / displayMetrics.scaledDensity
|
||||
GridLayoutManager(c, (widthSp / 90).toInt())
|
||||
val widthColumnPx =
|
||||
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 90f, displayMetrics)
|
||||
val numColumns = (displayMetrics.widthPixels / widthColumnPx).toInt()
|
||||
GridLayoutManager(c, numColumns)
|
||||
},
|
||||
R.layout.list_apps_row_variant_grid,
|
||||
false
|
||||
|
|
|
@ -13,9 +13,11 @@ import kotlinx.serialization.encodeToString
|
|||
import kotlinx.serialization.json.Json
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import androidx.core.content.edit
|
||||
|
||||
|
||||
@Serializable
|
||||
@Suppress("unused")
|
||||
private class LegacyMapEntry(val key: AppInfo, val value: String)
|
||||
|
||||
private fun serializeMapAppInfo(value: Map<AppInfo, String>?): Set<String>? {
|
||||
|
@ -100,7 +102,7 @@ private fun migrateAppInfoStringMap(key: String) {
|
|||
}
|
||||
}?.toMap(HashMap())
|
||||
)?.let {
|
||||
preferences.edit().putStringSet(key, it).apply()
|
||||
preferences.edit { putStringSet(key, it) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,16 +111,16 @@ private fun migrateAppInfoSet(key: String) {
|
|||
.map(AppInfo.Companion::legacyDeserialize)
|
||||
.map(AppInfo::serialize)
|
||||
.toSet()
|
||||
.let { LauncherPreferences.getSharedPreferences().edit().putStringSet(key, it).apply() }
|
||||
.let { LauncherPreferences.getSharedPreferences().edit { putStringSet(key, it) } }
|
||||
}
|
||||
|
||||
private fun migrateAction(key: String) {
|
||||
Action.legacyFromPreference(key)?.let { action ->
|
||||
LauncherPreferences.getSharedPreferences().edit()
|
||||
.putString(key, Json.encodeToString(action))
|
||||
.remove("$key.app")
|
||||
.remove("$key.user")
|
||||
.apply()
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
putString(key, Json.encodeToString(action))
|
||||
.remove("$key.app")
|
||||
.remove("$key.user")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import android.util.Log
|
|||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.preferences.theme.Background
|
||||
import de.jrpie.android.launcher.preferences.theme.ColorTheme
|
||||
|
||||
import androidx.core.content.edit
|
||||
|
||||
|
||||
private fun migrateStringPreference(
|
||||
|
@ -64,318 +64,317 @@ fun migratePreferencesFromVersionUnknown(context: Context) {
|
|||
return
|
||||
}
|
||||
|
||||
val newPrefs = LauncherPreferences.getSharedPreferences().edit()
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"startedBefore",
|
||||
"internal.started_before",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"startedBefore",
|
||||
"internal.started_before",
|
||||
false
|
||||
)
|
||||
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_volumeUpApp",
|
||||
"action.volume_up.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_volumeUpApp_user",
|
||||
"action.volume_up.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_volumeDownApp",
|
||||
"action.volume_down.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_volumeDownApp_user",
|
||||
"action.volume_down.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_timeApp", "action.time.app", "")
|
||||
migrateIntPreference(oldPrefs, newPrefs, "action_timeApp_user", "action.time.user", -1)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_dateApp", "action.date.app", "")
|
||||
migrateIntPreference(oldPrefs, newPrefs, "action_dateApp_user", "action.date.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_longClickApp",
|
||||
"action.long_click.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_longClickApp_user",
|
||||
"action.long_click.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleClickApp",
|
||||
"action.double_click.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleClickApp_user",
|
||||
"action.double_click.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_upApp", "action.up.app", "")
|
||||
migrateIntPreference(oldPrefs, newPrefs, "action_upApp_user", "action.up.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_up_leftApp",
|
||||
"action.up_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_up_leftApp_user",
|
||||
"action.up_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_up_rightApp",
|
||||
"action.up_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_up_rightApp_user",
|
||||
"action.up_right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleUpApp",
|
||||
"action.double_up.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleUpApp_user",
|
||||
"action.double_up.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_downApp", "action.down.app", "")
|
||||
migrateIntPreference(oldPrefs, newPrefs, "action_downApp_user", "action.down.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_down_leftApp",
|
||||
"action.down_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_down_leftApp_user",
|
||||
"action.down_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_down_rightApp",
|
||||
"action.down_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_down_rightApp_user",
|
||||
"action.down_right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleDownApp",
|
||||
"action.double_down.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleDownApp_user",
|
||||
"action.double_down.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_leftApp", "action.left.app", "")
|
||||
migrateIntPreference(oldPrefs, newPrefs, "action_leftApp_user", "action.left.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_left_topApp",
|
||||
"action.left_top.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_left_topApp_user",
|
||||
"action.left_top.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_left_bottomApp",
|
||||
"action.left_bottom.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_left_bottomApp_user",
|
||||
"action.left_bottom.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleLeftApp",
|
||||
"action.double_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleLeftApp_user",
|
||||
"action.double_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, newPrefs, "action_rightApp", "action.right.app", "")
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_rightApp_user",
|
||||
"action.right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_right_topApp",
|
||||
"action.right_top.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_right_topApp_user",
|
||||
"action.right_top.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_right_bottomApp",
|
||||
"action.right_bottom.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_right_bottomApp_user",
|
||||
"action.right_bottom.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleRightApp",
|
||||
"action.double_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"action_doubleRightApp_user",
|
||||
"action.double_right.user",
|
||||
-1
|
||||
)
|
||||
migrateBooleanPreference(oldPrefs, newPrefs, "timeVisible", "clock.time_visible", true)
|
||||
migrateBooleanPreference(oldPrefs, newPrefs, "dateVisible", "clock.date_visible", true)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"dateLocalized",
|
||||
"clock.date_localized",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"dateTimeFlip",
|
||||
"clock.date_time_flip",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"disableTimeout",
|
||||
"display.disable_timeout",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"useFullScreen",
|
||||
"display.use_full_screen",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"enableDoubleActions",
|
||||
"enabled_gestures.double_actions",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"enableEdgeActions",
|
||||
"enabled_gestures.edge_actions",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"searchAutoLaunch",
|
||||
"functionality.search_auto_launch",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
newPrefs,
|
||||
"searchAutoKeyboard",
|
||||
"functionality.search_auto_keyboard",
|
||||
true
|
||||
)
|
||||
|
||||
newPrefs.apply()
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_volumeUpApp",
|
||||
"action.volume_up.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_volumeUpApp_user",
|
||||
"action.volume_up.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_volumeDownApp",
|
||||
"action.volume_down.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_volumeDownApp_user",
|
||||
"action.volume_down.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, this, "action_timeApp", "action.time.app", "")
|
||||
migrateIntPreference(oldPrefs, this, "action_timeApp_user", "action.time.user", -1)
|
||||
migrateStringPreference(oldPrefs, this, "action_dateApp", "action.date.app", "")
|
||||
migrateIntPreference(oldPrefs, this, "action_dateApp_user", "action.date.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_longClickApp",
|
||||
"action.long_click.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_longClickApp_user",
|
||||
"action.long_click.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleClickApp",
|
||||
"action.double_click.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleClickApp_user",
|
||||
"action.double_click.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, this, "action_upApp", "action.up.app", "")
|
||||
migrateIntPreference(oldPrefs, this, "action_upApp_user", "action.up.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_up_leftApp",
|
||||
"action.up_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_up_leftApp_user",
|
||||
"action.up_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_up_rightApp",
|
||||
"action.up_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_up_rightApp_user",
|
||||
"action.up_right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleUpApp",
|
||||
"action.double_up.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleUpApp_user",
|
||||
"action.double_up.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, this, "action_downApp", "action.down.app", "")
|
||||
migrateIntPreference(oldPrefs, this, "action_downApp_user", "action.down.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_down_leftApp",
|
||||
"action.down_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_down_leftApp_user",
|
||||
"action.down_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_down_rightApp",
|
||||
"action.down_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_down_rightApp_user",
|
||||
"action.down_right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleDownApp",
|
||||
"action.double_down.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleDownApp_user",
|
||||
"action.double_down.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, this, "action_leftApp", "action.left.app", "")
|
||||
migrateIntPreference(oldPrefs, this, "action_leftApp_user", "action.left.user", -1)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_left_topApp",
|
||||
"action.left_top.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_left_topApp_user",
|
||||
"action.left_top.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_left_bottomApp",
|
||||
"action.left_bottom.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_left_bottomApp_user",
|
||||
"action.left_bottom.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleLeftApp",
|
||||
"action.double_left.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleLeftApp_user",
|
||||
"action.double_left.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(oldPrefs, this, "action_rightApp", "action.right.app", "")
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_rightApp_user",
|
||||
"action.right.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_right_topApp",
|
||||
"action.right_top.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_right_topApp_user",
|
||||
"action.right_top.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_right_bottomApp",
|
||||
"action.right_bottom.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_right_bottomApp_user",
|
||||
"action.right_bottom.user",
|
||||
-1
|
||||
)
|
||||
migrateStringPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleRightApp",
|
||||
"action.double_right.app",
|
||||
""
|
||||
)
|
||||
migrateIntPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"action_doubleRightApp_user",
|
||||
"action.double_right.user",
|
||||
-1
|
||||
)
|
||||
migrateBooleanPreference(oldPrefs, this, "timeVisible", "clock.time_visible", true)
|
||||
migrateBooleanPreference(oldPrefs, this, "dateVisible", "clock.date_visible", true)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"dateLocalized",
|
||||
"clock.date_localized",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"dateTimeFlip",
|
||||
"clock.date_time_flip",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"disableTimeout",
|
||||
"display.disable_timeout",
|
||||
false
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"useFullScreen",
|
||||
"display.use_full_screen",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"enableDoubleActions",
|
||||
"enabled_gestures.double_actions",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"enableEdgeActions",
|
||||
"enabled_gestures.edge_actions",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"searchAutoLaunch",
|
||||
"functionality.search_auto_launch",
|
||||
true
|
||||
)
|
||||
migrateBooleanPreference(
|
||||
oldPrefs,
|
||||
this,
|
||||
"searchAutoKeyboard",
|
||||
"functionality.search_auto_keyboard",
|
||||
true
|
||||
)
|
||||
}
|
||||
|
||||
when (oldPrefs.getString("theme", "finn")) {
|
||||
"finn" -> {
|
||||
|
|
|
@ -5,7 +5,6 @@ import android.content.res.Resources
|
|||
import com.google.android.material.color.DynamicColors
|
||||
import de.jrpie.android.launcher.R
|
||||
|
||||
@Suppress("unused")
|
||||
enum class ColorTheme(
|
||||
private val id: Int,
|
||||
private val labelResource: Int,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2,10 +2,10 @@ package de.jrpie.android.launcher.ui
|
|||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.SharedPreferences
|
||||
import android.content.res.Configuration
|
||||
import android.content.res.Resources
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.KeyEvent
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
|
@ -56,23 +56,28 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
super<AppCompatActivity>.onCreate(savedInstanceState)
|
||||
super<UIObject>.onCreate()
|
||||
|
||||
val displayMetrics = DisplayMetrics()
|
||||
windowManager.defaultDisplay.getMetrics(displayMetrics)
|
||||
|
||||
val width = displayMetrics.widthPixels
|
||||
val height = displayMetrics.heightPixels
|
||||
|
||||
touchGestureDetector = TouchGestureDetector(
|
||||
this,
|
||||
width,
|
||||
height,
|
||||
this, 0, 0,
|
||||
LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f
|
||||
)
|
||||
touchGestureDetector.updateScreenSize(windowManager)
|
||||
|
||||
// Initialise layout
|
||||
binding = HomeBinding.inflate(layoutInflater)
|
||||
|
||||
setContentView(binding.root)
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
binding.root.setOnApplyWindowInsetsListener { _, windowInsets ->
|
||||
@Suppress("deprecation") // required to support API 29
|
||||
val insets = windowInsets.systemGestureInsets
|
||||
touchGestureDetector.setSystemGestureInsets(insets)
|
||||
|
||||
windowInsets
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Handle back key / gesture on Android 13+, cf. onKeyDown()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
|
@ -87,6 +92,11 @@ class HomeActivity : UIObject, AppCompatActivity() {
|
|||
}
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
touchGestureDetector.updateScreenSize(windowManager)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super<AppCompatActivity>.onStart()
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import de.jrpie.android.launcher.actions.ShortcutAction
|
|||
import de.jrpie.android.launcher.apps.PinnedShortcutInfo
|
||||
import de.jrpie.android.launcher.databinding.ActivityPinShortcutBinding
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import androidx.core.content.edit
|
||||
|
||||
class PinShortcutActivity : AppCompatActivity(), UIObject {
|
||||
private lateinit var binding: ActivityPinShortcutBinding
|
||||
|
@ -72,9 +73,12 @@ class PinShortcutActivity : AppCompatActivity(), UIObject {
|
|||
isBound = true
|
||||
request.accept()
|
||||
}
|
||||
val editor = LauncherPreferences.getSharedPreferences().edit()
|
||||
ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture(editor, gesture.id)
|
||||
editor.apply()
|
||||
LauncherPreferences.getSharedPreferences().edit {
|
||||
ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture(
|
||||
this,
|
||||
gesture.id
|
||||
)
|
||||
}
|
||||
dialog.dismiss()
|
||||
}
|
||||
dialog.findViewById<RecyclerView>(R.id.dialog_select_gesture_recycler).apply {
|
||||
|
@ -117,11 +121,11 @@ class PinShortcutActivity : AppCompatActivity(), UIObject {
|
|||
}
|
||||
|
||||
inner class GestureRecyclerAdapter(val context: Context, val onClick: (Gesture) -> Unit): RecyclerView.Adapter<GestureRecyclerAdapter.ViewHolder>() {
|
||||
val gestures = Gesture.entries.filter { it.isEnabled() }.toList()
|
||||
private val gestures = Gesture.entries.filter { it.isEnabled() }.toList()
|
||||
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
val label = itemView.findViewById<TextView>(R.id.dialog_select_gesture_row_name)
|
||||
val description = itemView.findViewById<TextView>(R.id.dialog_select_gesture_row_description)
|
||||
val icon = itemView.findViewById<ImageView>(R.id.dialog_select_gesture_row_icon)
|
||||
val label: TextView = itemView.findViewById(R.id.dialog_select_gesture_row_name)
|
||||
val description: TextView = itemView.findViewById(R.id.dialog_select_gesture_row_description)
|
||||
val icon: ImageView = itemView.findViewById(R.id.dialog_select_gesture_row_icon)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
package de.jrpie.android.launcher.ui
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Insets
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.MotionEvent
|
||||
import android.view.ViewConfiguration
|
||||
import android.view.WindowManager
|
||||
import androidx.annotation.RequiresApi
|
||||
import de.jrpie.android.launcher.actions.Gesture
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import kotlin.math.abs
|
||||
|
@ -14,8 +19,8 @@ import kotlin.math.tan
|
|||
|
||||
class TouchGestureDetector(
|
||||
private val context: Context,
|
||||
val width: Int,
|
||||
val height: Int,
|
||||
var width: Int,
|
||||
var height: Int,
|
||||
var edgeWidth: Float
|
||||
) {
|
||||
private val ANGULAR_THRESHOLD = tan(Math.PI / 6)
|
||||
|
@ -31,20 +36,29 @@ class TouchGestureDetector(
|
|||
|
||||
private val longPressHandler = Handler(Looper.getMainLooper())
|
||||
|
||||
private var systemGestureInsetTop = 100
|
||||
private var systemGestureInsetBottom = 0
|
||||
private var systemGestureInsetLeft = 0
|
||||
private var systemGestureInsetRight = 0
|
||||
|
||||
|
||||
data class Vector(val x: Float, val y: Float) {
|
||||
fun absSquared(): Float {
|
||||
return this.x * this.x + this.y * this.y
|
||||
}
|
||||
|
||||
fun plus(vector: Vector): Vector {
|
||||
return Vector(this.x + vector.x, this.y + vector.y)
|
||||
}
|
||||
|
||||
fun max(other: Vector): Vector {
|
||||
return Vector(max(this.x, other.x), max(this.y, other.y))
|
||||
}
|
||||
|
||||
fun min(other: Vector): Vector {
|
||||
return Vector(min(this.x, other.x), min(this.y, other.y))
|
||||
}
|
||||
|
||||
operator fun minus(vector: Vector): Vector {
|
||||
return Vector(this.x - vector.x, this.y - vector.y)
|
||||
}
|
||||
|
@ -61,16 +75,35 @@ class TouchGestureDetector(
|
|||
fun sizeSquared(): Float {
|
||||
return (max - min).absSquared()
|
||||
}
|
||||
|
||||
fun getDirection(): Vector {
|
||||
return last - start
|
||||
}
|
||||
|
||||
fun update(vector: Vector) {
|
||||
min = min.min(vector)
|
||||
max = max.max(vector)
|
||||
last = vector
|
||||
}
|
||||
}
|
||||
|
||||
private fun PointerPath.startIntersectsSystemGestureInsets(): Boolean {
|
||||
// ignore x, since this makes edge swipes very hard to execute
|
||||
return start.y < systemGestureInsetTop
|
||||
|| start.y > height - systemGestureInsetBottom
|
||||
}
|
||||
|
||||
private fun PointerPath.intersectsSystemGestureInsets(): Boolean {
|
||||
return min.x < systemGestureInsetLeft
|
||||
|| min.y < systemGestureInsetTop
|
||||
|| max.x > width - systemGestureInsetRight
|
||||
|| max.y > height - systemGestureInsetBottom
|
||||
}
|
||||
|
||||
private fun PointerPath.isTap(): Boolean {
|
||||
if (intersectsSystemGestureInsets()) {
|
||||
return false
|
||||
}
|
||||
return sizeSquared() < TOUCH_SLOP_SQUARE
|
||||
}
|
||||
|
||||
|
@ -87,24 +120,40 @@ class TouchGestureDetector(
|
|||
}
|
||||
|
||||
private var paths = HashMap<Int, PointerPath>()
|
||||
private var gestureIsLongClick = false
|
||||
|
||||
/* Set when
|
||||
* - the longPressHandler has detected this gesture as a long press
|
||||
* - the gesture was cancelled by MotionEvent.ACTION_CANCEL
|
||||
* In any case, the current gesture should be ignored by further detection logic.
|
||||
*/
|
||||
private var cancelled = false
|
||||
|
||||
private var lastTappedTime = 0L
|
||||
private var lastTappedLocation: Vector? = null
|
||||
|
||||
fun onTouchEvent(event: MotionEvent) {
|
||||
|
||||
if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
|
||||
synchronized(this@TouchGestureDetector) {
|
||||
cancelled = true
|
||||
}
|
||||
}
|
||||
|
||||
val pointerIdToIndex =
|
||||
(0..<event.pointerCount).associateBy { event.getPointerId(it) }
|
||||
|
||||
if (event.actionMasked == MotionEvent.ACTION_DOWN) {
|
||||
synchronized(this@TouchGestureDetector) {
|
||||
paths = HashMap()
|
||||
gestureIsLongClick = false
|
||||
cancelled = false
|
||||
}
|
||||
longPressHandler.postDelayed({
|
||||
synchronized(this@TouchGestureDetector) {
|
||||
if (cancelled) {
|
||||
return@postDelayed
|
||||
}
|
||||
if (paths.entries.size == 1 && paths.entries.firstOrNull()?.value?.isTap() == true) {
|
||||
gestureIsLongClick = true
|
||||
cancelled = true
|
||||
Gesture.LONG_CLICK.invoke(context)
|
||||
}
|
||||
}
|
||||
|
@ -112,8 +161,8 @@ class TouchGestureDetector(
|
|||
}
|
||||
|
||||
// add new pointers
|
||||
for(i in 0..<event.pointerCount){
|
||||
if(paths.containsKey(event.getPointerId(i))) {
|
||||
for (i in 0..<event.pointerCount) {
|
||||
if (paths.containsKey(event.getPointerId(i))) {
|
||||
continue
|
||||
}
|
||||
val index = pointerIdToIndex[i] ?: continue
|
||||
|
@ -142,7 +191,7 @@ class 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) {
|
||||
if (cancelled) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -176,9 +225,8 @@ class TouchGestureDetector(
|
|||
|
||||
val mainPointerPath = paths.entries.firstOrNull { it.value.number == 0 }?.value ?: return
|
||||
|
||||
// Ignore swipes at the very top, since this interferes with the status bar.
|
||||
// TODO: replace 100px by sensible dp value (e.g. twice the height of the status bar)
|
||||
if (paths.entries.any { it.value.start.y < 100 }) {
|
||||
// Ignore swipes starting at the very top and the very bottom
|
||||
if (paths.entries.any { it.value.startIntersectsSystemGestureInsets() }) {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -188,7 +236,8 @@ class TouchGestureDetector(
|
|||
if (duration in 0..TAP_TIMEOUT) {
|
||||
if (timeStart - lastTappedTime < DOUBLE_TAP_TIMEOUT &&
|
||||
lastTappedLocation?.let {
|
||||
(mainPointerPath.last - it).absSquared() < DOUBLE_TAP_SLOP_SQUARE} == true
|
||||
(mainPointerPath.last - it).absSquared() < DOUBLE_TAP_SLOP_SQUARE
|
||||
} == true
|
||||
) {
|
||||
Gesture.DOUBLE_CLICK.invoke(context)
|
||||
} else {
|
||||
|
@ -217,34 +266,38 @@ class TouchGestureDetector(
|
|||
val startEndMax = mainPointerPath.start.max(mainPointerPath.last)
|
||||
when (gesture) {
|
||||
Gesture.SWIPE_DOWN -> {
|
||||
if(startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) {
|
||||
if (startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) {
|
||||
gesture = Gesture.SWIPE_LARGER
|
||||
} else if (startEndMin.x - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.x) {
|
||||
gesture = Gesture.SWIPE_SMALLER
|
||||
}
|
||||
}
|
||||
|
||||
Gesture.SWIPE_UP -> {
|
||||
if(startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) {
|
||||
if (startEndMax.x + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.x) {
|
||||
gesture = Gesture.SWIPE_LARGER_REVERSE
|
||||
} else if (startEndMin.x - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.x) {
|
||||
gesture = Gesture.SWIPE_SMALLER_REVERSE
|
||||
}
|
||||
}
|
||||
|
||||
Gesture.SWIPE_RIGHT -> {
|
||||
if(startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) {
|
||||
if (startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) {
|
||||
gesture = Gesture.SWIPE_V
|
||||
} else if (startEndMin.y - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.y) {
|
||||
gesture = Gesture.SWIPE_LAMBDA
|
||||
}
|
||||
}
|
||||
|
||||
Gesture.SWIPE_LEFT -> {
|
||||
if(startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) {
|
||||
if (startEndMax.y + MIN_TRIANGLE_HEIGHT < mainPointerPath.max.y) {
|
||||
gesture = Gesture.SWIPE_V_REVERSE
|
||||
} else if (startEndMin.y - MIN_TRIANGLE_HEIGHT > mainPointerPath.min.y) {
|
||||
gesture = Gesture.SWIPE_LAMBDA_REVERSE
|
||||
}
|
||||
}
|
||||
else -> { }
|
||||
|
||||
else -> {}
|
||||
}
|
||||
|
||||
if (edgeActions) {
|
||||
|
@ -267,4 +320,20 @@ class TouchGestureDetector(
|
|||
gesture?.invoke(context)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateScreenSize(windowManager: WindowManager) {
|
||||
val displayMetrics = DisplayMetrics()
|
||||
@Suppress("deprecation") // required to support API < 30
|
||||
windowManager.defaultDisplay.getMetrics(displayMetrics)
|
||||
width = displayMetrics.widthPixels
|
||||
height = displayMetrics.heightPixels
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
fun setSystemGestureInsets(insets: Insets) {
|
||||
systemGestureInsetTop = insets.top
|
||||
systemGestureInsetBottom = insets.bottom
|
||||
systemGestureInsetLeft = insets.left
|
||||
systemGestureInsetRight = insets.right
|
||||
}
|
||||
}
|
|
@ -15,8 +15,10 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences
|
|||
* An interface implemented by every [Activity], Fragment etc. in Launcher.
|
||||
* It handles themes and window flags - a useful abstraction as it is the same everywhere.
|
||||
*/
|
||||
@Suppress("deprecation") // FLAG_FULLSCREEN is required to support API level < 30
|
||||
fun setWindowFlags(window: Window, homeScreen: Boolean) {
|
||||
window.setFlags(0, 0) // clear flags
|
||||
|
||||
// Display notification bar
|
||||
if (LauncherPreferences.display().hideStatusBar())
|
||||
window.setFlags(
|
||||
|
|
|
@ -1,24 +1,17 @@
|
|||
package de.jrpie.android.launcher.ui.list
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.content.res.Resources
|
||||
import android.graphics.Rect
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import android.window.OnBackInvokedDispatcher
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import de.jrpie.android.launcher.Application
|
||||
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
|
||||
|
@ -115,10 +108,13 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
?.let { ListActivityIntention.valueOf(it) }
|
||||
?: ListActivityIntention.VIEW
|
||||
|
||||
@Suppress("deprecation") // required to support API level < 33
|
||||
favoritesVisibility = bundle.getSerializable("favoritesVisibility")
|
||||
as? AppFilter.Companion.AppSetVisibility ?: favoritesVisibility
|
||||
@Suppress("deprecation") // required to support API level < 33
|
||||
privateSpaceVisibility = bundle.getSerializable("privateSpaceVisibility")
|
||||
as? AppFilter.Companion.AppSetVisibility ?: privateSpaceVisibility
|
||||
@Suppress("deprecation") // required to support API level < 33
|
||||
hiddenVisibility = bundle.getSerializable("hiddenVisibility")
|
||||
as? AppFilter.Companion.AppSetVisibility ?: hiddenVisibility
|
||||
|
||||
|
@ -185,20 +181,6 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
finish()
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
if (requestCode == REQUEST_UNINSTALL) {
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
Toast.makeText(this, getString(R.string.list_removed), Toast.LENGTH_LONG).show()
|
||||
finish()
|
||||
} else if (resultCode == Activity.RESULT_FIRST_USER) {
|
||||
Toast.makeText(this, getString(R.string.list_not_removed), Toast.LENGTH_LONG).show()
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun updateTitle() {
|
||||
var titleResource = intention.titleResource
|
||||
if (intention == ListActivityIntention.VIEW) {
|
||||
|
@ -241,11 +223,11 @@ class ListActivity : AppCompatActivity(), UIObject {
|
|||
|
||||
updateTitle()
|
||||
|
||||
val sectionsPagerAdapter = ListSectionsPagerAdapter(this, supportFragmentManager)
|
||||
val viewPager: ViewPager = findViewById(R.id.list_viewpager)
|
||||
viewPager.adapter = sectionsPagerAdapter
|
||||
val tabs: TabLayout = findViewById(R.id.list_tabs)
|
||||
tabs.setupWithViewPager(viewPager)
|
||||
val sectionsPagerAdapter = ListSectionsPagerAdapter(this)
|
||||
binding.listViewpager.let {
|
||||
it.adapter = sectionsPagerAdapter
|
||||
binding.listTabs.setupWithViewPager(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -257,9 +239,15 @@ private val TAB_TITLES = arrayOf(
|
|||
/**
|
||||
* The [ListSectionsPagerAdapter] returns the fragment,
|
||||
* which corresponds to the selected tab in [ListActivity].
|
||||
*
|
||||
* This should eventually be replaced by a [FragmentStateAdapter]
|
||||
* However this keyboard does not open when using [ViewPager2]
|
||||
* so currently [ViewPager] is used here.
|
||||
* https://github.com/jrpie/launcher/issues/130
|
||||
*/
|
||||
class ListSectionsPagerAdapter(private val activity: ListActivity, fm: FragmentManager) :
|
||||
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
|
||||
@Suppress("deprecation")
|
||||
class ListSectionsPagerAdapter(private val activity: ListActivity) :
|
||||
FragmentPagerAdapter(activity.supportFragmentManager) {
|
||||
|
||||
override fun getItem(position: Int): Fragment {
|
||||
return when (position) {
|
||||
|
|
|
@ -2,7 +2,6 @@ package de.jrpie.android.launcher.ui.list.apps
|
|||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.graphics.Rect
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
|
@ -15,7 +14,8 @@ import androidx.appcompat.app.AppCompatActivity
|
|||
import androidx.recyclerview.widget.RecyclerView
|
||||
import de.jrpie.android.launcher.Application
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
||||
import de.jrpie.android.launcher.actions.Action
|
||||
import de.jrpie.android.launcher.actions.Gesture
|
||||
import de.jrpie.android.launcher.apps.AbstractDetailedAppInfo
|
||||
import de.jrpie.android.launcher.apps.AppFilter
|
||||
import de.jrpie.android.launcher.apps.AppInfo
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -195,11 +195,10 @@ class AppsRecyclerAdapter(
|
|||
}
|
||||
|
||||
ListActivity.ListActivityIntention.PICK -> {
|
||||
val returnIntent = Intent()
|
||||
appInfo.getAction().writeToIntent(returnIntent)
|
||||
returnIntent.putExtra("forGesture", forGesture)
|
||||
activity.setResult(REQUEST_CHOOSE_APP, returnIntent)
|
||||
activity.finish()
|
||||
forGesture ?: return
|
||||
val gesture = Gesture.byId(forGesture) ?: return
|
||||
Action.setActionForGesture(gesture, appInfo.getAction())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@ import android.content.Context
|
|||
import android.content.Intent
|
||||
import android.content.pm.LauncherApps
|
||||
import android.graphics.Rect
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
|
@ -14,11 +13,9 @@ import android.widget.EditText
|
|||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.REQUEST_UNINSTALL
|
||||
import de.jrpie.android.launcher.apps.AppInfo
|
||||
import de.jrpie.android.launcher.apps.AbstractAppInfo
|
||||
import de.jrpie.android.launcher.apps.AbstractDetailedAppInfo
|
||||
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
|
||||
|
@ -44,17 +41,13 @@ fun AbstractAppInfo.uninstall(activity: Activity) {
|
|||
|
||||
Log.i(LOG_TAG, "uninstalling $this")
|
||||
|
||||
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE)
|
||||
val intent = Intent(Intent.ACTION_DELETE)
|
||||
intent.data = "package:$packageName".toUri()
|
||||
getUserFromId(userId, activity).let { user ->
|
||||
intent.putExtra(Intent.EXTRA_USER, user)
|
||||
}
|
||||
activity.startActivity(intent)
|
||||
|
||||
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
|
||||
activity.startActivityForResult(
|
||||
intent,
|
||||
REQUEST_UNINSTALL
|
||||
)
|
||||
} else if(this is PinnedShortcutInfo) {
|
||||
val pinned = LauncherPreferences.apps().pinnedShortcuts() ?: mutableSetOf()
|
||||
pinned.remove(this)
|
||||
|
@ -102,8 +95,8 @@ fun AbstractDetailedAppInfo.showRenameDialog(context: Context) {
|
|||
AlertDialog.Builder(context, R.style.AlertDialogCustom).apply {
|
||||
setTitle(context.getString(R.string.dialog_rename_title, getLabel()))
|
||||
setView(R.layout.dialog_rename_app)
|
||||
setNegativeButton(R.string.dialog_cancel) { d, _ -> d.cancel() }
|
||||
setPositiveButton(R.string.dialog_rename_ok) { d, _ ->
|
||||
setNegativeButton(android.R.string.cancel) { d, _ -> d.cancel() }
|
||||
setPositiveButton(android.R.string.ok) { d, _ ->
|
||||
setCustomLabel(
|
||||
(d as? AlertDialog)
|
||||
?.findViewById<EditText>(R.id.dialog_rename_app_edit_text)
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package de.jrpie.android.launcher.ui.list.other
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
@ -9,7 +8,8 @@ import android.widget.ImageView
|
|||
import android.widget.TextView
|
||||
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.Action
|
||||
import de.jrpie.android.launcher.actions.Gesture
|
||||
import de.jrpie.android.launcher.actions.LauncherAction
|
||||
import de.jrpie.android.launcher.ui.list.ListActivity
|
||||
|
||||
|
@ -36,7 +36,10 @@ class OtherRecyclerAdapter(val activity: Activity) :
|
|||
val pos = bindingAdapterPosition
|
||||
val content = othersList[pos]
|
||||
|
||||
(activity as? ListActivity)?.forGesture?.let { returnChoiceIntent(it, content) }
|
||||
activity.finish()
|
||||
val gestureId = (activity as? ListActivity)?.forGesture ?: return
|
||||
val gesture = Gesture.byId(gestureId) ?: return
|
||||
Action.setActionForGesture(gesture, content)
|
||||
}
|
||||
|
||||
init {
|
||||
|
@ -61,12 +64,4 @@ class OtherRecyclerAdapter(val activity: Activity) :
|
|||
val view: View = inflater.inflate(R.layout.list_other_row, parent, false)
|
||||
return ViewHolder(view)
|
||||
}
|
||||
|
||||
private fun returnChoiceIntent(forGesture: String, action: LauncherAction) {
|
||||
val returnIntent = Intent()
|
||||
returnIntent.putExtra("forGesture", forGesture)
|
||||
action.writeToIntent(returnIntent)
|
||||
activity.setResult(REQUEST_CHOOSE_APP, returnIntent)
|
||||
activity.finish()
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
package de.jrpie.android.launcher.ui.settings
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.content.res.Resources
|
||||
|
@ -8,17 +7,14 @@ import android.os.Bundle
|
|||
import android.provider.Settings
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
||||
import de.jrpie.android.launcher.databinding.SettingsBinding
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.preferences.theme.Background
|
||||
import de.jrpie.android.launcher.preferences.theme.ColorTheme
|
||||
import de.jrpie.android.launcher.saveListActivityChoice
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
import de.jrpie.android.launcher.ui.settings.actions.SettingsFragmentActions
|
||||
import de.jrpie.android.launcher.ui.settings.launcher.SettingsFragmentLauncher
|
||||
|
@ -49,15 +45,15 @@ class SettingsActivity : AppCompatActivity(), UIObject {
|
|||
// This ugly workaround causes a jump to the top of the list, but at least
|
||||
// the text stays readable.
|
||||
val i = Intent(this, SettingsActivity::class.java)
|
||||
.also { it.putExtra("tab", 1) }
|
||||
.also { it.putExtra(EXTRA_TAB, 1) }
|
||||
finish()
|
||||
startActivity(i)
|
||||
} else
|
||||
if (prefKey?.startsWith("theme.") == true ||
|
||||
prefKey?.startsWith("display.") == true
|
||||
) {
|
||||
recreate()
|
||||
}
|
||||
if (prefKey?.startsWith("theme.") == true ||
|
||||
prefKey?.startsWith("display.") == true
|
||||
) {
|
||||
recreate()
|
||||
}
|
||||
}
|
||||
private lateinit var binding: SettingsBinding
|
||||
|
||||
|
@ -71,15 +67,14 @@ class SettingsActivity : AppCompatActivity(), UIObject {
|
|||
setContentView(binding.root)
|
||||
|
||||
// set up tabs and swiping in settings
|
||||
val sectionsPagerAdapter = SettingsSectionsPagerAdapter(this, supportFragmentManager)
|
||||
val viewPager: ViewPager = findViewById(R.id.settings_viewpager)
|
||||
viewPager.adapter = sectionsPagerAdapter
|
||||
|
||||
val tabs: TabLayout = findViewById(R.id.settings_tabs)
|
||||
tabs.setupWithViewPager(viewPager)
|
||||
if (intent.hasExtra("tab")) {
|
||||
tabs.getTabAt(intent.getIntExtra("tab", 0))?.select()
|
||||
val sectionsPagerAdapter = SettingsSectionsPagerAdapter(this)
|
||||
binding.settingsViewpager.apply {
|
||||
adapter = sectionsPagerAdapter
|
||||
setCurrentItem(intent.getIntExtra(EXTRA_TAB, 0), false)
|
||||
}
|
||||
TabLayoutMediator(binding.settingsTabs, binding.settingsViewpager) { tab, position ->
|
||||
tab.text = sectionsPagerAdapter.getPageTitle(position)
|
||||
}.attach()
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
|
@ -108,24 +103,21 @@ class SettingsActivity : AppCompatActivity(), UIObject {
|
|||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
when (requestCode) {
|
||||
REQUEST_CHOOSE_APP -> saveListActivityChoice(data)
|
||||
else -> super.onActivityResult(requestCode, resultCode, data)
|
||||
}
|
||||
companion object {
|
||||
private const val EXTRA_TAB = "tab"
|
||||
}
|
||||
}
|
||||
|
||||
private val TAB_TITLES = arrayOf(
|
||||
R.string.settings_tab_app,
|
||||
R.string.settings_tab_actions,
|
||||
R.string.settings_tab_launcher,
|
||||
R.string.settings_tab_meta
|
||||
)
|
||||
|
||||
class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) :
|
||||
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
|
||||
class SettingsSectionsPagerAdapter(private val activity: FragmentActivity) :
|
||||
FragmentStateAdapter(activity) {
|
||||
|
||||
override fun getItem(position: Int): Fragment {
|
||||
override fun createFragment(position: Int): Fragment {
|
||||
return when (position) {
|
||||
0 -> SettingsFragmentActions()
|
||||
1 -> SettingsFragmentLauncher()
|
||||
|
@ -134,11 +126,11 @@ class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentMan
|
|||
}
|
||||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
return context.resources.getString(TAB_TITLES[position])
|
||||
fun getPageTitle(position: Int): CharSequence {
|
||||
return activity.resources.getString(TAB_TITLES[position])
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
override fun getItemCount(): Int {
|
||||
return 3
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
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.Action
|
||||
import de.jrpie.android.launcher.actions.Gesture
|
||||
import de.jrpie.android.launcher.apps.AppFilter
|
||||
|
@ -143,9 +142,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) }
|
||||
|
@ -181,9 +178,6 @@ class ActionsRecyclerAdapter(val activity: Activity) :
|
|||
intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString())
|
||||
intent.putExtra("hiddenVisibility", AppFilter.Companion.AppSetVisibility.VISIBLE)
|
||||
intent.putExtra("forGesture", gesture.id) // for which action we choose the app
|
||||
activity.startActivityForResult(
|
||||
intent,
|
||||
REQUEST_CHOOSE_APP
|
||||
)
|
||||
activity.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ package de.jrpie.android.launcher.ui.settings.meta
|
|||
|
||||
import android.app.AlertDialog
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
|
@ -20,7 +19,6 @@ 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
|
||||
import de.jrpie.android.launcher.ui.tutorial.TutorialActivity
|
||||
|
||||
/**
|
||||
* The [SettingsFragmentMeta] is a used as a tab in the SettingsActivity.
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
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.view.View
|
||||
import android.window.OnBackInvokedDispatcher
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import de.jrpie.android.launcher.databinding.TutorialBinding
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.saveListActivityChoice
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentConcept
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentFinish
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentSetup
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentStart
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentUsage
|
||||
import de.jrpie.android.launcher.ui.blink
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment0Start
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment1Concept
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment2Usage
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment3AppList
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment4Setup
|
||||
import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragment5Finish
|
||||
|
||||
/**
|
||||
* The [TutorialActivity] is displayed automatically on new installations.
|
||||
|
@ -31,10 +31,17 @@ import de.jrpie.android.launcher.ui.tutorial.tabs.TutorialFragmentUsage
|
|||
*/
|
||||
class TutorialActivity : AppCompatActivity(), UIObject {
|
||||
|
||||
private lateinit var binding: TutorialBinding
|
||||
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super<AppCompatActivity>.onCreate(savedInstanceState)
|
||||
super<UIObject>.onCreate()
|
||||
|
||||
// Initialise layout
|
||||
binding = TutorialBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
// Handle back key / gesture on Android 13+
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
onBackInvokedDispatcher.registerOnBackInvokedCallback(
|
||||
|
@ -48,15 +55,51 @@ class TutorialActivity : AppCompatActivity(), UIObject {
|
|||
}
|
||||
}
|
||||
|
||||
// Initialise layout
|
||||
setContentView(R.layout.tutorial)
|
||||
|
||||
// set up tabs and swiping in settings
|
||||
val sectionsPagerAdapter = TutorialSectionsPagerAdapter(supportFragmentManager)
|
||||
val viewPager: ViewPager = findViewById(R.id.tutorial_viewpager)
|
||||
viewPager.adapter = sectionsPagerAdapter
|
||||
val tabs: TabLayout = findViewById(R.id.tutorial_tabs)
|
||||
tabs.setupWithViewPager(viewPager)
|
||||
val sectionsPagerAdapter = TutorialSectionsPagerAdapter(this)
|
||||
binding.tutorialViewpager.apply {
|
||||
adapter = sectionsPagerAdapter
|
||||
currentItem = 0
|
||||
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||
override fun onPageSelected(position: Int) {
|
||||
binding.tutorialButtonNext.apply {
|
||||
val lastItem = sectionsPagerAdapter.itemCount - 1
|
||||
visibility = if (position == lastItem) {
|
||||
View.INVISIBLE
|
||||
} else {
|
||||
View.VISIBLE
|
||||
}
|
||||
if (position == 0) {
|
||||
blink()
|
||||
} else {
|
||||
clearAnimation()
|
||||
}
|
||||
}
|
||||
binding.tutorialButtonBack.apply {
|
||||
visibility = if (position == 0) {
|
||||
View.INVISIBLE
|
||||
} else {
|
||||
View.VISIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
TabLayoutMediator(binding.tutorialTabs, binding.tutorialViewpager) { _, _ -> }.attach()
|
||||
binding.tutorialButtonNext.setOnClickListener {
|
||||
binding.tutorialViewpager.apply {
|
||||
setCurrentItem(
|
||||
(currentItem + 1).coerceAtMost(sectionsPagerAdapter.itemCount - 1),
|
||||
true
|
||||
)
|
||||
}
|
||||
}
|
||||
binding.tutorialButtonBack.setOnClickListener {
|
||||
binding.tutorialViewpager.apply {
|
||||
setCurrentItem((currentItem - 1).coerceAtLeast(0), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTheme(): Resources.Theme {
|
||||
|
@ -68,14 +111,9 @@ class TutorialActivity : AppCompatActivity(), UIObject {
|
|||
super<UIObject>.onStart()
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
when (requestCode) {
|
||||
REQUEST_CHOOSE_APP -> saveListActivityChoice(data)
|
||||
else -> super.onActivityResult(requestCode, resultCode, data)
|
||||
}
|
||||
}
|
||||
|
||||
// prevent going back when the tutorial is shown for the first time
|
||||
@Deprecated("Deprecated in Java", ReplaceWith("use anyway"))
|
||||
@Suppress("deprecation") // support API level < 33
|
||||
override fun onBackPressed() {
|
||||
if (LauncherPreferences.internal().started())
|
||||
super.onBackPressed()
|
||||
|
@ -89,26 +127,22 @@ class TutorialActivity : AppCompatActivity(), UIObject {
|
|||
*
|
||||
* Tabs: (Start | Concept | Usage | Setup | Finish)
|
||||
*/
|
||||
class TutorialSectionsPagerAdapter(fm: FragmentManager) :
|
||||
FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
|
||||
class TutorialSectionsPagerAdapter(activity: FragmentActivity) :
|
||||
FragmentStateAdapter(activity) {
|
||||
|
||||
override fun getItem(position: Int): Fragment {
|
||||
override fun getItemCount(): Int {
|
||||
return 6
|
||||
}
|
||||
|
||||
override fun createFragment(position: Int): Fragment {
|
||||
return when (position) {
|
||||
0 -> TutorialFragmentStart()
|
||||
1 -> TutorialFragmentConcept()
|
||||
2 -> TutorialFragmentUsage()
|
||||
3 -> TutorialFragmentSetup()
|
||||
4 -> TutorialFragmentFinish()
|
||||
0 -> TutorialFragment0Start()
|
||||
1 -> TutorialFragment1Concept()
|
||||
2 -> TutorialFragment2Usage()
|
||||
3 -> TutorialFragment3AppList()
|
||||
4 -> TutorialFragment4Setup()
|
||||
5 -> TutorialFragment5Finish()
|
||||
else -> Fragment()
|
||||
}
|
||||
}
|
||||
|
||||
/* We don't use titles here, as we have the dots */
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
return ""
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return 5
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,24 +5,22 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import de.jrpie.android.launcher.databinding.TutorialStartBinding
|
||||
import de.jrpie.android.launcher.databinding.Tutorial0StartBinding
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
import de.jrpie.android.launcher.ui.blink
|
||||
|
||||
/**
|
||||
* The [TutorialFragmentStart] is a used as a tab in the TutorialActivity.
|
||||
* The [TutorialFragment0Start] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* It displays info about the app and gets the user into the tutorial
|
||||
*/
|
||||
class TutorialFragmentStart : Fragment(), UIObject {
|
||||
class TutorialFragment0Start : Fragment(), UIObject {
|
||||
|
||||
private lateinit var binding: TutorialStartBinding
|
||||
private lateinit var binding: Tutorial0StartBinding
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = TutorialStartBinding.inflate(inflater, container, false)
|
||||
binding.tutorialStartIconRight.blink()
|
||||
binding = Tutorial0StartBinding.inflate(inflater, container, false)
|
||||
return binding.root
|
||||
}
|
||||
|
|
@ -6,22 +6,22 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import de.jrpie.android.launcher.BuildConfig
|
||||
import de.jrpie.android.launcher.databinding.TutorialConceptBinding
|
||||
import de.jrpie.android.launcher.databinding.Tutorial1ConceptBinding
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
||||
/**
|
||||
* The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity.
|
||||
* The [TutorialFragment1Concept] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* It is used to display info about Launchers concept (open source, efficiency ...)
|
||||
*/
|
||||
class TutorialFragmentConcept : Fragment(), UIObject {
|
||||
private lateinit var binding: TutorialConceptBinding
|
||||
class TutorialFragment1Concept : Fragment(), UIObject {
|
||||
private lateinit var binding: Tutorial1ConceptBinding
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = TutorialConceptBinding.inflate(inflater, container, false)
|
||||
binding = Tutorial1ConceptBinding.inflate(inflater, container, false)
|
||||
binding.tutorialConceptBadgeVersion.text = BuildConfig.VERSION_NAME
|
||||
return binding.root
|
||||
}
|
|
@ -9,17 +9,17 @@ import de.jrpie.android.launcher.R
|
|||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
||||
/**
|
||||
* The [TutorialFragmentUsage] is a used as a tab in the TutorialActivity.
|
||||
* The [TutorialFragment2Usage] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* Tells the user how his screen will look and how the app can be used
|
||||
*/
|
||||
class TutorialFragmentUsage : Fragment(), UIObject {
|
||||
class TutorialFragment2Usage : Fragment(), UIObject {
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.tutorial_usage, container, false)
|
||||
return inflater.inflate(R.layout.tutorial_2_usage, container, false)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
|
@ -0,0 +1,30 @@
|
|||
package de.jrpie.android.launcher.ui.tutorial.tabs
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import de.jrpie.android.launcher.R
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
||||
/**
|
||||
* The [TutorialFragment3AppList] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* Tells the user how his screen will look and how the app can be used
|
||||
*/
|
||||
class TutorialFragment3AppList : Fragment(), UIObject {
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.tutorial_3_app_list, container, false)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super<Fragment>.onStart()
|
||||
super<UIObject>.onStart()
|
||||
}
|
||||
|
||||
}
|
|
@ -9,17 +9,17 @@ import de.jrpie.android.launcher.R
|
|||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
||||
/**
|
||||
* The [TutorialFragmentSetup] is a used as a tab in the TutorialActivity.
|
||||
* The [TutorialFragment4Setup] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* It is used to display info in the tutorial
|
||||
*/
|
||||
class TutorialFragmentSetup : Fragment(), UIObject {
|
||||
class TutorialFragment4Setup : Fragment(), UIObject {
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.tutorial_setup, container, false)
|
||||
return inflater.inflate(R.layout.tutorial_4_setup, container, false)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
|
@ -6,25 +6,25 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import de.jrpie.android.launcher.BuildConfig.VERSION_CODE
|
||||
import de.jrpie.android.launcher.databinding.TutorialFinishBinding
|
||||
import de.jrpie.android.launcher.databinding.Tutorial5FinishBinding
|
||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||
import de.jrpie.android.launcher.setDefaultHomeScreen
|
||||
import de.jrpie.android.launcher.ui.UIObject
|
||||
|
||||
/**
|
||||
* The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity.
|
||||
* The [TutorialFragment5Finish] is a used as a tab in the TutorialActivity.
|
||||
*
|
||||
* It is used to display further resources and let the user start Launcher
|
||||
*/
|
||||
class TutorialFragmentFinish : Fragment(), UIObject {
|
||||
class TutorialFragment5Finish : Fragment(), UIObject {
|
||||
|
||||
private lateinit var binding: TutorialFinishBinding
|
||||
private lateinit var binding: Tutorial5FinishBinding
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = TutorialFinishBinding.inflate(inflater, container, false)
|
||||
binding = Tutorial5FinishBinding.inflate(inflater, container, false)
|
||||
return binding.root
|
||||
}
|
||||
|
|
@ -12,6 +12,7 @@ class HtmlTextView(context: Context, attr: AttributeSet?, int: Int) :
|
|||
constructor(context: Context) : this(context, null, 0)
|
||||
|
||||
init {
|
||||
@Suppress("deprecation") // required to support API level < 24
|
||||
text = Html.fromHtml(text.toString())
|
||||
movementMethod = LinkMovementMethod.getInstance()
|
||||
}
|
||||
|
|
BIN
app/src/main/res/drawable-mdpi/tutorial_app_list.png
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
app/src/main/res/drawable-mdpi/tutorial_home_screen.png
Normal file
After Width: | Height: | Size: 23 KiB |
11
app/src/main/res/drawable/baseline_apps_24.xml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<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="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" />
|
||||
|
||||
</vector>
|
11
app/src/main/res/drawable/baseline_home_24.xml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<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="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
|
||||
|
||||
</vector>
|
|
@ -1,11 +0,0 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24"
|
||||
android:width="24dp">
|
||||
|
||||
<path
|
||||
android:fillColor="?android:textColor"
|
||||
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
|
||||
|
||||
</vector>
|
11
app/src/main/res/drawable/baseline_navigate_before_24.xml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<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="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z" />
|
||||
|
||||
</vector>
|
11
app/src/main/res/drawable/baseline_navigate_next_24.xml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<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="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z" />
|
||||
|
||||
</vector>
|
Before Width: | Height: | Size: 159 KiB |
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path
|
||||
android:fillColor="#252827"
|
||||
android:pathData="M0,0h108v108h-108z" />
|
||||
</vector>
|
|
@ -116,7 +116,7 @@
|
|||
android:layout_margin="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/pin_shortcut_button_ok"
|
||||
android:text="@android:string/ok"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -95,6 +95,11 @@
|
|||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<!--
|
||||
Should be replaced by androidx.viewpager2.widget.ViewPager2
|
||||
but there is an issue with opening the keyboard:
|
||||
https://github.com/jrpie/launcher/issues/130
|
||||
-->
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
android:id="@+id/list_viewpager"
|
||||
android:layout_width="0dp"
|
||||
|
|
|
@ -15,18 +15,21 @@
|
|||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:src="@mipmap/ic_launcher_round"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/list_apps_row_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="60sp"
|
||||
android:layout_marginStart="20sp"
|
||||
android:gravity="start"
|
||||
android:text=""
|
||||
android:textSize="20sp"
|
||||
tools:text="@string/app_name"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/list_apps_row_icon"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -15,6 +15,7 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:src="@mipmap/ic_launcher_round"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
||||
|
@ -25,7 +26,7 @@
|
|||
android:paddingTop="5dp"
|
||||
android:text=""
|
||||
android:textSize="11sp"
|
||||
tools:text="some app"
|
||||
tools:text="@string/app_name"
|
||||
app:layout_constraintTop_toBottomOf="@id/list_apps_row_icon"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
@ -32,6 +32,6 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="some app" />
|
||||
tools:text="@string/app_name" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -73,7 +73,7 @@
|
|||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
<androidx.viewpager2.widget.ViewPager2
|
||||
android:id="@+id/settings_viewpager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
tools:context=".ui.tutorial.TutorialActivity">
|
||||
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
<androidx.viewpager2.widget.ViewPager2
|
||||
android:id="@+id/tutorial_viewpager"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
|
@ -22,15 +22,37 @@
|
|||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.0" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/tutorial_button_back"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:gravity="center"
|
||||
android:alpha="0.5"
|
||||
android:src="@drawable/baseline_navigate_before_24"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_viewpager" />
|
||||
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/tutorial_tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="50dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/tutorial_button_next"
|
||||
app:layout_constraintStart_toEndOf="@+id/tutorial_button_back"
|
||||
app:tabBackground="@drawable/tutorial_tab_selector"
|
||||
app:tabGravity="center"
|
||||
app:tabIndicatorHeight="0dp"
|
||||
app:tabIndicatorHeight="0dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/tutorial_button_next"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:gravity="center"
|
||||
android:src="@drawable/baseline_navigate_next_24"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_viewpager" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -8,7 +8,7 @@
|
|||
android:paddingRight="32sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragmentStart">
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment0Start">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_start_text"
|
||||
|
@ -21,16 +21,4 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_start_icon_right"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text=">>>>>>"
|
||||
android:textSize="64sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_start_text" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -8,7 +8,7 @@
|
|||
android:paddingRight="32sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragmentConcept">
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment1Concept">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_concept_title"
|
||||
|
@ -28,11 +28,10 @@
|
|||
android:gravity="center"
|
||||
android:text="@string/tutorial_concept_text"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_concept_title"
|
||||
app:layout_constraintVertical_bias="0.19999999" />
|
||||
app:layout_constraintBottom_toTopOf="@id/tutorial_concept_badge_version_label"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_concept_text_2"
|
||||
|
@ -60,6 +59,22 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_concept_text"
|
||||
tools:text="0.0.7"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_concept_badge_version_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="32dp"
|
||||
android:layout_marginEnd="32dp"
|
||||
android:gravity="center"
|
||||
android:textSize="18sp"
|
||||
android:text="@string/tutorial_concept_label_version"
|
||||
app:layout_constraintBottom_toTopOf="@+id/tutorial_concept_badge_version"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:paddingLeft="32sp"
|
||||
android:paddingRight="32sp"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragmentUsage">
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment2Usage">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_usage_title"
|
||||
|
@ -39,12 +39,12 @@
|
|||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/home_round_screen"
|
||||
android:src="@drawable/tutorial_home_screen"
|
||||
app:layout_constraintBottom_toTopOf="@id/tutorial_usage_text_2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="@+id/tutorial_usage_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/tutorial_usage_text"
|
||||
app:srcCompat="@drawable/home_round_screen"
|
||||
app:srcCompat="@drawable/tutorial_home_screen"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
64
app/src/main/res/layout/tutorial_3_app_list.xml
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/tutorial_usage_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingLeft="32sp"
|
||||
android:paddingRight="32sp"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment3AppList">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_app_list_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/tutorial_app_list_title"
|
||||
android:textSize="30sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_app_list_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/tutorial_app_list_text"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/tutorial_app_list_screen"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tutorial_app_list_title" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/tutorial_app_list_screen"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/tutorial_app_list"
|
||||
app:layout_constraintBottom_toTopOf="@id/tutorial_app_list_text_2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="@+id/tutorial_app_list_text"
|
||||
app:layout_constraintTop_toBottomOf="@id/tutorial_app_list_text"
|
||||
app:srcCompat="@drawable/tutorial_app_list"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_app_list_text_2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/tutorial_app_list_text_2"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tutorial_app_list_screen" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -8,7 +8,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:paddingLeft="32sp"
|
||||
android:paddingRight="32sp"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragmentSetup">
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment4Setup">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_setup_title"
|
||||
|
@ -33,7 +33,7 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tutorial_setup_title" />
|
||||
|
||||
<fragment
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/tutorial_setup_actions_rview_fragment"
|
||||
android:name="de.jrpie.android.launcher.ui.settings.actions.SettingsFragmentActionsRecycler"
|
||||
android:layout_width="0dp"
|
|
@ -7,7 +7,7 @@
|
|||
android:paddingRight="32sp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragmentFinish">
|
||||
tools:context=".ui.tutorial.tabs.TutorialFragment5Finish">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tutorial_finish_title"
|
||||
|
@ -24,6 +24,7 @@
|
|||
android:id="@+id/tutorial_finish_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/tutorial_finish_text"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintBottom_toTopOf="@id/tutorial_finish_button_start"
|
Before Width: | Height: | Size: 612 B |
Before Width: | Height: | Size: 372 B |
Before Width: | Height: | Size: 880 B |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2 KiB |
|
@ -14,7 +14,7 @@
|
|||
-
|
||||
-->
|
||||
<string name="settings_title">Einstellungen</string>
|
||||
<string name="settings_tab_app">Apps</string>
|
||||
<string name="settings_tab_actions">Aktionen</string>
|
||||
<string name="settings_tab_launcher">Launcher</string>
|
||||
<string name="settings_tab_meta">Meta</string>
|
||||
<!--
|
||||
|
@ -54,9 +54,9 @@
|
|||
<string name="settings_gesture_description_down_left_edge">An der linken Kante nach unten wischen</string>
|
||||
<string name="settings_gesture_down_right_edge">Abwärts (rechts)</string>
|
||||
<string name="settings_gesture_description_down_right_edge">An der rechten Kanten nach unten wischen</string>
|
||||
<string name="settings_gesture_vol_up">Lautstärke +</string>
|
||||
<string name="settings_gesture_vol_up">Lauter-Taste</string>
|
||||
<string name="settings_gesture_description_vol_up">Die Taste \"Lauter\" drücken</string>
|
||||
<string name="settings_gesture_vol_down">Lautstärke -</string>
|
||||
<string name="settings_gesture_vol_down">Leiser-Taste</string>
|
||||
<string name="settings_gesture_description_vol_down">Die Taste \"Leiser\" drücken</string>
|
||||
<string name="settings_gesture_double_click">Doppelklick</string>
|
||||
<string name="settings_gesture_description_double_click">In einem leeren Bereich doppelt klicken</string>
|
||||
|
@ -67,7 +67,6 @@
|
|||
<string name="settings_gesture_time">Uhr</string>
|
||||
<string name="settings_gesture_description_time">Auf die Uhrzeit klicken</string>
|
||||
<string name="settings_apps_choose">App wählen</string>
|
||||
<string name="settings_apps_view_all">Alle Anwendungen</string>
|
||||
<string name="settings_apps_install">Apps installieren</string>
|
||||
<string name="settings_apps_toast_store_not_found">Store nicht gefunden</string>
|
||||
<!--
|
||||
|
@ -94,10 +93,8 @@
|
|||
<string name="settings_theme_color_theme_item_dark">Dunkel</string>
|
||||
<string name="settings_theme_color_theme_item_light">Hell</string>
|
||||
<string name="settings_theme_wallpaper">Hintergrund auswählen</string>
|
||||
<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>
|
||||
|
@ -105,7 +102,7 @@
|
|||
<string name="settings_enabled_gestures_edge_swipe">Kantenaktionen</string>
|
||||
<string name="settings_enabled_gestures_edge_swipe_edge_width">Kantenbreite</string>
|
||||
<string name="settings_functionality_auto_launch">Suchergebnis starten</string>
|
||||
<string name="settings_functionality_search_web_summary">Beim Durchsuchen der Apps Enter drücken um stattdessen im Internet zu suchen</string>
|
||||
<string name="settings_functionality_search_web_summary">Beim Durchsuchen der Apps Enter drücken, um stattdessen im Internet zu suchen.</string>
|
||||
<string name="settings_functionality_auto_keyboard">Tastatur automatisch öffnen</string>
|
||||
<string name="settings_launcher_sensitivity">Empfindlichkeit</string>
|
||||
<!--
|
||||
|
@ -118,7 +115,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">Das 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>
|
||||
|
@ -128,7 +124,7 @@
|
|||
<string name="settings_meta_contact">Entwickler kontaktieren</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_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>
|
||||
<!--
|
||||
|
@ -145,11 +141,9 @@
|
|||
<string name="list_app_info">App Info</string>
|
||||
<string name="list_app_hidden_remove">Sichtbar machen</string>
|
||||
<string name="list_app_rename">Umbenennen</string>
|
||||
<string name="list_removed">Die App wurde entfernt</string>
|
||||
<string name="list_not_removed">Die App konnte nicht entfernt werden</string>
|
||||
<string name="list_apps_search_hint">Anwendungen suchen</string>
|
||||
<string name="list_apps_search_hint">Suchen</string>
|
||||
<string name="list_apps_search_hint_no_auto_launch">Suchen (kein Schnellstart)</string>
|
||||
<string name="list_other_settings">µLauncher Einstellungen</string>
|
||||
<string name="list_other_settings">μLauncher Einstellungen</string>
|
||||
<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>
|
||||
|
@ -166,18 +160,18 @@
|
|||
-->
|
||||
<string name="list_other_torch">Taschenlampe umschalten</string>
|
||||
<string name="tutorial_title">Tutorial</string>
|
||||
<string name="tutorial_start_text">Hier eine kurze Erklärung, wie dieser Launcher funktioniert.</string>
|
||||
<string name="tutorial_start_text">👋\n\nHier 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 ist freie Software, enthält keine Werbung und sammelt keinerlei Daten.</string>
|
||||
<string name="tutorial_concept_text">µLauncher bietet eine minimalistische, effiziente und ablenkungsfreie 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">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_usage_text_2">Häufig verwendete Apps können mittels Gesten, z.B. Wischen oder den Lautstärketasten geöffnet werden.</string>
|
||||
<string name="tutorial_setup_title">Einrichtung</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">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_text">Es kann losgehen!\n\nWir hoffen, dass diese App hilfreich ist!\n\n- Finn (der Entwickler)\nund 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>
|
||||
|
@ -202,28 +196,19 @@
|
|||
<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="settings_actions_lock_method">Methode zum Sperren des Bildschirms wählen</string>
|
||||
<string name="dialog_rename_ok">Ok</string>
|
||||
<string name="dialog_rename_title">%1$s umbenennen</string>
|
||||
<string name="toast_private_space_default_home_screen">µLauncher muss als Standardlauncher eingerichtet sein um auf den privaten Bereich zugreifen zu können.</string>
|
||||
<string name="toast_private_space_default_home_screen">μLauncher muss als Standardlauncher eingerichtet sein um auf den privaten Bereich zugreifen zu können.</string>
|
||||
<string name="toast_lock_screen_not_supported">Fehler: Auf diesem Gerät kann der Bildschirm nicht mittels Bedienungshilfe gesperrt werden. Bitte stattdessen Geräteadministrator verwenden.</string>
|
||||
<string name="accessibility_service_name">µLauncher - Bildschirm sperren</string>
|
||||
<string name="accessibility_service_name">μLauncher - Bildschirm sperren</string>
|
||||
<string name="alert_lock_screen_failed">Fehler: Bildschirm konnte nicht gesperrt werden.</string>
|
||||
<string name="toast_accessibility_service_not_enabled">Die Bedienungshilfe ist nicht aktiviert. Bitte in den Einstellungen aktivieren</string>
|
||||
<string name="screen_lock_method_dialog_title">Methode zum Sperren wählen</string>
|
||||
<string name="screen_lock_method_use_accessibility">Bedienungshilfe verwenden</string>
|
||||
<string name="screen_lock_method_use_device_admin">Geräteadministrator verwenden</string>
|
||||
<string name="accessibility_service_description">
|
||||
µLauncher als Bedienungshilfe zu aktivieren ermöglicht es µLauncher, den Bildschirm zu sperren.
|
||||
Achtung: Hierfür sind weitgehende Berechtigungen erforderlich.
|
||||
Solche Berechtigungen sollten niemals leichtfertig vergeben werden.
|
||||
µLauncher wird diese Berechtigungen ausschließlich zum Sperren des Bildschirms verwenden.
|
||||
|
||||
Alternativ kann der Bildschirm auch mithilfe von Geräteadministratorberechtigungen gesperrt werden.
|
||||
Dann ist jedoch ein Entsperren mit Fingerabdruck oder Gesichtserkennung nicht möglich.
|
||||
</string>
|
||||
<string name="accessibility_service_description">μLauncher als Bedienungshilfe zu aktivieren ermöglicht es μLauncher, den Bildschirm zu sperren. Achtung: Hierfür sind weitgehende Berechtigungen erforderlich. Solche Berechtigungen sollten niemals leichtfertig vergeben werden. μLauncher wird diese Berechtigungen ausschließlich zum Sperren des Bildschirms verwenden. Alternativ kann der Bildschirm auch mithilfe von Geräteadministratorberechtigungen gesperrt werden. Dann ist jedoch ein Entsperren mit Fingerabdruck oder Gesichtserkennung nicht möglich.</string>
|
||||
<string name="screen_lock_method_dialog_text"><![CDATA[
|
||||
<h1>Methode zum Sperren auswählen</h1>
|
||||
Es gibt zwei Möglichkeiten, wie µLauncher den Bildschirm sperren kann.
|
||||
Es gibt zwei Möglichkeiten, wie μLauncher den Bildschirm sperren kann.
|
||||
Leider haben beide Nachteile:<br/><br/>
|
||||
|
||||
|
||||
|
@ -267,16 +252,61 @@
|
|||
<string name="dialog_select_color_alpha">Transparenz</string>
|
||||
<string name="dialog_select_color_blue">Blau</string>
|
||||
<string name="dialog_select_color_green">Grün</string>
|
||||
<string name="dialog_select_color_ok">Ok</string>
|
||||
<string name="dialog_select_color_color_hex">Farbe</string>
|
||||
<string name="dialog_choose_color_title">Farbe wählen</string>
|
||||
<string name="settings_meta_licenses">Open Source Lizenzen</string>
|
||||
<string name="legal_info_title">Open Source Lizenzen</string>
|
||||
<string name="toast_activity_not_found_search_web">Keine App gefunden um die Suche durchzuführen.</string>
|
||||
<string name="toast_activity_not_found_browser">URL kann nicht geöffnet werden: kein Browser gefunden.</string>
|
||||
<string name="dialog_consent_accessibility_privileges">Mir ist bewusst, dass µLauncher hierdurch weitreichende Berechtigungen erhält.</string>
|
||||
<string name="dialog_consent_accessibility_privileges">Mir ist bewusst, dass μLauncher hierdurch weitreichende Berechtigungen erhält.</string>
|
||||
<string name="dialog_consent_accessibility_other_options">Mir ist bewusst, dass Alternativen existieren (Geräteadministrator oder der Power-Button).</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_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>
|
||||
<string name="dialog_report_bug_info">Danke für die Mithilfe, μLauncher zu verbessern!\nEs wird darum gebeten, Bug Reports die folgenden Informationen anzufügen, um diese besser nachvollziehen zu können:</string>
|
||||
<string name="settings_gesture_back">Zurück</string>
|
||||
<string name="settings_gesture_description_back">Zurück-Taste oder -Geste</string>
|
||||
<string name="settings_gesture_swipe_larger_reverse"><![CDATA[> (Rückwärts)]]></string>
|
||||
<string name="settings_gesture_description_swipe_larger_reverse">Unten links -> mitte rechts -> oben links</string>
|
||||
<string name="settings_gesture_swipe_smaller"><![CDATA[<]]></string>
|
||||
<string name="settings_gesture_swipe_smaller_reverse"><![CDATA[< (Rückwärts)]]></string>
|
||||
<string name="settings_gesture_swipe_v">V</string>
|
||||
<string name="settings_gesture_description_swipe_v">Oben links -> unten mitte -> oben rechts</string>
|
||||
<string name="settings_gesture_swipe_v_reverse">V (Rückwärts)</string>
|
||||
<string name="settings_gesture_description_swipe_smaller_reverse">Unten rechts -> mitte links -> oben rechts</string>
|
||||
<string name="settings_gesture_swipe_lambda">Λ</string>
|
||||
<string name="settings_gesture_description_swipe_lambda">Unten links -> oben mitte -> unten rechts</string>
|
||||
<string name="settings_gesture_description_swipe_v_reverse">Oben rechts -> unten mitte -> oben links</string>
|
||||
<string name="settings_gesture_swipe_lambda_reverse">Λ (Rückwärts)</string>
|
||||
<string name="settings_gesture_description_swipe_lambda_reverse">Unten rechts -> oben mtte -> unten links</string>
|
||||
<string name="dialog_report_bug_button_security">Sicherheitslücke melden</string>
|
||||
<string name="settings_apps_hide_private_space_apps">Privaten Bereich nicht in der App Liste anzeigen</string>
|
||||
<string name="list_title_private_space">Privater Bereich</string>
|
||||
<string name="pin_shortcut_title">Shortcut hinzufügen</string>
|
||||
<string name="pin_shortcut_button_bind">An Geste binden</string>
|
||||
<string name="pin_shortcut_switch_visible">In Appliste anzeigen</string>
|
||||
<string name="tooltip_unlock_private_space">Privaten Bereich entsperren</string>
|
||||
<string name="settings_display_hide_status_bar">Statusleiste verstecken</string>
|
||||
<string name="settings_display_hide_navigation_bar">Navigationsleiste verstecken</string>
|
||||
<string name="tooltip_lock_private_space">Privaten Bereich sperren</string>
|
||||
<string name="tutorial_concept_label_version">Version</string>
|
||||
<string name="tutorial_app_list_title">Alle Apps</string>
|
||||
<string name="tutorial_app_list_text_2">Sobald nur noch eine App passt, wird diese automatisch gestartet.\nDas lässt sich unterdrücken, indem der Suche ein Leerzeichen vorangestellt wird.</string>
|
||||
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
|
||||
<string name="settings_gesture_description_swipe_smaller">Oben rechts -> mitte links -> unten rechts</string>
|
||||
<string name="settings_gesture_description_swipe_larger">Oben links -> mitte rechts -> unten links</string>
|
||||
<string name="tutorial_app_list_text">In der Appliste kann effizient nach Apps gesucht werden.\n\nDie Liste wird standardmäßig durch Wischen nach oben geöffnet (auch das lässt sich einstellen).</string>
|
||||
<string name="dialog_consent_accessibility_text"><![CDATA[Das Aktivieren der Bedienungshilfe erteilt μLauncher <strong>weitreichende Zugriffsrechte</strong> .<br/>μLauncher wird diese <strong>ausschließlich zum Sperren des Bildschirms</strong> verwenden. μLauncher wird <strong>niemals irgendwelche Daten sammeln</strong>. Insbesondere werden mittels der Bedienungshilfe keine Daten gesammelt.]]></string>
|
||||
<string name="settings_gesture_tap_up">Tippen und hoch</string>
|
||||
<string name="settings_gesture_description_tap_up">Tippen, dann nach oben wischen</string>
|
||||
<string name="settings_gesture_tap_down">Tippen und nach unten</string>
|
||||
<string name="settings_gesture_description_tap_down">Tippen, dann nach unten wischen</string>
|
||||
<string name="settings_gesture_tap_left">Tippen und links</string>
|
||||
<string name="settings_gesture_description_tap_left">Tippen, dann nach links wischen</string>
|
||||
<string name="settings_gesture_tap_right">Tippen und rechts</string>
|
||||
<string name="settings_gesture_description_tap_right">Tippen, dann nach rechts wischen</string>
|
||||
<string name="dialog_report_bug_security_info">Sicherheitslücken bitte nicht öffentlich bei GitHub melden, sondern auf dem folgenden Weg:</string>
|
||||
<string name="list_other_list_private_space">Privater Bereich</string>
|
||||
<string name="list_other_track_play_pause">Musik: Wiedergabe / Pause</string>
|
||||
<string name="settings_list_reverse_layout">Appliste umkehren</string>
|
||||
</resources>
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
<string name="settings_gesture_date">Toca la fecha</string>
|
||||
<string name="settings_gesture_time">Toca el reloj</string>
|
||||
<string name="settings_apps_choose">Elegir Aplicación</string>
|
||||
<string name="settings_apps_view_all">Todas las aplicaciones</string>
|
||||
<string name="settings_apps_install">Instalar aplicaciones</string>
|
||||
<string name="settings_apps_toast_store_not_found">No se encontró la Store</string>
|
||||
<!--
|
||||
|
@ -60,10 +59,8 @@
|
|||
<string name="settings_theme_color_theme_item_dark">Oscuro</string>
|
||||
<string name="settings_theme_color_theme_item_light">Luminoso</string>
|
||||
<string name="settings_theme_wallpaper">Seleccionar 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_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 +73,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>
|
||||
|
@ -96,8 +92,6 @@
|
|||
<string name="list_tab_other">Otros</string>
|
||||
<string name="list_app_delete">Desinstalar</string>
|
||||
<string name="list_app_info">Información</string>
|
||||
<string name="list_removed">Se eliminó la aplicación</string>
|
||||
<string name="list_not_removed">No se pudo eliminar la aplicación</string>
|
||||
<string name="list_apps_search_hint">Buscar Aplicaciones</string>
|
||||
<string name="list_other_settings">Configuración de Launcher</string>
|
||||
<string name="list_other_list">Aplicaciones</string>
|
||||
|
@ -127,4 +121,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>
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
<string name="settings_gesture_date">Date</string>
|
||||
<string name="settings_gesture_time">Horloge</string>
|
||||
<string name="settings_apps_choose">Choisir une application</string>
|
||||
<string name="settings_apps_view_all">Voir toutes les applications</string>
|
||||
<string name="settings_apps_install">Installer des applications</string>
|
||||
<string name="settings_apps_toast_store_not_found">Magasin d\'applications introuvable</string>
|
||||
<!--
|
||||
|
@ -52,10 +51,8 @@
|
|||
<string name="settings_theme_color_theme_item_dark">Sombre</string>
|
||||
<string name="settings_theme_color_theme_item_light">Clair</string>
|
||||
<string name="settings_theme_wallpaper">Choisir un 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_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 +65,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>
|
||||
|
@ -88,8 +84,6 @@
|
|||
<string name="list_tab_other">Autre</string>
|
||||
<string name="list_app_delete">Désinstaller</string>
|
||||
<string name="list_app_info">Informations</string>
|
||||
<string name="list_removed">Application supprimée</string>
|
||||
<string name="list_not_removed">Impossible de désinstaller l\'application</string>
|
||||
<string name="list_apps_search_hint">Chercher des applications</string>
|
||||
<string name="list_other_settings">Réglages d\'µLauncher</string>
|
||||
<string name="list_other_list">Toutes les Applications</string>
|
||||
|
@ -175,7 +169,6 @@
|
|||
<string name="dialog_consent_accessibility_privileges">Je suis conscient que cela accordera des privilèges importants à µLauncher.</string>
|
||||
<string name="dialog_choose_color_title">Choisir une couleur</string>
|
||||
<string name="dialog_consent_accessibility_title">Activation du service d\'accessibilité</string>
|
||||
<string name="dialog_select_color_ok">Ok</string>
|
||||
<string name="dialog_select_color_color_hex">Couleur</string>
|
||||
<string name="dialog_consent_accessibility_consent">Je consent à µLauncher utilisation du service d’accessibilité pour fournir une fonction non liée à l’accessibilité.</string>
|
||||
<string name="dialog_consent_accessibility_data_collection">Je consent à la non-collecte de données par µLauncher.</string>
|
||||
|
@ -222,7 +215,6 @@
|
|||
<string name="settings_theme_background_item_solid">Plein</string>
|
||||
<string name="dialog_rename_title">Renommer %1$s</string>
|
||||
<string name="screen_lock_method_use_accessibility">Utiliser le service d’accessibilité</string>
|
||||
<string name="dialog_rename_ok">Ok</string>
|
||||
<string name="settings_functionality_search_web">Chercher sur le web</string>
|
||||
<string name="settings_functionality_search_web_summary">Appuyer sur entrée en cherchant une application pour lancer une recherche web.</string>
|
||||
<string name="dialog_cancel">Annuler</string>
|
||||
|
@ -231,4 +223,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>
|
||||
|
@ -83,7 +82,6 @@
|
|||
<string name="settings_gesture_description_vol_up">Premi il pulsante di aumento del volume</string>
|
||||
<string name="settings_gesture_vol_down">Riduci il volume</string>
|
||||
<string name="settings_gesture_description_vol_down">Premi il pulsante per ridurre il volume</string>
|
||||
<string name="settings_apps_view_all">Vedi tutte le applicazioni</string>
|
||||
<string name="settings_apps_install">Installa le applicazioni</string>
|
||||
<string name="settings_theme_monochrome_icons">Icone monocromatiche</string>
|
||||
<string name="settings_clock_time_visible">Mostra l\'ora</string>
|
||||
|
@ -112,10 +110,8 @@
|
|||
<string name="settings_theme_font">Font</string>
|
||||
<string name="settings_clock_flip_date_time">Inverti data e ora</string>
|
||||
<string name="settings_theme_wallpaper">Scegli uno sfondo</string>
|
||||
<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>
|
||||
|
@ -181,7 +177,6 @@
|
|||
<string name="list_app_hidden_add">Nascondi</string>
|
||||
<string name="list_app_hidden_remove">Mostra</string>
|
||||
<string name="list_app_rename">Rinomina</string>
|
||||
<string name="list_removed">Le applicazioni selezionate sono state rimosse</string>
|
||||
<string name="list_apps_search_hint">Cerca</string>
|
||||
<string name="list_other_settings">Impostazioni μLauncher</string>
|
||||
<string name="list_other_expand_notifications_panel">Espandi il pannello notifiche</string>
|
||||
|
@ -195,9 +190,7 @@
|
|||
<string name="tutorial_usage_title">Utilizzo</string>
|
||||
<string name="tutorial_usage_text">La schermata principale contiene solo data e ora. Nessuna distrazione.</string>
|
||||
<string name="alert_requires_android_m">Questa funzione richiede Android 6 o successivi.</string>
|
||||
<string name="dialog_rename_ok">Ok</string>
|
||||
<string name="dialog_rename_title">Rinomina %1$s</string>
|
||||
<string name="list_not_removed">Impossibile rimuovere l\'applicazione</string>
|
||||
<string name="settings_theme_color_theme_item_dynamic">Dinamico</string>
|
||||
<string name="settings_clock_color">Colore</string>
|
||||
<string name="settings_gesture_double_up">Due dita verso l\'alto</string>
|
||||
|
@ -211,7 +204,6 @@
|
|||
<string name="dialog_select_color_alpha">Trasparente</string>
|
||||
<string name="dialog_select_color_blue">Blu</string>
|
||||
<string name="dialog_select_color_green">Verde</string>
|
||||
<string name="dialog_select_color_ok">Ok</string>
|
||||
<string name="dialog_select_color_color_hex">Colore</string>
|
||||
<string name="dialog_choose_color_title">Scegli colore</string>
|
||||
<string name="dialog_consent_accessibility_ok">Attiva Servizi di Accessibilità</string>
|
||||
|
@ -237,4 +229,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,196 @@
|
|||
<?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_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_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_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="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>
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
<string name="settings_gesture_date">Data</string>
|
||||
<string name="settings_gesture_time">Hora</string>
|
||||
<string name="settings_apps_choose">Selecione um app</string>
|
||||
<string name="settings_apps_view_all">Ver todos os apps</string>
|
||||
<string name="settings_apps_install">Instalar aplicativos</string>
|
||||
<string name="settings_apps_toast_store_not_found">Loja não encontrada</string>
|
||||
<!--
|
||||
|
@ -63,10 +62,8 @@
|
|||
<string name="settings_clock_localized">Use formato de data localizado</string>
|
||||
<string name="settings_clock_flip_date_time">Inverter data e hora</string>
|
||||
<string name="settings_theme_wallpaper">Escolha papel de parede</string>
|
||||
<string name="settings_launcher_change_wallpaper">Alterar papel de parede</string>
|
||||
<string name="settings_launcher_section_display">Exibição</string>
|
||||
<string name="settings_display_screen_timeout_disabled">Manter a tela ligada</string>
|
||||
<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 +77,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>
|
||||
|
@ -100,8 +96,6 @@
|
|||
<string name="list_tab_other">Outros</string>
|
||||
<string name="list_app_delete">Desinstalar</string>
|
||||
<string name="list_app_info">Informações do aplicativo</string>
|
||||
<string name="list_removed">O app selecionado foi removido</string>
|
||||
<string name="list_not_removed">Não foi possível remover o app</string>
|
||||
<string name="list_apps_search_hint">Busque</string>
|
||||
<string name="list_other_settings">Configurações do µLauncher</string>
|
||||
<string name="list_other_list">Todos os apps</string>
|
||||
|
@ -232,7 +226,6 @@
|
|||
<string name="settings_list_layout_item_text">Texto</string>
|
||||
<string name="settings_list_layout_item_grid">Grade</string>
|
||||
<string name="list_app_rename">Renomear</string>
|
||||
<string name="dialog_rename_ok">beleza</string>
|
||||
<string name="dialog_rename_title">Renomear %1$s</string>
|
||||
<string name="settings_theme_font_item_serif_monospace">Serif monospace</string>
|
||||
<string name="settings_theme_font_item_serif">Serif</string>
|
||||
|
@ -250,7 +243,6 @@
|
|||
<string name="dialog_consent_accessibility_ok">Ativar o Serviço de acessibilidade</string>
|
||||
<string name="dialog_cancel">Cancelar</string>
|
||||
<string name="dialog_consent_accessibility_text"><![CDATA[Você está prestes a ativar o Serviço de acessibilidade. Isto concederá <strong>permissões elevadas</strong> ao µLauncher.<br/>µLauncher usará estas permissões <strong>apenas para bloquear a tela</strong>. µLauncher <strong>nunca coletará nenhum dado</strong>. Sobretudo, o µLauncher não implementa o Serviço de acessibilidade para coletar dados.]]></string>
|
||||
<string name="dialog_select_color_ok">beleza</string>
|
||||
<string name="dialog_consent_accessibility_privileges">Estou ciente de que isto concederá permissões elevadas ao µLauncher.</string>
|
||||
<string name="dialog_consent_accessibility_other_options">Estou ciente de que existem outras opções (permissões de Administrador do aparelho ou o botão de ligar).</string>
|
||||
<string name="settings_functionality_search_web">Pesquise na internet</string>
|
||||
|
@ -310,5 +302,4 @@
|
|||
<string name="settings_gesture_description_swipe_smaller_reverse">Canto inferior direito -> centro esquerdo -> canto superior direito</string>
|
||||
<string name="settings_gesture_description_swipe_lambda_reverse">Inferior direito -> superior médio -> inferior esquerdo</string>
|
||||
<string name="settings_list_reverse_layout">Lista de apps inversa</string>
|
||||
<string name="pin_shortcut_button_ok">Ok</string>
|
||||
</resources>
|
||||
|
|
|
@ -105,7 +105,6 @@
|
|||
<string name="settings_gesture_time">Saat</string>
|
||||
<string name="settings_gesture_description_time">Saate tıklayın</string>
|
||||
<string name="settings_apps_choose">Uygulama Seçin</string>
|
||||
<string name="settings_apps_view_all">Tüm uygulamaları göster</string>
|
||||
<string name="settings_apps_install">Uygulamaları yükle</string>
|
||||
<string name="settings_apps_toast_store_not_found">Mağaza bulunamadı</string>
|
||||
<string name="settings_launcher_section_appearance">Görünüş</string>
|
||||
|
@ -120,8 +119,6 @@
|
|||
<string name="list_other_nop">Hiçbir şey yapma</string>
|
||||
<string name="settings_meta_view_code">Kaynak kodunu göster</string>
|
||||
<string name="settings_meta_report_bug">Hatayı bildirin</string>
|
||||
<string name="list_removed">Seçilen uygulama kaldırıldı</string>
|
||||
<string name="list_not_removed">Uygulama kaldırılamadı</string>
|
||||
<string name="list_apps_search_hint">Uygulamaları Ara</string>
|
||||
<string name="list_other_list">Tüm Uygulamalar</string>
|
||||
<string name="list_other_list_favorites">Favori Uygulamalar</string>
|
||||
|
@ -134,10 +131,8 @@
|
|||
<string name="settings_clock_show_seconds">Saniyeleri gösteri</string>
|
||||
<string name="settings_clock_flip_date_time">Tarih ile zamanı yer değiştir</string>
|
||||
<string name="settings_theme_wallpaper">Duvar kağıdı seç</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_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 +160,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>
|
||||
|
@ -198,7 +192,6 @@
|
|||
<string name="alert_torch_access_exception">Hata: Fenere erişilemiyor.</string>
|
||||
<string name="settings_actions_lock_method">Ekranı kilitleme yöntemini seçin</string>
|
||||
<string name="dialog_cancel">İptal</string>
|
||||
<string name="dialog_rename_ok">OK</string>
|
||||
<string name="dialog_rename_title">Yeniden Adlandır %1$s</string>
|
||||
<string name="settings_theme_color_theme_item_dynamic">Dinamik</string>
|
||||
<string name="settings_clock_color">Renk</string>
|
||||
|
@ -206,7 +199,6 @@
|
|||
<string name="dialog_select_color_alpha">Alfa</string>
|
||||
<string name="dialog_select_color_blue">Mavi</string>
|
||||
<string name="dialog_select_color_green">Yeşil</string>
|
||||
<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>
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
<resources>
|
||||
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
|
||||
(such as screen margins) for screens with more than 820dp of available width. This
|
||||
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
|
||||
<dimen name="activity_horizontal_margin">64dp</dimen>
|
||||
</resources>
|
|
@ -5,7 +5,7 @@
|
|||
<string name="ic_menu_alt">更多选项</string>
|
||||
<string name="settings_title">设置</string>
|
||||
<string name="settings_launcher_section_appearance">外观</string>
|
||||
<string name="settings_theme_color_theme">主题</string>
|
||||
<string name="settings_theme_color_theme">主题风格</string>
|
||||
<string name="settings_launcher_section_display">显示</string>
|
||||
<string name="list_tab_other">其他</string>
|
||||
<string name="settings_gesture_up">上</string>
|
||||
|
@ -37,58 +37,52 @@
|
|||
<string name="settings_gesture_date">日期</string>
|
||||
<string name="settings_gesture_time">时间</string>
|
||||
<string name="settings_apps_choose">选择应用</string>
|
||||
<string name="settings_apps_view_all">浏览全部应用</string>
|
||||
<string name="settings_apps_install">安装应用</string>
|
||||
<string name="settings_apps_toast_store_not_found">没有找到应用市场</string>
|
||||
<string name="settings_launcher_section_date_time"><![CDATA[日期和时间]]></string>
|
||||
<string name="settings_theme_wallpaper">选择一个壁纸</string>
|
||||
<string name="settings_launcher_change_wallpaper">换壁纸</string>
|
||||
<string name="settings_theme_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_show_tutorial">查看 µLauncher 的使用教程</string>
|
||||
<string name="settings_meta_reset">重置设置</string>
|
||||
<string name="settings_meta_reset_confirm">你将放弃你所有的配置。继续吗?</string>
|
||||
<string name="settings_meta_report_bug">反馈 BUG</string>
|
||||
<string name="settings_meta_reset_confirm">该操作将丢弃您的所有配置。是否继续?</string>
|
||||
<string name="settings_meta_report_bug">错误反馈</string>
|
||||
<string name="settings_meta_fork_contact">联系该 fork 版本的作者</string>
|
||||
<string name="settings_meta_privacy">隐私政策</string>
|
||||
<string name="settings_meta_contact">联系原作者</string>
|
||||
<string name="settings_meta_discord">加入 Discord!</string>
|
||||
<string name="settings_meta_discord">加入我们的 Discord 社区!</string>
|
||||
<string name="list_title_view">全部应用</string>
|
||||
<string name="list_title_pick">选择应用</string>
|
||||
<string name="tutorial_start_text">花几秒时间学下咋用这个启动器吧!</string>
|
||||
<string name="tutorial_start_text">👋\n\n花几秒钟时间,了解一下如何用这个启动器吧!</string>
|
||||
<string name="tutorial_concept_title">概念</string>
|
||||
<string name="tutorial_concept_text_2">该应用是开源的(MIT许可),并在 GitHub 上可用!一定要来看看代码仓库!</string>
|
||||
<string name="tutorial_concept_text_2">这是一款自由软件(遵循 MIT 许可)!\n欢迎查看项目仓库!</string>
|
||||
<string name="tutorial_usage_title">使用方法</string>
|
||||
<string name="tutorial_usage_text">您的主屏幕仅包含本地日期和时间,没有其它纷纷扰扰。</string>
|
||||
<string name="tutorial_usage_text">您的主屏幕仅包含本地日期和时间,没有多余项目。</string>
|
||||
<string name="tutorial_setup_title">设置</string>
|
||||
<string name="tutorial_setup_text">我们为您选择了一些默认应用。如果您愿意,现在可以更改它们:</string>
|
||||
<string name="tutorial_setup_text_2">您也可以稍后更改选择。</string>
|
||||
<string name="tutorial_setup_text">我们为您选择了一些默认应用。如果您希望进行更改,现在就可以:</string>
|
||||
<string name="tutorial_setup_text_2">您也可以稍后对您的选择进行更改。</string>
|
||||
<string name="tutorial_finish_title">开始!</string>
|
||||
<string name="list_tab_app">应用</string>
|
||||
<string name="list_app_delete">卸载</string>
|
||||
<string name="list_app_info">应用信息</string>
|
||||
<string name="list_not_removed">无法移除应用</string>
|
||||
<string name="list_removed">移除了选定的应用</string>
|
||||
<string name="list_apps_search_hint">搜索</string>
|
||||
<string name="list_other_settings">启动器设置</string>
|
||||
<string name="list_other_settings">μLauncher 设置</string>
|
||||
<string name="list_other_list">全部应用</string>
|
||||
<string name="list_other_volume_up">音乐:大声</string>
|
||||
<string name="list_other_volume_down">音乐:小声</string>
|
||||
<string name="list_other_volume_up">增大音量</string>
|
||||
<string name="list_other_volume_down">降低音量</string>
|
||||
<string name="list_other_track_previous">音乐:上一首</string>
|
||||
<string name="list_other_track_next">音乐:下一首</string>
|
||||
<string name="list_other_nop">啥也不干</string>
|
||||
<string name="tutorial_title">教程</string>
|
||||
<string name="tutorial_concept_text">μLauncher 的设计是最小、高效且无干扰。它不付费、无广告、不追踪。</string>
|
||||
<string name="tutorial_usage_text_2">您只需滑动屏幕或按下按钮即可启动应用程序。在下一步向导中选择一些应用程序。</string>
|
||||
<string name="tutorial_concept_text">μLauncher 的设计理念是简约、高效,无干扰。\n\n不含广告、且不收集任何数据。</string>
|
||||
<string name="tutorial_usage_text_2">您可以通过手势或按键来启动最重要的应用程序。</string>
|
||||
<string name="settings_general_choose_home_screen">将 μLauncher 设为默认桌面</string>
|
||||
<string name="tutorial_finish_text">您已经准备好开始了!我希望这对您很有价值!——Finn(Launcher 作者)和 Josia(做了一些改进并维护了 μLauncher 分支)</string>
|
||||
<string name="tutorial_finish_text">您已经准备好开始使用本启动器了!\n\n希望这对你有帮助!\n\n- Finn(Launcher 的作者)和 Josia(对 μLauncher 进行了改进和维护)</string>
|
||||
<string name="settings_enabled_gestures_double_swipe">双滑动作</string>
|
||||
<string name="settings_clock_localized">使用本地日期格式</string>
|
||||
<string name="settings_clock_time_visible">显示时间</string>
|
||||
|
@ -110,9 +104,9 @@
|
|||
<string name="settings_apps_hide_bound_apps">不要在应用抽屉中显示被绑定到手势的应用</string>
|
||||
<string name="alert_requires_android_m">此功能需要 Android 6 或更高版本。</string>
|
||||
<string name="snackbar_app_hidden">应用程序已隐藏。您可在设置中让它再次显示。</string>
|
||||
<string name="toast_device_admin_not_enabled">µLauncher 需要是设备管理员才能够锁定屏幕。</string>
|
||||
<string name="device_admin_explanation">这是锁屏动作所必需的。</string>
|
||||
<string name="accessibility_service_name">µLauncher -锁屏</string>
|
||||
<string name="toast_device_admin_not_enabled">µLauncher 需要获得设备管理员权限才能够锁定屏幕。</string>
|
||||
<string name="device_admin_explanation">这是执行锁屏操作所必需的。</string>
|
||||
<string name="accessibility_service_name">µLauncher - 锁屏</string>
|
||||
<string name="list_title_favorite">收藏的应用</string>
|
||||
<string name="list_app_favorite_add">添加到收藏夹</string>
|
||||
<string name="list_app_favorite_remove">从收藏夹中移除</string>
|
||||
|
@ -144,19 +138,18 @@
|
|||
<string name="settings_gesture_description_date">点击日期</string>
|
||||
<string name="settings_gesture_description_time">点击时间</string>
|
||||
<string name="settings_meta_view_code">查看源代码</string>
|
||||
<string name="settings_meta_join_chat">加入 µLauncher 聊天群</string>
|
||||
<string name="settings_meta_join_chat">加入 μLauncher 的聊天群</string>
|
||||
<string name="list_other_list_favorites">收藏的应用</string>
|
||||
<string name="list_other_lock_screen">锁屏</string>
|
||||
<string name="settings_theme_text_shadow">文本阴影</string>
|
||||
<string name="settings_enabled_gestures_double_swipe_summary">双指滑动</string>
|
||||
<string name="dialog_rename_ok">确定</string>
|
||||
<string name="dialog_rename_title">重命名 %1$s</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_dark">暗色</string>
|
||||
<string name="settings_theme_background_item_transparent">透明</string>
|
||||
<string name="settings_theme_background_item_dim">昏暗</string>
|
||||
<string name="settings_theme_background_item_dim">变暗</string>
|
||||
<string name="settings_theme_background_item_blur">模糊</string>
|
||||
<string name="settings_theme_background_item_solid">固实</string>
|
||||
<string name="settings_theme_background_item_solid">纯色</string>
|
||||
<string name="settings_theme_font_item_system_default">系统默认</string>
|
||||
<string name="settings_theme_font_item_monospace">等宽</string>
|
||||
<string name="settings_theme_font_item_serif">衬线</string>
|
||||
|
@ -165,28 +158,27 @@
|
|||
<string name="settings_enabled_gestures_edge_swipe_edge_width">边缘宽度</string>
|
||||
<string name="list_app_rename">重命名</string>
|
||||
<string name="device_admin_description">启用锁屏动作</string>
|
||||
<string name="toast_accessibility_service_not_enabled">μLauncher 的无障碍服务未启用。请在设置中启用它</string>
|
||||
<string name="toast_lock_screen_not_supported">错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员。</string>
|
||||
<string name="toast_accessibility_service_not_enabled">μLauncher 的无障碍服务未启用,请在设置中启用它。</string>
|
||||
<string name="toast_lock_screen_not_supported">错误:此设备不支持使用无障碍功能锁定屏幕。请改用设备管理员模式。</string>
|
||||
<string name="screen_lock_method_use_accessibility">使用无障碍服务</string>
|
||||
<string name="screen_lock_method_use_device_admin">使用设备管理员</string>
|
||||
<string name="screen_lock_method_use_device_admin">使用设备管理员模式</string>
|
||||
<string name="dialog_cancel">取消</string>
|
||||
<string name="settings_theme_color_theme_item_light">浅色</string>
|
||||
<string name="settings_theme_color_theme_item_light">亮色</string>
|
||||
<string name="list_other_expand_settings_panel">快速设置</string>
|
||||
<string name="alert_lock_screen_failed">错误:锁定屏幕失败。(如果您刚刚升级了应用程序,请尝试在手机设置中手动禁用并重新启用无障碍服务)</string>
|
||||
<string name="alert_lock_screen_failed">错误:锁定屏幕失败。(如果您刚刚升级了本启动器,请尝试在手机设置中手动禁用并重新启用无障碍服务)</string>
|
||||
<string name="settings_enabled_gestures_edge_swipe_summary">在屏幕边缘滑动</string>
|
||||
<string name="accessibility_service_description">将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意,这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审计源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁。</string>
|
||||
<string name="accessibility_service_description">将 µLauncher 设为无障碍服务允许其锁定屏幕。请注意,这需要过多的权限。你永远不应该轻易地授予任何应用程序这样的权限。µLauncher 将仅使用无障碍服务功能锁屏。您可以审核源代码。请注意,锁屏也可以通过授予 µLauncher 设备管理员权限来实现,然而,这种方法不适用于以指纹和面部解锁。</string>
|
||||
<string name="settings_gesture_back">返回</string>
|
||||
<string name="dialog_select_color_red">红色</string>
|
||||
<string name="dialog_select_color_blue">蓝色</string>
|
||||
<string name="dialog_select_color_alpha">透明度</string>
|
||||
<string name="dialog_select_color_green">绿色</string>
|
||||
<string name="dialog_select_color_ok">确定</string>
|
||||
<string name="settings_theme_color_theme_item_dynamic">动态</string>
|
||||
<string name="list_title_private_space">私人空间</string>
|
||||
<string name="list_other_list_private_space">私人空间</string>
|
||||
<string name="dialog_choose_color_title">选择颜色</string>
|
||||
<string name="dialog_select_color_color_hex">颜色</string>
|
||||
<string name="dialog_report_bug_title">报告错误</string>
|
||||
<string name="dialog_report_bug_title">错误反馈</string>
|
||||
<string name="settings_gesture_swipe_larger"><![CDATA[>]]></string>
|
||||
<string name="tooltip_lock_private_space">锁定私人空间</string>
|
||||
<string name="settings_gesture_swipe_v">V</string>
|
||||
|
@ -210,7 +202,77 @@
|
|||
<string name="toast_private_space_locked">私人空间已锁定</string>
|
||||
<string name="toast_private_space_unlocked">私人空间已解锁</string>
|
||||
<string name="toast_private_space_not_available">私人空间不可用</string>
|
||||
<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_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>
|
||||
<string name="dialog_consent_accessibility_data_collection">我同意 μLauncher 不收集任何数据。</string>
|
||||
<string name="settings_meta_donate">捐赠</string>
|
||||
<string name="list_other_volume_adjust">调整音量</string>
|
||||
<string name="tutorial_concept_label_version">版本</string>
|
||||
<string name="tutorial_app_list_title">所有应用</string>
|
||||
<string name="tutorial_app_list_text">您可以在应用程序列表中快速所搜所有应用。\n\n您可以通过上滑打开应用程序列表,也可以通过绑定其他手势操作来打开应用程序列表。</string>
|
||||
<string name="tutorial_app_list_text_2">当匹配到唯一的应用程序后,该应用将自动启动。\n如果你不想触发自动启动,在查询内容前加上空格即可禁用。</string>
|
||||
<string name="settings_display_hide_status_bar">隐藏状态栏</string>
|
||||
<string name="settings_display_hide_navigation_bar">隐藏导航栏</string>
|
||||
<string name="settings_list_reverse_layout">倒序排列应用程序</string>
|
||||
<string name="dialog_consent_accessibility_consent">我同意 μLauncher 使用无障碍服务来提供与无障碍服务无关的其他功能。</string>
|
||||
</resources>
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
|
||||
<!-- Legal -->
|
||||
<string name="legal_info_text"><![CDATA[
|
||||
<h2>µLauncher</h2>
|
||||
<h2>μLauncher</h2>
|
||||
Modifications to Launcher.
|
||||
<p><a href=\"https://github.com/jrpie/launcher\">github.com/jrpie/launcher</a></p>
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#000000</color>
|
||||
</resources>
|
|
@ -16,7 +16,7 @@
|
|||
-->
|
||||
<string name="settings_title">Settings</string>
|
||||
|
||||
<string name="settings_tab_app">Apps</string>
|
||||
<string name="settings_tab_actions">Actions</string>
|
||||
<string name="settings_tab_launcher">Launcher</string>
|
||||
<string name="settings_tab_meta">Meta</string>
|
||||
|
||||
|
@ -85,9 +85,9 @@
|
|||
<string name="settings_gesture_swipe_lambda_reverse">Λ (Reverse)</string>
|
||||
<string name="settings_gesture_description_swipe_lambda_reverse">Bottom right -> top mid -> bottom left</string>
|
||||
|
||||
<string name="settings_gesture_vol_up">Volume Up</string>
|
||||
<string name="settings_gesture_vol_up">Volume Up Key</string>
|
||||
<string name="settings_gesture_description_vol_up">Press the volume up button</string>
|
||||
<string name="settings_gesture_vol_down">Volume Down</string>
|
||||
<string name="settings_gesture_vol_down">Volume Down Key</string>
|
||||
<string name="settings_gesture_description_vol_down">Press the volume down button</string>
|
||||
<string name="settings_gesture_double_click">Double Click</string>
|
||||
<string name="settings_gesture_description_double_click">Double click an empty area</string>
|
||||
|
@ -101,8 +101,6 @@
|
|||
|
||||
<string name="settings_apps_choose">Choose App</string>
|
||||
|
||||
<string name="settings_apps_view_all">View all apps</string>
|
||||
|
||||
<string name="settings_apps_install">Install apps</string>
|
||||
<string name="settings_apps_toast_store_not_found">Store not found</string>
|
||||
|
||||
|
@ -148,7 +146,6 @@
|
|||
<string name="settings_clock_flip_date_time">Flip date and time</string>
|
||||
|
||||
<string name="settings_theme_wallpaper">Choose a wallpaper</string>
|
||||
<string name="settings_launcher_change_wallpaper">Change wallpaper</string>
|
||||
|
||||
<string name="settings_launcher_section_display">Display</string>
|
||||
|
||||
|
@ -193,7 +190,7 @@
|
|||
<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_show_tutorial">View Launcher Tutorial</string>
|
||||
<string name="settings_meta_show_tutorial">View µLauncher Tutorial</string>
|
||||
|
||||
<string name="settings_meta_reset">Reset Settings</string>
|
||||
<string name="settings_meta_reset_confirm">You are going to discard all your preferences. Continue?</string>
|
||||
|
@ -202,14 +199,14 @@
|
|||
<string name="settings_meta_report_bug">Report a bug</string>
|
||||
|
||||
<string name="dialog_report_bug_title">Report a bug</string>
|
||||
<string name="dialog_report_bug_info">Thank you for helping to improve µLauncher!\nPlease consider adding the following information to your bug report:</string>
|
||||
<string name="dialog_report_bug_info">Thank you for helping to improve μLauncher!\nPlease consider adding the following information to your bug report:</string>
|
||||
<string name="dialog_report_bug_button_clipboard">Copy to clipboard</string>
|
||||
<string name="dialog_report_bug_security_info">Please do not report security vulnerabilities publicly on GitHub, but use the following instead:</string>
|
||||
<string name="dialog_report_bug_button_security">Report a security vulnerability</string>
|
||||
<string name="dialog_report_bug_create_report">Create report</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>
|
||||
|
@ -240,13 +237,10 @@
|
|||
<string name="list_app_hidden_remove">Show</string>
|
||||
<string name="list_app_rename">Rename</string>
|
||||
|
||||
<string name="list_removed">Removed the selected application</string>
|
||||
<string name="list_not_removed">Unable to remove application</string>
|
||||
|
||||
<string name="list_apps_search_hint">Search</string>
|
||||
<string name="list_apps_search_hint_no_auto_launch">Search (no auto launch)</string>
|
||||
|
||||
<string name="list_other_settings">µLauncher Settings</string>
|
||||
<string name="list_other_settings">μLauncher Settings</string>
|
||||
<string name="list_other_list">All Applications</string>
|
||||
<string name="list_other_list_favorites">Favorite Applications</string>
|
||||
<string name="list_other_list_private_space">Private Space</string>
|
||||
|
@ -258,14 +252,15 @@
|
|||
<string name="list_other_track_previous">Music: Previous</string>
|
||||
<string name="list_other_track_play_pause">Music: Play / Pause</string>
|
||||
<string name="list_other_expand_notifications_panel">Expand notifications panel</string>
|
||||
<string name="list_other_recent_apps">Recent Apps</string>
|
||||
<string name="list_other_nop">Do nothing</string>
|
||||
<string name="list_other_lock_screen">Lock Screen</string>
|
||||
<string name="list_other_torch">Toggle Torch</string>
|
||||
<string name="list_other_launch_other_launcher">Launch other Home Screen</string>
|
||||
|
||||
<!-- Pin shortcuts -->
|
||||
<string name="pin_shortcut_title">Add Shortcut</string>
|
||||
<string name="pin_shortcut_button_bind">Bind to gesture</string>
|
||||
<string name="pin_shortcut_button_ok">Ok</string>
|
||||
<string name="pin_shortcut_switch_visible">Show in app list</string>
|
||||
|
||||
<!--
|
||||
|
@ -274,22 +269,29 @@
|
|||
-
|
||||
-->
|
||||
<string name="tutorial_title">Tutorial</string>
|
||||
<string name="tutorial_start_text">Take a few seconds to learn how to use this Launcher!</string>
|
||||
<string name="tutorial_start_text">👋\n\nTake a few seconds to learn how to use this Launcher!</string>
|
||||
|
||||
<string name="tutorial_concept_title">Concept</string>
|
||||
<string name="tutorial_concept_text">Launcher is designed to be minimal, efficient and free of distraction. It is free of payments, ads and tracking services.</string>
|
||||
<string name="tutorial_concept_text_2">The app is open-source (MIT license) and available on GitHub! Make sure to check out the repository!</string>
|
||||
<string name="tutorial_concept_text">μLauncher is designed to be minimal, efficient and free of distraction.
|
||||
\n\nIt contains no ads and collects no data.</string>
|
||||
<string name="tutorial_concept_text_2">It is free software (MIT license)!\nMake sure to check out the repository!</string>
|
||||
<string name="tutorial_concept_label_version">Version</string>
|
||||
|
||||
<string name="tutorial_usage_title">Usage</string>
|
||||
<string name="tutorial_usage_text">Your home screen contains the local date and time. No distraction.</string>
|
||||
<string name="tutorial_usage_text_2">You can launch your apps with a single swipe or button press. Choose some in the next slide.</string>
|
||||
<string name="tutorial_usage_text_2">You can launch your most important apps with touch gestures or button presses.</string>
|
||||
|
||||
<string name="tutorial_app_list_title">All Apps</string>
|
||||
<string name="tutorial_app_list_text">You can quickly search through all apps in the app list.\n\nSwipe up to open it, or bind it to a different gesture.</string>
|
||||
<string name="tutorial_app_list_text_2">Once only one app matches, it launches automatically.\nThis can be disabled by prefixing the query with a space.</string>
|
||||
|
||||
|
||||
<string name="tutorial_setup_title">Setup</string>
|
||||
<string name="tutorial_setup_text">We chose some default apps for you. You can change them now if you want to:</string>
|
||||
<string name="tutorial_setup_text_2">You can also change your selection later.</string>
|
||||
|
||||
<string name="tutorial_finish_title">Let\'s go!</string>
|
||||
<string name="tutorial_finish_text">You are ready to get started! I hope this is of great value to you! - Finn (who made Launcher) \tand Josia (who made some improvements and maintains the fork μLauncher)</string>
|
||||
<string name="tutorial_finish_text">You are ready to get started!\n\nI hope this is of great value to you!\n\n- Finn (who made Launcher) and Josia (who made some improvements and maintains the fork μLauncher)</string>
|
||||
<string name="tutorial_finish_button">Start</string>
|
||||
|
||||
|
||||
|
@ -301,28 +303,35 @@
|
|||
<string name="snackbar_app_hidden">App hidden. You can make it visible again in settings.</string>
|
||||
<string name="undo">Undo</string>
|
||||
<string name="list_other_expand_settings_panel">Quick Settings</string>
|
||||
<string name="toast_device_admin_not_enabled">µLauncher needs to be a device admin in order to lock the screen.</string>
|
||||
<string name="toast_device_admin_not_enabled">μLauncher needs to be a device admin in order to lock the screen.</string>
|
||||
<string name="device_admin_explanation">This is required for the lock screen action.</string>
|
||||
<string name="device_admin_description">Enable the lock screen action</string>
|
||||
<string name="alert_no_torch_found">No camera with torch detected.</string>
|
||||
<string name="alert_torch_access_exception">Error: Can\'t access torch.</string>
|
||||
<string name="alert_lock_screen_failed">Error: Failed to lock screen. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)</string>
|
||||
<string name="alert_recent_apps_failed">Error: Failed to show recent apps. (If you just upgraded the app, try to disable and re-enable the accessibility service in phone settings)</string>
|
||||
<string name="alert_enable_accessibility_failed">Error: Failed to enable the accessibility service.</string>
|
||||
<string name="toast_accessibility_service_not_enabled">μLauncher\'s accessibility service is not enabled. Please enable it in settings</string>
|
||||
<string name="toast_private_space_locked">Private space locked</string>
|
||||
<string name="toast_private_space_unlocked">Private space unlocked</string>
|
||||
<string name="toast_private_space_not_available">Private space is not available</string>
|
||||
<string name="toast_private_space_default_home_screen">µLauncher needs to be the default home screen to access private space.</string>
|
||||
<string name="toast_private_space_default_home_screen">μLauncher needs to be the default home screen to access private space.</string>
|
||||
<string name="tooltip_lock_private_space">Lock private space</string>
|
||||
<string name="tooltip_unlock_private_space">Unlock private space</string>
|
||||
<string name="toast_lock_screen_not_supported">Error: Locking the screen using accessibility is not supported on this device. Please use device admin instead.</string>
|
||||
<string name="accessibility_service_name">µLauncher - lock screen</string>
|
||||
<string name="accessibility_service_name">μLauncher</string>
|
||||
<string name="accessibility_service_description">
|
||||
Setting µLauncher as an accessibility service allows it to lock the screen.
|
||||
Setting μLauncher as an accessibility service allows it to lock the screen and open the recent apps menu.
|
||||
Note that excessive permissions are required. You should never grant such permissions lightly to any app.
|
||||
|
||||
µLauncher will use the accessibility service only for locking the screen. You can check the source code to make sure.
|
||||
μLauncher will use the accessibility service only for performing the following actions when requested by the user:
|
||||
|
||||
Note that locking the screen can also be accomplished by granting µLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock.
|
||||
* lock screen
|
||||
* open recent apps
|
||||
|
||||
μLauncher will never use the accessibility service to collect data. You can check the source code to make sure.
|
||||
|
||||
Note that locking the screen can also be accomplished by granting μLauncher device administrator permissions. However that method doesn\'t work with fingerprint and face unlock.
|
||||
</string>
|
||||
|
||||
|
||||
|
@ -340,7 +349,7 @@
|
|||
|
||||
<h3>Accessibility Service</h3>
|
||||
Requires excessive privileges.
|
||||
µLauncher will use those privileges only for locking the screen.
|
||||
μLauncher will use those privileges only for locking the screen.
|
||||
<br/>
|
||||
(You really should not trust a random app you just downloaded with such a claim, but you can check the <a href=\"https://github.com/jrpie/Launcher\">source code</a>.)
|
||||
<br/>
|
||||
|
@ -354,20 +363,23 @@
|
|||
<string name="screen_lock_method_use_accessibility">Use Accessibility Service</string>
|
||||
<string name="screen_lock_method_use_device_admin">Use Device Admin</string>
|
||||
<string name="settings_actions_lock_method">Choose method for locking the screen</string>
|
||||
<string name="dialog_rename_ok">Ok</string>
|
||||
<string name="dialog_rename_title">Rename %1$s</string>
|
||||
<string name="dialog_select_color_red">Red</string>
|
||||
<string name="dialog_select_color_alpha">Alpha</string>
|
||||
<string name="dialog_select_color_blue">Blue</string>
|
||||
<string name="dialog_select_color_green">Green</string>
|
||||
<string name="dialog_select_color_ok">Ok</string>
|
||||
<string name="dialog_select_color_color_hex">Color</string>
|
||||
<string name="dialog_choose_color_title">Choose color</string>
|
||||
<string name="dialog_consent_accessibility_privileges">I am aware that this will grant far-reaching privileges to µLauncher.</string>
|
||||
<string name="dialog_consent_accessibility_privileges">I am aware that this will grant far-reaching privileges to μLauncher.</string>
|
||||
<string name="dialog_consent_accessibility_other_options">I am aware that other options exist (using device administrator privileges or the power button).</string>
|
||||
<string name="dialog_consent_accessibility_consent">I consent to µLauncher using the accessibility service to provide functionality unrelated to accessibility.</string>
|
||||
<string name="dialog_consent_accessibility_data_collection">I consent to µLauncher not collecting any data.</string>
|
||||
<string name="dialog_consent_accessibility_text"><![CDATA[You are about to activate the accessibility service. This will grant <strong>far-reaching privileges</strong> to µLauncher.<br/>µLauncher will use these privileges <strong>only to lock the screen</strong>. µLauncher <strong>will never collect any data</strong>. In particular, µLauncher does not use the accessibility service to collect any data.]]></string>
|
||||
<string name="dialog_consent_accessibility_consent">I consent to μLauncher using the accessibility service to provide functionality unrelated to accessibility.</string>
|
||||
<string name="dialog_consent_accessibility_data_collection">I consent to μLauncher not collecting any data.</string>
|
||||
<string name="dialog_consent_accessibility_text"><![CDATA[You are about to activate the accessibility service. This will grant <strong>far-reaching privileges</strong> to μLauncher.<br/>μLauncher will use these privileges <strong>only</strong> to perform the following actions:
|
||||
<ul>
|
||||
<li>Lock Screen</li>
|
||||
<li>Recent Apps</li>
|
||||
</ul>
|
||||
μLauncher <strong>will never collect any data</strong>. In particular, μLauncher does not use the accessibility service to collect any data.]]></string>
|
||||
<string name="dialog_consent_accessibility_title">Activating the Accessibility Service</string>
|
||||
<string name="dialog_consent_accessibility_ok">Activate Accessibility Service</string>
|
||||
<string name="dialog_cancel">Cancel</string>
|
||||
|
|
|
@ -105,17 +105,6 @@
|
|||
<item name="android:fontFamily">serif</item>
|
||||
</style>
|
||||
|
||||
<style name="textColorWhite">
|
||||
<item name="android:textColor">@color/finnmglasTheme_text_color</item>
|
||||
</style>
|
||||
|
||||
<style name="textColorWhiteAndShadow">
|
||||
<item name="android:textColor">@color/finnmglasTheme_text_color</item>
|
||||
</style>
|
||||
<style name="textColorBlack">
|
||||
<item name="android:textColor">#000</item>
|
||||
</style>
|
||||
|
||||
<style name="PopupMenuCustom" parent="@android:style/Widget.PopupMenu" tools:keep="@style/PopupMenuCustom">
|
||||
<item name="android:popupBackground">#252827</item>
|
||||
</style>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
buildscript {
|
||||
ext.kotlin_version = '2.0.0'
|
||||
ext.android_plugin_version = '8.8.1'
|
||||
ext.android_plugin_version = '8.9.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
@ -10,7 +10,7 @@ buildscript {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.8.1'
|
||||
classpath 'com.android.tools.build:gradle:8.9.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath "com.android.tools.build:gradle:$android_plugin_version"
|
||||
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||
|
|
|
@ -47,3 +47,4 @@ The complete list of changes can be viewed [here](https://github.com/jrpie/launc
|
|||
|
||||
---
|
||||
[original-repo]: https://github.com/finnmglas/Launcher
|
||||
[hack-font]: https://sourcefoundry.org/hack/
|
||||
|
|
5
fastlane/metadata/android/en-US/changelogs/41.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
* Improved tutorial (thank you, wassupluke!)
|
||||
* Added Japanese translation (thank you, anmoti!)
|
||||
* Improved Chinese translation (thank you, nobody!)
|
||||
* Fixed bug where gesture navigation triggered long click
|
||||
* Fixed bug: switching from grayscale icons back to normal now works as expected
|
1
fastlane/metadata/android/en-US/changelogs/42.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fixed bug where keyboard does not open automatically
|
1
fastlane/metadata/android/en-US/changelogs/43.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fixed gesture detection in landscape orientation
|
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
|
@ -0,0 +1 @@
|
|||
気が散らない、最小限の Android ホーム画面。
|
1
fastlane/metadata/android/ja-JP/title.txt
Normal file
|
@ -0,0 +1 @@
|
|||
µLauncher
|
|
@ -19,6 +19,6 @@ android.useAndroidX=true
|
|||
android.enableJetifier=true
|
||||
# Kotlin code style for this project: "official" or "obsolete":
|
||||
kotlin.code.style=official
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
android.nonTransitiveRClass=true
|
||||
android.nonFinalResIds=true
|
||||
org.gradle.configuration-cache=true
|
||||
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|