mirror of
https://github.com/jrpie/Launcher.git
synced 2025-06-08 10:20:15 +02:00
Compare commits
7 commits
5f847a8d40
...
dd3a2e91bd
Author | SHA1 | Date | |
---|---|---|---|
dd3a2e91bd | |||
118efd0b62 | |||
3cfd403b94 | |||
bd7df4f6a0 | |||
31a9049861 | |||
![]() |
013b835ed8 | ||
![]() |
271850f75a |
15 changed files with 228 additions and 36 deletions
|
@ -23,8 +23,8 @@ android {
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 35
|
targetSdkVersion 35
|
||||||
compileSdk 35
|
compileSdk 35
|
||||||
versionCode 46
|
versionCode 47
|
||||||
versionName "0.2.1"
|
versionName "0.2.2"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import de.jrpie.android.launcher.apps.AbstractAppInfo.Companion.INVALID_USER
|
||||||
import de.jrpie.android.launcher.apps.AppInfo
|
import de.jrpie.android.launcher.apps.AppInfo
|
||||||
import de.jrpie.android.launcher.apps.DetailedAppInfo
|
import de.jrpie.android.launcher.apps.DetailedAppInfo
|
||||||
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1
|
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1
|
||||||
|
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion100
|
||||||
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2
|
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2
|
||||||
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion3
|
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion3
|
||||||
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion4
|
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion4
|
||||||
|
@ -21,12 +22,13 @@ import de.jrpie.android.launcher.widgets.DebugInfoWidget
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPanel
|
import de.jrpie.android.launcher.widgets.WidgetPanel
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPosition
|
import de.jrpie.android.launcher.widgets.WidgetPosition
|
||||||
import de.jrpie.android.launcher.widgets.deleteAllWidgets
|
import de.jrpie.android.launcher.widgets.deleteAllWidgets
|
||||||
|
import de.jrpie.android.launcher.widgets.generateInternalId
|
||||||
|
|
||||||
/* Current version of the structure of preferences.
|
/* Current version of the structure of preferences.
|
||||||
* Increase when breaking changes are introduced and write an appropriate case in
|
* Increase when breaking changes are introduced and write an appropriate case in
|
||||||
* `migratePreferencesToNewVersion`
|
* `migratePreferencesToNewVersion`
|
||||||
*/
|
*/
|
||||||
const val PREFERENCE_VERSION = 100
|
const val PREFERENCE_VERSION = 101
|
||||||
const val UNKNOWN_PREFERENCE_VERSION = -1
|
const val UNKNOWN_PREFERENCE_VERSION = -1
|
||||||
private const val TAG = "Launcher - Preferences"
|
private const val TAG = "Launcher - Preferences"
|
||||||
|
|
||||||
|
@ -65,6 +67,10 @@ fun migratePreferencesToNewVersion(context: Context) {
|
||||||
migratePreferencesFromVersion4(context)
|
migratePreferencesFromVersion4(context)
|
||||||
Log.i(TAG, "migration of preferences complete (4 -> ${PREFERENCE_VERSION}).")
|
Log.i(TAG, "migration of preferences complete (4 -> ${PREFERENCE_VERSION}).")
|
||||||
}
|
}
|
||||||
|
100 -> {
|
||||||
|
migratePreferencesFromVersion100(context)
|
||||||
|
Log.i(TAG, "migration of preferences complete (100 -> ${PREFERENCE_VERSION}).")
|
||||||
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
Log.w(
|
Log.w(
|
||||||
|
@ -91,7 +97,7 @@ fun resetPreferences(context: Context) {
|
||||||
LauncherPreferences.widgets().widgets(
|
LauncherPreferences.widgets().widgets(
|
||||||
setOf(
|
setOf(
|
||||||
ClockWidget(
|
ClockWidget(
|
||||||
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(),
|
generateInternalId(),
|
||||||
WidgetPosition(1, 3, 10, 4),
|
WidgetPosition(1, 3, 10, 4),
|
||||||
WidgetPanel.HOME.id
|
WidgetPanel.HOME.id
|
||||||
)
|
)
|
||||||
|
@ -103,7 +109,7 @@ fun resetPreferences(context: Context) {
|
||||||
LauncherPreferences.widgets().widgets().also {
|
LauncherPreferences.widgets().widgets().also {
|
||||||
it.add(
|
it.add(
|
||||||
DebugInfoWidget(
|
DebugInfoWidget(
|
||||||
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(),
|
generateInternalId(),
|
||||||
WidgetPosition(1, 1, 10, 4),
|
WidgetPosition(1, 1, 10, 4),
|
||||||
WidgetPanel.HOME.id
|
WidgetPanel.HOME.id
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package de.jrpie.android.launcher.preferences.legacy
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import de.jrpie.android.launcher.Application
|
||||||
|
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||||
|
import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
|
||||||
|
import de.jrpie.android.launcher.widgets.ClockWidget
|
||||||
|
import de.jrpie.android.launcher.widgets.DebugInfoWidget
|
||||||
|
import de.jrpie.android.launcher.widgets.generateInternalId
|
||||||
|
import de.jrpie.android.launcher.widgets.updateWidget
|
||||||
|
|
||||||
|
fun migratePreferencesFromVersion100(context: Context) {
|
||||||
|
assert(PREFERENCE_VERSION == 101)
|
||||||
|
assert(LauncherPreferences.internal().versionCode() == 100)
|
||||||
|
|
||||||
|
val widgets = LauncherPreferences.widgets().widgets() ?: setOf()
|
||||||
|
widgets.forEach { widget ->
|
||||||
|
when (widget) {
|
||||||
|
is ClockWidget -> {
|
||||||
|
val id = widget.id
|
||||||
|
val newId = generateInternalId()
|
||||||
|
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
|
||||||
|
widget.delete(context)
|
||||||
|
widget.id = newId
|
||||||
|
updateWidget(widget)
|
||||||
|
}
|
||||||
|
is DebugInfoWidget -> {
|
||||||
|
val id = widget.id
|
||||||
|
val newId = generateInternalId()
|
||||||
|
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
|
||||||
|
widget.delete(context)
|
||||||
|
widget.id = newId
|
||||||
|
updateWidget(widget)
|
||||||
|
}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LauncherPreferences.internal().versionCode(101)
|
||||||
|
}
|
|
@ -7,19 +7,20 @@ import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
|
||||||
import de.jrpie.android.launcher.widgets.ClockWidget
|
import de.jrpie.android.launcher.widgets.ClockWidget
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPanel
|
import de.jrpie.android.launcher.widgets.WidgetPanel
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPosition
|
import de.jrpie.android.launcher.widgets.WidgetPosition
|
||||||
|
import de.jrpie.android.launcher.widgets.generateInternalId
|
||||||
|
|
||||||
fun migratePreferencesFromVersion4(context: Context) {
|
fun migratePreferencesFromVersion4(context: Context) {
|
||||||
assert(PREFERENCE_VERSION == 100)
|
|
||||||
assert(LauncherPreferences.internal().versionCode() < 100)
|
assert(LauncherPreferences.internal().versionCode() < 100)
|
||||||
|
|
||||||
LauncherPreferences.widgets().widgets(
|
LauncherPreferences.widgets().widgets(
|
||||||
setOf(
|
setOf(
|
||||||
ClockWidget(
|
ClockWidget(
|
||||||
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(),
|
generateInternalId(),
|
||||||
WidgetPosition(1, 3, 10, 4),
|
WidgetPosition(1, 3, 10, 4),
|
||||||
WidgetPanel.HOME.id
|
WidgetPanel.HOME.id
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
LauncherPreferences.internal().versionCode(100)
|
LauncherPreferences.internal().versionCode(100)
|
||||||
|
migratePreferencesFromVersion100(context)
|
||||||
}
|
}
|
|
@ -122,7 +122,12 @@ class HomeActivity : UIObject, Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
(application as Application).appWidgetHost.stopListening()
|
try {
|
||||||
|
(application as Application).appWidgetHost.stopListening()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Throws a NullPointerException on Android 12 an earlier, see #172
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,12 @@ class WidgetPanelActivity : Activity(), UIObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
(application as Application).appWidgetHost.stopListening()
|
try {
|
||||||
|
(application as Application).appWidgetHost.stopListening()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Throws a NullPointerException on Android 12 an earlier, see #172
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,12 @@ class ManageWidgetsActivity : UIObject, Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
(application as Application).appWidgetHost.stopListening()
|
try {
|
||||||
|
(application as Application).appWidgetHost.stopListening()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Throws a NullPointerException on Android 12 an earlier, see #172
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,10 +135,6 @@ class ManageWidgetsActivity : UIObject, Activity() {
|
||||||
val appWidgetHost = (application as Application).appWidgetHost
|
val appWidgetHost = (application as Application).appWidgetHost
|
||||||
startActivityForResult(
|
startActivityForResult(
|
||||||
Intent(this, SelectWidgetActivity::class.java).also {
|
Intent(this, SelectWidgetActivity::class.java).also {
|
||||||
it.putExtra(
|
|
||||||
AppWidgetManager.EXTRA_APPWIDGET_ID,
|
|
||||||
appWidgetHost.allocateAppWidgetId()
|
|
||||||
)
|
|
||||||
it.putExtra(
|
it.putExtra(
|
||||||
EXTRA_PANEL_ID,
|
EXTRA_PANEL_ID,
|
||||||
panelId
|
panelId
|
||||||
|
|
|
@ -14,6 +14,7 @@ import android.widget.TextView
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import de.jrpie.android.launcher.Application
|
||||||
import de.jrpie.android.launcher.R
|
import de.jrpie.android.launcher.R
|
||||||
import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding
|
import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding
|
||||||
import de.jrpie.android.launcher.ui.UIObject
|
import de.jrpie.android.launcher.ui.UIObject
|
||||||
|
@ -24,7 +25,7 @@ import de.jrpie.android.launcher.widgets.LauncherWidgetProvider
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPanel
|
import de.jrpie.android.launcher.widgets.WidgetPanel
|
||||||
import de.jrpie.android.launcher.widgets.WidgetPosition
|
import de.jrpie.android.launcher.widgets.WidgetPosition
|
||||||
import de.jrpie.android.launcher.widgets.bindAppWidgetOrRequestPermission
|
import de.jrpie.android.launcher.widgets.bindAppWidgetOrRequestPermission
|
||||||
import de.jrpie.android.launcher.widgets.getAppWidgetHost
|
import de.jrpie.android.launcher.widgets.generateInternalId
|
||||||
import de.jrpie.android.launcher.widgets.getAppWidgetProviders
|
import de.jrpie.android.launcher.widgets.getAppWidgetProviders
|
||||||
import de.jrpie.android.launcher.widgets.updateWidget
|
import de.jrpie.android.launcher.widgets.updateWidget
|
||||||
|
|
||||||
|
@ -38,12 +39,13 @@ private const val REQUEST_WIDGET_PERMISSION = 29
|
||||||
*/
|
*/
|
||||||
class SelectWidgetActivity : AppCompatActivity(), UIObject {
|
class SelectWidgetActivity : AppCompatActivity(), UIObject {
|
||||||
lateinit var binding: ActivitySelectWidgetBinding
|
lateinit var binding: ActivitySelectWidgetBinding
|
||||||
var widgetId: Int = -1
|
|
||||||
var widgetPanelId: Int = WidgetPanel.HOME.id
|
var widgetPanelId: Int = WidgetPanel.HOME.id
|
||||||
|
|
||||||
private fun tryBindWidget(info: LauncherWidgetProvider) {
|
private fun tryBindWidget(info: LauncherWidgetProvider) {
|
||||||
when (info) {
|
when (info) {
|
||||||
is LauncherAppWidgetProvider -> {
|
is LauncherAppWidgetProvider -> {
|
||||||
|
val widgetId =
|
||||||
|
(applicationContext as Application).appWidgetHost.allocateAppWidgetId()
|
||||||
if (bindAppWidgetOrRequestPermission(
|
if (bindAppWidgetOrRequestPermission(
|
||||||
this,
|
this,
|
||||||
info.info,
|
info.info,
|
||||||
|
@ -62,7 +64,7 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is LauncherClockWidgetProvider -> {
|
is LauncherClockWidgetProvider -> {
|
||||||
updateWidget(ClockWidget(widgetId, WidgetPosition(0, 4, 12, 3), widgetPanelId))
|
updateWidget(ClockWidget(generateInternalId(), WidgetPosition(0, 4, 12, 3), widgetPanelId))
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,11 +83,7 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject {
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
|
|
||||||
widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
|
|
||||||
widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id)
|
widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id)
|
||||||
if (widgetId == -1) {
|
|
||||||
widgetId = getAppWidgetHost().allocateAppWidgetId()
|
|
||||||
}
|
|
||||||
|
|
||||||
val viewManager = LinearLayoutManager(this)
|
val viewManager = LinearLayoutManager(this)
|
||||||
val viewAdapter = SelectWidgetRecyclerAdapter()
|
val viewAdapter = SelectWidgetRecyclerAdapter()
|
||||||
|
|
|
@ -12,7 +12,7 @@ import kotlinx.serialization.Serializable
|
||||||
@Serializable
|
@Serializable
|
||||||
@SerialName("widget:clock")
|
@SerialName("widget:clock")
|
||||||
class ClockWidget(
|
class ClockWidget(
|
||||||
override val id: Int,
|
override var id: Int,
|
||||||
override var position: WidgetPosition,
|
override var position: WidgetPosition,
|
||||||
override val panelId: Int,
|
override val panelId: Int,
|
||||||
override var allowInteraction: Boolean = true
|
override var allowInteraction: Boolean = true
|
||||||
|
|
|
@ -12,7 +12,7 @@ import kotlinx.serialization.Serializable
|
||||||
@Serializable
|
@Serializable
|
||||||
@SerialName("widget:debuginfo")
|
@SerialName("widget:debuginfo")
|
||||||
class DebugInfoWidget(
|
class DebugInfoWidget(
|
||||||
override val id: Int,
|
override var id: Int,
|
||||||
override var position: WidgetPosition,
|
override var position: WidgetPosition,
|
||||||
override val panelId: Int,
|
override val panelId: Int,
|
||||||
override var allowInteraction: Boolean = true
|
override var allowInteraction: Boolean = true
|
||||||
|
|
|
@ -27,7 +27,9 @@ sealed class Widget {
|
||||||
abstract fun configure(activity: Activity, requestCode: Int)
|
abstract fun configure(activity: Activity, requestCode: Int)
|
||||||
|
|
||||||
fun delete(context: Context) {
|
fun delete(context: Context) {
|
||||||
context.getAppWidgetHost().deleteAppWidgetId(id)
|
if (id >= 0) {
|
||||||
|
context.getAppWidgetHost().deleteAppWidgetId(id)
|
||||||
|
}
|
||||||
|
|
||||||
LauncherPreferences.widgets().widgets(
|
LauncherPreferences.widgets().widgets(
|
||||||
LauncherPreferences.widgets().widgets()?.also {
|
LauncherPreferences.widgets().widgets()?.also {
|
||||||
|
|
|
@ -13,6 +13,7 @@ import android.os.UserManager
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import de.jrpie.android.launcher.Application
|
import de.jrpie.android.launcher.Application
|
||||||
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
import de.jrpie.android.launcher.preferences.LauncherPreferences
|
||||||
|
import kotlin.math.min
|
||||||
|
|
||||||
fun deleteAllWidgets(context: Context) {
|
fun deleteAllWidgets(context: Context) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
@ -29,12 +30,9 @@ fun deleteAllWidgets(context: Context) {
|
||||||
*
|
*
|
||||||
* @return true iff the app widget was bound successfully.
|
* @return true iff the app widget was bound successfully.
|
||||||
*/
|
*/
|
||||||
fun bindAppWidgetOrRequestPermission(activity: Activity, providerInfo: AppWidgetProviderInfo, id: Int, requestCode: Int? = null): Boolean {
|
fun bindAppWidgetOrRequestPermission(activity: Activity, providerInfo: AppWidgetProviderInfo, appWidgetId: Int, requestCode: Int? = null): Boolean {
|
||||||
val appWidgetId = if(id == -1) {
|
|
||||||
activity.getAppWidgetHost().allocateAppWidgetId()
|
|
||||||
} else { id }
|
|
||||||
|
|
||||||
Log.i("Launcher", "Binding new widget ${appWidgetId}")
|
Log.i("Launcher", "Binding new widget $appWidgetId")
|
||||||
if (!activity.getAppWidgetManager().bindAppWidgetIdIfAllowed(
|
if (!activity.getAppWidgetManager().bindAppWidgetIdIfAllowed(
|
||||||
appWidgetId,
|
appWidgetId,
|
||||||
providerInfo.provider
|
providerInfo.provider
|
||||||
|
@ -79,6 +77,13 @@ fun updateWidget(widget: Widget) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: this needs to be improved
|
||||||
|
fun generateInternalId(): Int {
|
||||||
|
val minId = min(-5,(LauncherPreferences.widgets().widgets() ?: setOf()).minOfOrNull { it.id } ?: 0)
|
||||||
|
return minId -1
|
||||||
|
}
|
||||||
|
|
||||||
fun updateWidgetPanel(widgetPanel: WidgetPanel) {
|
fun updateWidgetPanel(widgetPanel: WidgetPanel) {
|
||||||
LauncherPreferences.widgets().customPanels(
|
LauncherPreferences.widgets().customPanels(
|
||||||
(LauncherPreferences.widgets().customPanels() ?: setOf())
|
(LauncherPreferences.widgets().customPanels() ?: setOf())
|
||||||
|
@ -92,4 +97,4 @@ fun Context.getAppWidgetHost(): AppWidgetHost {
|
||||||
}
|
}
|
||||||
fun Context.getAppWidgetManager(): AppWidgetManager {
|
fun Context.getAppWidgetManager(): AppWidgetManager {
|
||||||
return (this.applicationContext as Application).appWidgetManager
|
return (this.applicationContext as Application).appWidgetManager
|
||||||
}
|
}
|
|
@ -302,9 +302,9 @@
|
||||||
<string name="dialog_ok">Ok</string>
|
<string name="dialog_ok">Ok</string>
|
||||||
<string name="widget_panels_title">Pannelli widget</string>
|
<string name="widget_panels_title">Pannelli widget</string>
|
||||||
<plurals name="widget_panel_number_of_widgets">
|
<plurals name="widget_panel_number_of_widgets">
|
||||||
<item quantity="one">Contiene %d widget.</item>
|
<item quantity="one">Contiene %1$d widget.</item>
|
||||||
<item quantity="many">Contiene %d widget.</item>
|
<item quantity="many">Contiene %1$d widget.</item>
|
||||||
<item quantity="other">Contiene %d widget.</item>
|
<item quantity="other">Contiene %1$d widget.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="dialog_create_widget_panel_title">Crea nuovo pannello widget</string>
|
<string name="dialog_create_widget_panel_title">Crea nuovo pannello widget</string>
|
||||||
<string name="list_other_open_widget_panel">Apri pannello widget</string>
|
<string name="list_other_open_widget_panel">Apri pannello widget</string>
|
||||||
|
|
|
@ -1,16 +1,136 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
<!--
|
||||||
|
-
|
||||||
|
- Home - Pradžia
|
||||||
|
-
|
||||||
|
-->
|
||||||
|
<string name="alert_cant_open_title">Nepavyksta paleisti programėlės</string>
|
||||||
<string name="alert_cant_open_message">Norite pakeisti nustatymus?</string>
|
<string name="alert_cant_open_message">Norite pakeisti nustatymus?</string>
|
||||||
|
|
||||||
|
<string name="toast_cant_open_message">Atidarykite nustatymus norėdami pasirinkti šio gesto veiksmą</string>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
-
|
||||||
|
- Settings
|
||||||
|
-
|
||||||
|
-->
|
||||||
<string name="settings_title">Nustatymai</string>
|
<string name="settings_title">Nustatymai</string>
|
||||||
|
|
||||||
<string name="settings_tab_actions">Veiksmai</string>
|
<string name="settings_tab_actions">Veiksmai</string>
|
||||||
<string name="settings_tab_launcher">Paleidimo programėlė</string>
|
<string name="settings_tab_launcher">Paleidimo programėlė</string>
|
||||||
<string name="settings_tab_meta">Apie</string>
|
<string name="settings_tab_meta">Apie</string>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
-
|
||||||
|
- Settings : Apps
|
||||||
|
-
|
||||||
|
-->
|
||||||
<string name="settings_gesture_back">Atgal</string>
|
<string name="settings_gesture_back">Atgal</string>
|
||||||
<string name="settings_gesture_description_back">Grįžimo mygtukas / grįžimo gestas</string>
|
<string name="settings_gesture_description_back">Grįžimo mygtukas / grįžimo gestas</string>
|
||||||
|
<string name="settings_gesture_up">Aukštyn</string>
|
||||||
<string name="settings_gesture_description_up">Perbraukimas aukštyn</string>
|
<string name="settings_gesture_description_up">Perbraukimas aukštyn</string>
|
||||||
<string name="settings_gesture_tap_up">Bakstelėkite + aukštyn</string>
|
<string name="settings_gesture_tap_up">Bakstelėkite + aukštyn</string>
|
||||||
<string name="alert_cant_open_title">Nepavyksta paleisti programėlės</string>
|
|
||||||
<string name="toast_cant_open_message">Atidarykite nustatymus norėdami pasirinkti šio gesto veiksmą</string>
|
|
||||||
<string name="settings_gesture_up">Aukštyn</string>
|
|
||||||
<string name="settings_gesture_description_tap_up">Bakstelėjimas ir perbraukimas aukštyn</string>
|
<string name="settings_gesture_description_tap_up">Bakstelėjimas ir perbraukimas aukštyn</string>
|
||||||
|
<string name="settings_gesture_double_up">Dvigubai aukštyn</string>
|
||||||
|
<string name="settings_gesture_description_double_up">Perbraukite aukštyn dviem pirštais</string>
|
||||||
|
<string name="settings_gesture_down">Žemyn</string>
|
||||||
|
<string name="settings_gesture_description_down">Perbraukite žemyn</string>
|
||||||
|
<string name="settings_gesture_tap_down">Bakstelėkite + žemyn</string>
|
||||||
|
<string name="settings_gesture_description_tap_down">Bakstelėkite ir perbraukite žemyn</string>
|
||||||
|
<string name="settings_gesture_double_down">Dvigubai žemyn</string>
|
||||||
|
<string name="settings_gesture_description_double_down">Perbraukite dviem pirštais</string>
|
||||||
|
<string name="settings_gesture_left">Kairėje</string>
|
||||||
|
<string name="settings_gesture_description_left">Perbraukite į kairę</string>
|
||||||
|
<string name="settings_gesture_tap_left">Bakstelėkite + kairę</string>
|
||||||
|
<string name="settings_gesture_description_tap_left">Bakstelėkite ir perbraukite į kairę</string>
|
||||||
|
<string name="settings_gesture_double_left">Dvigubai kairėje</string>
|
||||||
|
<string name="settings_gesture_description_double_left">Du pirštais perbraukite kairėn</string>
|
||||||
|
<string name="settings_gesture_right">Dešinė</string>
|
||||||
|
<string name="settings_gesture_description_right">Perbraukite į dešinę</string>
|
||||||
|
<string name="settings_gesture_tap_right">Bakstelėkite + dešinė</string>
|
||||||
|
<string name="settings_gesture_description_tap_right">Bakstelėkite ir perbraukite į dešinę</string>
|
||||||
|
<string name="settings_gesture_double_right">Dviguba dešinė</string>
|
||||||
|
<string name="settings_gesture_description_double_right">Perbraukite į dešinę dviem pirštais</string>
|
||||||
|
<string name="settings_gesture_right_top_edge">Dešinė (viršuje)</string>
|
||||||
|
<string name="settings_gesture_description_right_top_edge">Perbraukite tiesiai ekrano viršuje</string>
|
||||||
|
<string name="settings_gesture_right_bottom_edge">Dešinė (apačia)</string>
|
||||||
|
<string name="settings_gesture_description_right_bottom_edge">Perbraukite tiesiai ekrano apačioje</string>
|
||||||
|
<string name="settings_gesture_left_bottom_edge">Kairė (apačia)</string>
|
||||||
|
<string name="settings_gesture_description_left_bottom_edge">Perbraukite į kairę ekrano apačioje</string>
|
||||||
|
<string name="settings_gesture_left_top_edge">Kairė (viršuje)</string>
|
||||||
|
<string name="settings_gesture_description_left_top_edge">Perbraukite kairėn ekrano viršuje</string>
|
||||||
|
<string name="settings_gesture_up_left_edge">Aukštyn (kairysis kraštas)</string>
|
||||||
|
<string name="settings_gesture_description_up_left_edge">Perbraukite aukštyn kairiajame ekrano krašte</string>
|
||||||
|
<string name="settings_gesture_up_right_edge">Aukštyn (dešinysis kraštas)</string>
|
||||||
|
<string name="settings_gesture_description_up_right_edge">Perbraukite aukštyn dešiniajame ekrano krašte</string>
|
||||||
|
<string name="settings_gesture_down_left_edge">Žemyn (kairysis kraštas)</string>
|
||||||
|
<string name="settings_gesture_description_down_left_edge">Perbraukite žemyn kairiajame ekrano krašte</string>
|
||||||
|
<string name="settings_gesture_down_right_edge">Žemyn (dešinysis kraštas)</string>
|
||||||
|
<string name="settings_gesture_description_down_right_edge">Žemyn (dešinysis kraštas)</string>
|
||||||
|
|
||||||
|
<string name="settings_gesture_vol_up">Garsumo didinimo klavišas</string>
|
||||||
|
<string name="settings_gesture_description_vol_up">Paspauskite mygtuką „Volume Up“</string>
|
||||||
|
<string name="settings_gesture_vol_down">Volume žemyn klavišas</string>
|
||||||
|
<string name="settings_gesture_description_vol_down">Paspauskite mygtuką „Volume Down“</string>
|
||||||
|
<string name="settings_gesture_double_click">Dukart spustelėkite</string>
|
||||||
|
<string name="settings_gesture_description_double_click">Dukart spustelėkite tuščią sritį</string>
|
||||||
|
<string name="settings_gesture_long_click">Ilgas spustelėjimas</string>
|
||||||
|
<string name="settings_gesture_description_long_click">Ilgai spustelėkite tuščią sritį</string>
|
||||||
|
<string name="settings_gesture_date">Data</string>
|
||||||
|
<string name="settings_gesture_description_date">Spustelėkite datą</string>
|
||||||
|
<string name="settings_gesture_time">Laikas</string>
|
||||||
|
<string name="settings_gesture_description_time">Spustelėkite laiką</string>
|
||||||
|
|
||||||
|
<string name="settings_widgets_widgets">Tvarkykite valdiklius</string>
|
||||||
|
<string name="settings_widgets_custom_panels">Tvarkykite valdiklio skydelius</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="settings_apps_choose">Pasirinkite programą</string>
|
||||||
|
|
||||||
|
<string name="settings_apps_install">Įdiekite programas</string>
|
||||||
|
<string name="settings_apps_toast_store_not_found">Parduotuvėje nerasta</string>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
-
|
||||||
|
- Settings : Launcher
|
||||||
|
-
|
||||||
|
-->
|
||||||
|
<string name="settings_launcher_section_appearance">Išvaizda</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="settings_theme_color_theme">Spalvos tema</string>
|
||||||
|
<string name="settings_theme_color_theme_item_default">Numatytasis</string>
|
||||||
|
<string name="settings_theme_color_theme_item_dark">Tamsu</string>
|
||||||
|
<string name="settings_theme_color_theme_item_light">Šviesa</string>
|
||||||
|
<string name="settings_theme_color_theme_item_dynamic">Dinaminis</string>
|
||||||
|
|
||||||
|
<string name="settings_theme_text_shadow">Teksto šešėlis</string>
|
||||||
|
<string name="settings_theme_background">Fonas (programų sąrašas ir nustatymas)</string>
|
||||||
|
<string name="settings_theme_background_item_transparent">Skaidrus</string>
|
||||||
|
<string name="settings_theme_background_item_dim">Dim</string>
|
||||||
|
<string name="settings_theme_background_item_blur">Blur</string>
|
||||||
|
<string name="settings_theme_background_item_solid">Solidus</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="settings_theme_font">Šriftas</string>
|
||||||
|
|
||||||
|
<!-- names for @array/settings_theme_font_values -->
|
||||||
|
<string name="settings_theme_font_item_system_default">Sistemos numatytasis</string>
|
||||||
|
<string name="settings_theme_font_item_sans_serif">Be serifo</string>
|
||||||
|
<string name="settings_theme_font_item_serif">Serifas</string>
|
||||||
|
<string name="settings_theme_font_item_monospace">Monoerdvė</string>
|
||||||
|
<string name="settings_theme_font_item_serif_monospace">Serifo monospace</string>
|
||||||
|
<string name="settings_theme_monochrome_icons">Vienspalvių programų piktogramos</string>
|
||||||
|
|
||||||
|
<string name="settings_launcher_section_date_time"><![CDATA[Date & time]]></string>
|
||||||
|
<string name="settings_clock_color">Spalva</string>
|
||||||
|
<string name="settings_clock_time_visible">Rodyti laiką</string>
|
||||||
|
<string name="settings_clock_date_visible">Rodyti datą</string>
|
||||||
|
<string name="settings_clock_localized">Naudoti lokalizuotą datos formatą</string>
|
||||||
|
<string name="settings_clock_show_seconds">Rodyti sekundes</string>
|
||||||
|
<string name="settings_clock_flip_date_time">Apversti datą ir laiką</string>
|
||||||
|
|
||||||
|
<string name="settings_theme_wallpaper">Pasirinkite ekrano foną</string>
|
||||||
|
<string name="settings_launcher_section_display">Ekranas</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
10
fastlane/metadata/android/en-US/changelogs/47.txt
Normal file
10
fastlane/metadata/android/en-US/changelogs/47.txt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
* Fixed a bug related to widget causing crashes on Android 12 and earlier making the app unusable
|
||||||
|
* Fixed some additional bugs related to widgets
|
||||||
|
|
||||||
|
* Improved Lithuanian translation (thank you, wassupluke!)
|
||||||
|
* Improved Arabic translation (thank you, anonymous contributor!)
|
||||||
|
* Improved Chinese translation (thank you, class0068!)
|
||||||
|
* Improved Dutch translation (thank you, renar!)
|
||||||
|
* Improved German translation (thank you, renar!)
|
||||||
|
* Improved Italian translation (thank you, renar!)
|
||||||
|
* Improved Portuguese translation (thank you, anonymous contributor!)
|
Loading…
Add table
Add a link
Reference in a new issue