Compare commits

...

36 Commits

Author SHA1 Message Date
863b8f79d8 Bump the version 2020-05-20 13:46:27 +02:00
857a8009b6 Fix #137 2020-05-20 13:37:37 +02:00
9199f28ad9 Fix french translation and add a new icon pack 2020-05-20 13:34:32 +02:00
ddb1b7494a Merge pull request #135 from Moutony/patch-7
Update stings.xml (values-fr) - May 19, 2020 ver.
2020-05-20 12:19:51 +02:00
fd2b1ba976 Update strings.xml
Some translations may be oddly long. I will correct them once I see what they look like in the app.
2020-05-19 20:12:02 +02:00
90f0d7de00 Build v2.0.10 2020-05-19 20:07:08 +02:00
66ad5e0839 Fix #133 2020-05-19 20:01:11 +02:00
2ac7e072e5 Close #134 2020-05-19 19:49:21 +02:00
a3392dabcf Add a new cool icon pack 2020-05-19 19:48:33 +02:00
c2c54a04d2 Merge pull request #131 from LastInLine/patch-1
Update strings.xml
2020-05-19 10:28:33 +02:00
2c237058b3 Close #132 2020-05-19 10:27:54 +02:00
aa2b4b0510 Update strings.xml
Singular/plural switch for weather info visibility and changed awkward phrasing around time remaining until an event.
2020-05-18 21:38:56 -04:00
4c27d1dd9b Fix future events 2020-05-18 20:36:59 +02:00
eba5575ee2 Fix event not found error 2020-05-18 14:14:32 +02:00
aff7e407ca Merge pull request #127 from chreddy/patch-2
Adding Danish translation
2020-05-18 12:47:39 +02:00
f7fc31d968 Fix all day events widget date 2020-05-18 12:44:46 +02:00
90b588603d Update strings.xml
settings_general_title was a mistake indeed. This has been changed.

As for settings_second_row_info_subtitle_0, this has been translated correctly already. However I noticed that I must've overlooked next_alarm_warning previously, so I've added a translation of this as well.
2020-05-18 12:38:57 +02:00
5d9bd11abb Fix #129 2020-05-18 12:19:15 +02:00
01005ec443 Clean the project 2020-05-18 12:07:04 +02:00
eaf6400e8b Merge pull request #84 from zmni/translation
Create Indonesian translation
2020-05-18 12:05:21 +02:00
30339c7375 Merge pull request #124 from shtraus12/master
Added Russian translation (values-ru)
2020-05-18 12:00:08 +02:00
87da284be4 Update strings 2020-05-18 11:49:57 +02:00
573c6d03e5 Adding Danish translation
I re-did my previous translation, based on the newly updated string.xml.
Because of this, I've closed the previous pull request as well.
2020-05-18 00:27:53 +02:00
79e87b0648 Add files via upload 2020-05-17 16:51:41 +03:00
9e9a91690e Update Indonesian translation 2020-05-17 19:12:38 +07:00
5f699af509 Show translated in-app purchases 2020-05-17 13:25:19 +02:00
aae40b9dd3 Merge branch 'master' into translation
* master:
  Update strings
  Add settings header
  Add battery level handler
  Fix #120
2020-05-17 18:22:52 +07:00
cebd679856 Update strings 2020-05-17 13:19:55 +02:00
06443ddddb Add settings header 2020-05-16 20:24:11 +02:00
233761a169 Add battery level handler 2020-05-16 14:34:04 +02:00
b81461f725 Fix #120 2020-05-16 12:47:29 +02:00
26b1948b70 Update Indonesian translation 2020-05-14 22:49:58 +07:00
af64818dff Merge branch 'master' into translation
* master:
  Update the build version
  Update event repository
  Update the events selector. Fix #95
  Fix #113, #111, #79, #107, #109
  Add weather icon pack, updates frequency and fix google fit
  Update ui
  Update icons
  Fix dark theme toggle issue
  Bugfixes
  Update google fit integration
  Update beta release
  update gitignore
  Clean project files
  Add google fit connection
  Add google fit integration
2020-05-14 22:14:50 +07:00
f28596c194 Merge branch 'master' into translation
* master:
  Gix switcher, update glance, add glance order, add ampm toggle
  Merge crud-device
  Add dividers toggle
  Add integreations activity, removed long time until intervals
  Change music fragment to at a glance
  Update build version
  Fix #83
  Add current song
  Add clock text color
2020-05-10 04:27:13 +07:00
7f41a92a91 Update Indonesian translation 2020-05-10 04:06:26 +07:00
40c9253159 Create Indonesian translation 2020-05-08 19:04:48 +07:00
109 changed files with 1979 additions and 1170 deletions

4
.gitignore vendored
View File

@ -1,12 +1,10 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
/.idea/*
.DS_Store
/build
/captures
.externalNativeBuild
/tasksintegration/build
apikey.properties
/app/google-services.json

Binary file not shown.

View File

@ -13,6 +13,13 @@ Also, as much as possible, there are always updates and new features in the shor
Help me developing with feedback and support me on how you can.
<div style="text-align:center"><a href="https://play.google.com/store/apps/details?id=com.tommasoberlose.anotherwidget" target="_blank"><img src="google-play-badge.png" height="100" /></a></div>
Help with translations
-------
Hey! You could view the file strings.xml ([here](https://github.com/tommasoberlose/another-widget/blob/master/app/src/main/res/values/strings.xml)) that contains the English version of the app strings.
You have to copy the file, create a copy of it inside the folder values-[LANGUAGE-SUFFIX] with the translated strings and create a pull request to submit your changes.
License
-------
Copyright (C) 2017-2020 Tommaso Berlose (http://tommasoberlose.com)

View File

@ -10,10 +10,6 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'realm-android'
def apiKeyPropertiesFile = rootProject.file("apikey.properties")
def apiKeyProperties = new Properties()
apiKeyProperties.load(new FileInputStream(apiKeyPropertiesFile))
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
@ -22,12 +18,10 @@ android {
applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 23
targetSdkVersion 29
versionCode 90
versionName "2.0.9"
versionCode 100
versionName "2.0.11"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [ "AWARENESS_API_KEY": apiKeyProperties['AWARENESS_API_KEY']]
}
buildTypes {

Binary file not shown.

View File

@ -17,7 +17,6 @@
<application
android:allowBackup="true"
android:fullBackupContent="@xml/my_backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".AWApplication"
@ -25,7 +24,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="LockedOrientationActivity">
<activity android:name=".ui.activities.MainActivity" android:launchMode="singleInstance" android:theme="@style/AppTheme.Main">
<activity android:name=".ui.activities.MainActivity" android:launchMode="singleInstance" android:theme="@style/AppTheme.Main" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -116,6 +115,8 @@
<service android:name=".services.EventListenerJob" android:permission="android.permission.BIND_JOB_SERVICE" />
<service android:name=".services.BatteryListenerJob" android:permission="android.permission.BIND_JOB_SERVICE" />
<service android:name=".receivers.MusicNotificationListener"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
@ -131,6 +132,7 @@
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
<action android:name="android.intent.action.BATTERY_LOW"/>
<action android:name="android.intent.action.BATTERY_OKAY"/>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>

View File

@ -22,6 +22,12 @@ class EventRepository(val context: Context) {
}
}
fun clearEvents() {
realm.executeTransaction { realm ->
realm.where(Event::class.java).findAll().deleteAllFromRealm()
}
}
fun resetNextEventData() {
Preferences.bulk {
remove(Preferences::nextEventId)
@ -40,7 +46,22 @@ class EventRepository(val context: Context) {
fun getNextEvent(): Event? {
val nextEvent = getEventByEventId(Preferences.nextEventId)
val event = if (nextEvent != null && nextEvent.endDate > Calendar.getInstance().timeInMillis) {
val now = Calendar.getInstance().timeInMillis
val limit = Calendar.getInstance().apply {
timeInMillis = now
when (Preferences.showUntil) {
0 -> add(Calendar.HOUR, 3)
1 -> add(Calendar.HOUR, 6)
2 -> add(Calendar.HOUR, 12)
3 -> add(Calendar.DAY_OF_MONTH, 1)
4 -> add(Calendar.DAY_OF_MONTH, 3)
5 -> add(Calendar.DAY_OF_MONTH, 7)
6 -> add(Calendar.MINUTE, 30)
7 -> add(Calendar.HOUR, 1)
else -> add(Calendar.HOUR, 6)
}
}
val event = if (nextEvent != null && nextEvent.endDate > now && nextEvent.startDate < limit.timeInMillis) {
nextEvent
} else {
val events = getEvents()
@ -101,12 +122,32 @@ class EventRepository(val context: Context) {
MainWidget.updateWidget(context)
}
fun getEvents(): RealmResults<Event> {
fun getFutureEvents(): RealmResults<Event> {
val now = Calendar.getInstance().timeInMillis
realm.refresh()
return realm.where(Event::class.java).greaterThan("endDate", now).findAll()
}
private fun getEvents(): RealmResults<Event> {
val now = Calendar.getInstance().timeInMillis
val limit = Calendar.getInstance().apply {
timeInMillis = now
when (Preferences.showUntil) {
0 -> add(Calendar.HOUR, 3)
1 -> add(Calendar.HOUR, 6)
2 -> add(Calendar.HOUR, 12)
3 -> add(Calendar.DAY_OF_MONTH, 1)
4 -> add(Calendar.DAY_OF_MONTH, 3)
5 -> add(Calendar.DAY_OF_MONTH, 7)
6 -> add(Calendar.MINUTE, 30)
7 -> add(Calendar.HOUR, 1)
else -> add(Calendar.HOUR, 6)
}
}
realm.refresh()
return realm.where(Event::class.java).greaterThan("endDate", now).lessThanOrEqualTo("startDate", limit.timeInMillis).findAll()
}
fun getEventsCount(): Int = getEvents().size
fun close() {

View File

@ -31,6 +31,8 @@ object Constants {
enum class WeatherIconPack(val value: Int) {
DEFAULT(0),
MINIMAL(1)
MINIMAL(1),
COOL(2),
GOOGLE_NEWS(3)
}
}

View File

@ -91,6 +91,7 @@ object Preferences : KotprefModel() {
var showNextAlarm by booleanPref(default = true)
var showBatteryCharging by booleanPref(default = false)
var isBatteryLevelLow by booleanPref(default = false)
var isCharging by booleanPref(default = false)
var googleFitSteps by longPref(default = -1)
var showDailySteps by booleanPref(default = false)

View File

@ -0,0 +1,23 @@
package com.tommasoberlose.anotherwidget.helpers
import android.content.Context
import android.content.Context.BATTERY_SERVICE
import android.os.BatteryManager
import androidx.core.content.ContextCompat.getSystemService
import com.tommasoberlose.anotherwidget.global.Preferences
object BatteryHelper {
fun updateBatteryInfo(context: Context) {
with(context.getSystemService(BATTERY_SERVICE) as BatteryManager) {
Preferences.isBatteryLevelLow = getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) <= 15
Preferences.isCharging = isCharging
}
}
fun getBatteryLevel(context: Context): Int {
with(context.getSystemService(BATTERY_SERVICE) as BatteryManager) {
return getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}
}
}

View File

@ -37,23 +37,11 @@ object CalendarHelper {
set(Calendar.MINUTE, 0)
set(Calendar.HOUR_OF_DAY, 0)
}
val limit = Calendar.getInstance()
when (Preferences.showUntil) {
0 -> limit.add(Calendar.HOUR, 3)
1 -> limit.add(Calendar.HOUR, 6)
2 -> limit.add(Calendar.HOUR, 12)
3 -> limit.add(Calendar.DAY_OF_MONTH, 1)
4 -> limit.add(Calendar.DAY_OF_MONTH, 3)
5 -> limit.add(Calendar.DAY_OF_MONTH, 7)
6 -> limit.add(Calendar.MINUTE, 30)
7 -> limit.add(Calendar.HOUR, 1)
else -> limit.add(Calendar.HOUR, 6)
val limit = Calendar.getInstance().apply {
timeInMillis = begin.timeInMillis
add(Calendar.DAY_OF_YEAR, 2)
}
val builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(builder, begin.timeInMillis)
ContentUris.appendId(builder, limit.timeInMillis)
if (!context.checkGrantedPermission(
Manifest.permission.READ_CALENDAR
)
@ -102,6 +90,7 @@ object CalendarHelper {
if (eventList.isEmpty()) {
eventRepository.resetNextEventData()
eventRepository.clearEvents()
} else {
eventList.sortWith(Comparator { event: Event, event1: Event ->
if (event.allDay && event1.allDay) {
@ -134,6 +123,7 @@ object CalendarHelper {
MainWidget.updateWidget(context)
EventBus.getDefault().post(MainFragment.UpdateUiMessageEvent())
eventRepository.close()
}
fun getCalendarList(context: Context): List<me.everything.providers.android.calendar.Calendar> {

View File

@ -14,7 +14,6 @@ object GlanceProviderHelper {
val enabledProviders = Preferences.enabledGlanceProviderOrder.split(",").filter { it != "" }
val providers = Constants.GlanceProviderId.values()
.filter { it != Constants.GlanceProviderId.BATTERY_LEVEL_LOW }
.filter {
context.checkIfFitInstalled() || it != Constants.GlanceProviderId.GOOGLE_FIT_STEPS
}.toTypedArray()
@ -68,7 +67,7 @@ object GlanceProviderHelper {
Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> {
GlanceProvider(providerId.id,
context.getString(R.string.settings_daily_steps_title),
R.drawable.round_steps
R.drawable.round_directions_walk
)
}
}
@ -79,12 +78,16 @@ object GlanceProviderHelper {
}
fun showGlanceProviders(context: Context): Boolean {
return Preferences.showGlance && EventRepository(context).getEventsCount() == 0 && (
val eventRepository = EventRepository(context)
BatteryHelper.updateBatteryInfo(context)
val showGlance = Preferences.showGlance && eventRepository.getEventsCount() == 0 && (
(Preferences.showNextAlarm && AlarmHelper.getNextAlarm(context) != "") ||
(MediaPlayerHelper.isSomeonePlaying(context)) ||
(Preferences.isBatteryLevelLow) ||
(Preferences.showBatteryCharging && Preferences.isCharging || Preferences.isBatteryLevelLow) ||
(Preferences.customNotes.isNotEmpty()) ||
(Preferences.showDailySteps && Preferences.googleFitSteps > 0)
)
eventRepository.close()
return showGlance
}
}

View File

@ -114,6 +114,7 @@ object IntentHelper {
if (Preferences.calendarAppPackage == "") {
Intent(Intent.ACTION_VIEW).apply {
data = uri
flags = (Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_CLEAR_TOP)
if (!e.allDay) {
putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, e.startDate)
putExtra(CalendarContract.EXTRA_EVENT_END_TIME, e.endDate)
@ -182,6 +183,10 @@ object IntentHelper {
}
}
fun getBatteryIntent(): Intent {
return Intent(Intent.ACTION_POWER_USAGE_SUMMARY)
}
fun getMusicIntent(context: Context): Intent {
return when (Preferences.mediaPlayerPackage) {
"" -> {

View File

@ -86,7 +86,22 @@ object SettingsStringHelper {
return context.getString(R.string.now)
}
TimeUnit.MILLISECONDS.toHours(difference) < 12 -> {
return DateUtils.getRelativeTimeSpanString(start, now, DateUtils.HOUR_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE).toString()
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference) - 60 * TimeUnit.MILLISECONDS.toHours(difference)
return if (minutes < 1 || minutes > 30) {
DateUtils.getRelativeTimeSpanString(
start,
now - 1000 * 60 * 40,
DateUtils.HOUR_IN_MILLIS,
DateUtils.FORMAT_ABBREV_RELATIVE
).toString()
} else {
DateUtils.getRelativeTimeSpanString(
start,
now,
DateUtils.HOUR_IN_MILLIS,
DateUtils.FORMAT_ABBREV_RELATIVE
).toString()
}
}
eventDate.dayOfYear == nowDate.plusDays(1).dayOfYear -> {
return String.format("%s", context.getString(R.string.tomorrow))

View File

@ -5,7 +5,6 @@ import android.content.Context
import android.os.Build
import com.google.android.gms.location.LocationServices
import com.tommasoberlose.anotherwidget.R
import com.tommasoberlose.anotherwidget.db.EventRepository
import com.tommasoberlose.anotherwidget.global.Constants
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.network.WeatherNetworkApi
@ -48,81 +47,201 @@ object WeatherHelper {
}
fun getWeatherIconResource(icon: String): Int {
when (icon) {
return when (icon) {
"01d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.clear_day else R.drawable.clear_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.clear_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.clear_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.clear_day_4
else -> R.drawable.clear_day
}
}
"02d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.partly_cloudy else R.drawable.partly_cloudy_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.partly_cloudy_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.partly_cloudy_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.partly_cloudy_4
else -> R.drawable.partly_cloudy
}
}
"03d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.mostly_cloudy else R.drawable.mostly_cloudy_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.mostly_cloudy_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.mostly_cloudy_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.mostly_cloudy_4
else -> R.drawable.mostly_cloudy
}
}
"04d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.cloudy_weather else R.drawable.cloudy_weather_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.cloudy_weather_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.cloudy_weather_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.cloudy_weather_4
else -> R.drawable.cloudy_weather
}
}
"09d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.storm_weather_day else R.drawable.storm_weather_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.storm_weather_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.storm_weather_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.storm_weather_day_4
else -> R.drawable.storm_weather_day
}
}
"10d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rainy_day else R.drawable.rainy_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.rainy_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.rainy_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.rainy_day_4
else -> R.drawable.rainy_day
}
}
"11d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.thunder_day else R.drawable.thunder_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.thunder_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.thunder_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.thunder_day_4
else -> R.drawable.thunder_day
}
}
"13d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.snow_day else R.drawable.snow_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.snow_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.snow_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.snow_day_4
else -> R.drawable.snow_day
}
}
"50d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_day else R.drawable.haze_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.haze_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.haze_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.haze_day_4
else -> R.drawable.haze_day
}
}
"80d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.windy_day else R.drawable.windy_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.windy_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.windy_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.windy_day_4
else -> R.drawable.windy_day
}
}
"81d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rain_snow_day else R.drawable.rain_snow_day_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.rain_snow_day_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.rain_snow_day_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.rain_snow_day_4
else -> R.drawable.rain_snow_day
}
}
"82d" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_weather else R.drawable.haze_weather_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.haze_weather_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.haze_weather_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.haze_weather_4
else -> R.drawable.haze_weather
}
}
"01n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.clear_night else R.drawable.clear_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.clear_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.clear_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.clear_night_4
else -> R.drawable.clear_night
}
}
"02n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.partly_cloudy_night else R.drawable.partly_cloudy_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.partly_cloudy_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.partly_cloudy_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.partly_cloudy_night_4
else -> R.drawable.partly_cloudy_night
}
}
"03n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.mostly_cloudy_night else R.drawable.mostly_cloudy_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.mostly_cloudy_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.mostly_cloudy_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.mostly_cloudy_night_4
else -> R.drawable.mostly_cloudy_night
}
}
"04n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.cloudy_weather else R.drawable.cloudy_weather_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.cloudy_weather_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.cloudy_weather_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.cloudy_weather_4
else -> R.drawable.cloudy_weather
}
}
"09n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.storm_weather_night else R.drawable.storm_weather_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.storm_weather_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.storm_weather_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.storm_weather_night_4
else -> R.drawable.storm_weather_night
}
}
"10n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rainy_night else R.drawable.rainy_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.rainy_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.rainy_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.rainy_night_4
else -> R.drawable.rainy_night
}
}
"11n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.thunder_night else R.drawable.thunder_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.thunder_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.thunder_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.thunder_night_4
else -> R.drawable.thunder_night
}
}
"13n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.snow_night else R.drawable.snow_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.snow_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.snow_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.snow_night_4
else -> R.drawable.snow_night
}
}
"50n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_night else R.drawable.haze_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.haze_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.haze_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.haze_night_4
else -> R.drawable.haze_night
}
}
"80n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.windy_night else R.drawable.windy_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.windy_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.windy_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.windy_night_4
else -> R.drawable.windy_night
}
}
"81n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.rain_snow_night else R.drawable.rain_snow_night_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.rain_snow_night_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.rain_snow_night_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.rain_snow_night_4
else -> R.drawable.rain_snow_night
}
}
"82n" -> {
return if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) R.drawable.haze_weather else R.drawable.haze_weather_2
when (Preferences.weatherIconPack) {
Constants.WeatherIconPack.COOL.value -> R.drawable.haze_weather_3
Constants.WeatherIconPack.MINIMAL.value -> R.drawable.haze_weather_2
Constants.WeatherIconPack.GOOGLE_NEWS.value -> R.drawable.haze_weather_4
else -> R.drawable.haze_weather
}
}
else -> {
return R.drawable.unknown

View File

@ -7,12 +7,15 @@ import android.os.BatteryManager
import android.util.Log
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
import com.tommasoberlose.anotherwidget.utils.toast
class BatteryLevelReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when(intent.action) {
Intent.ACTION_BATTERY_LOW -> Preferences.isBatteryLevelLow = true
Intent.ACTION_BATTERY_OKAY -> Preferences.isBatteryLevelLow = false
Intent.ACTION_POWER_CONNECTED -> Preferences.isCharging = true
Intent.ACTION_POWER_DISCONNECTED -> Preferences.isCharging = false
}
MainWidget.updateWidget(context)
}

View File

@ -24,5 +24,6 @@ class NewCalendarEventReceiver : BroadcastReceiver() {
eventRepository.goToPreviousEvent()
}
}
eventRepository.close()
}
}

View File

@ -12,6 +12,7 @@ import com.tommasoberlose.anotherwidget.db.EventRepository
import com.tommasoberlose.anotherwidget.global.Actions
import com.tommasoberlose.anotherwidget.global.Constants
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.helpers.BatteryHelper
import com.tommasoberlose.anotherwidget.helpers.CalendarHelper
import com.tommasoberlose.anotherwidget.models.Event
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
@ -28,10 +29,12 @@ class UpdatesReceiver : BroadcastReceiver() {
Intent.ACTION_TIME_CHANGED,
Intent.ACTION_TIMEZONE_CHANGED,
Intent.ACTION_LOCALE_CHANGED,
Actions.ACTION_CALENDAR_UPDATE -> CalendarHelper.updateEventList(context)
Intent.ACTION_DATE_CHANGED,
Actions.ACTION_CALENDAR_UPDATE -> {
CalendarHelper.updateEventList(context)
}
"com.sec.android.widgetapp.APPWIDGET_RESIZE",
Intent.ACTION_DATE_CHANGED,
AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED,
Actions.ACTION_TIME_UPDATE -> {
MainWidget.updateWidget(context)
@ -50,7 +53,7 @@ class UpdatesReceiver : BroadcastReceiver() {
if (eventId == null) {
removeUpdates(context)
eventRepository.getEvents().forEach { event ->
eventRepository.getFutureEvents().forEach { event ->
setEventUpdate(context, event)
}
} else {
@ -59,6 +62,7 @@ class UpdatesReceiver : BroadcastReceiver() {
setEventUpdate(context, event)
}
}
eventRepository.close()
}
private fun setEventUpdate(context: Context, event: Event) {
@ -68,65 +72,92 @@ class UpdatesReceiver : BroadcastReceiver() {
set(Calendar.MILLISECOND, 0)
}
val diff = Period(now.timeInMillis, event.startDate)
if (event.startDate > now.timeInMillis) {
// Update the widget every hour till the event
if (diff.hours == 0) {
var minutes = 0
when (Preferences.widgetUpdateFrequency) {
Constants.WidgetUpdateFrequency.DEFAULT.value -> {
minutes = when {
diff.minutes > 50 -> 50
diff.minutes > 30 -> 30
diff.minutes > 15 -> 15
else -> 0
val limit = when (Preferences.showUntil) {
0 -> 1000 * 60 * 60 * 3
1 -> 1000 * 60 * 60 * 6
2 -> 1000 * 60 * 60 * 12
3 -> 1000 * 60 * 60 * 24
4 -> 1000 * 60 * 60 * 24 * 3
5 -> 1000 * 60 * 60 * 24 * 7
6 -> 1000 * 60 * 30
7 -> 1000 * 60 * 60
else -> 1000 * 60 * 60 * 6
}
if (event.startDate <= limit) {
if (event.startDate > now.timeInMillis) {
// Update the widget every hour till the event
if (diff.hours == 0) {
var minutes = 0
when (Preferences.widgetUpdateFrequency) {
Constants.WidgetUpdateFrequency.DEFAULT.value -> {
minutes = when {
diff.minutes > 50 -> 50
diff.minutes > 30 -> 30
diff.minutes > 15 -> 15
else -> 0
}
}
Constants.WidgetUpdateFrequency.HIGH.value -> {
minutes = diff.minutes - (diff.minutes % 5)
}
}
Constants.WidgetUpdateFrequency.HIGH.value -> {
minutes = diff.minutes - (diff.minutes % 5)
}
}
setExact(
AlarmManager.RTC,
if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000,
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
0
setExact(
AlarmManager.RTC,
if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000,
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
PendingIntent.FLAG_UPDATE_CURRENT
)
)
)
} else {
setExact(
AlarmManager.RTC,
event.startDate - diff.hours * 1000 * 60 * 60 + if (diff.minutes > 30) (-30) else (+30),
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
PendingIntent.FLAG_UPDATE_CURRENT
)
)
}
} else {
// Update the widget one second after the event is finished
val fireTime =
if (event.endDate > now.timeInMillis + 120 * 1000) event.endDate else now.timeInMillis + 120000
setExact(
AlarmManager.RTC,
event.startDate - diff.hours * 1000 * 60 * 60,
fireTime,
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
0
)
)
}
} else {
// Update the widget one second after the event is finished
val fireTime =
if (event.endDate > now.timeInMillis + 120 * 1000) event.endDate else now.timeInMillis + 120000
setExact(
AlarmManager.RTC,
fireTime,
if (event.startDate - limit > now.timeInMillis + 120 * 1000) event.startDate - limit else now.timeInMillis + 120000,
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
0
PendingIntent.FLAG_UPDATE_CURRENT
)
)
}
@ -135,9 +166,11 @@ class UpdatesReceiver : BroadcastReceiver() {
fun removeUpdates(context: Context) {
with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
EventRepository(context).getEvents().forEach {
val eventRepository = EventRepository(context)
eventRepository.getFutureEvents().forEach {
cancel(PendingIntent.getBroadcast(context, it.eventID.toInt(), Intent(context, UpdatesReceiver::class.java), 0))
}
eventRepository.close()
}
}
}

View File

@ -0,0 +1,61 @@
package com.tommasoberlose.anotherwidget.services
import android.app.job.JobInfo
import android.app.job.JobParameters
import android.app.job.JobScheduler
import android.app.job.JobService
import android.content.ComponentName
import android.content.Context
import android.os.Build
import android.provider.CalendarContract
import com.tommasoberlose.anotherwidget.helpers.CalendarHelper
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
class BatteryListenerJob : JobService() {
override fun onStartJob(params: JobParameters): Boolean {
MainWidget.updateWidget(this)
schedule(
this
)
return false
}
@Synchronized
override fun onStopJob(params: JobParameters): Boolean {
return false
}
companion object {
private const val chargingJobId = 1006
private const val notChargingJobId = 1007
fun schedule(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
remove(context)
val componentName = ComponentName(
context,
EventListenerJob::class.java
)
with(context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler) {
schedule(
JobInfo.Builder(chargingJobId, componentName)
.setRequiresCharging(true)
.setPersisted(true)
.build()
)
schedule(
JobInfo.Builder(notChargingJobId, componentName)
.setRequiresCharging(false)
.setPersisted(true)
.build()
)
}
}
}
fun remove(context: Context) {
val js = context.getSystemService(JobScheduler::class.java)
js?.cancel(chargingJobId)
js?.cancel(notChargingJobId)
}
}
}

View File

@ -76,7 +76,9 @@ class MainActivity : AppCompatActivity() {
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
controlExtras(intent)
requirePermission()
if (Preferences.showWallpaper) {
requirePermission()
}
}
override fun onBackPressed() {

View File

@ -6,6 +6,7 @@ import android.location.Address
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
@ -45,8 +46,17 @@ class SupportDevActivity : AppCompatActivity(), PurchasesUpdatedListener {
adapter = SlimAdapter.create()
adapter
.register<SkuDetails>(R.layout.inapp_product_layout) { item, injector ->
item.sku
injector
.text(R.id.product_title, item.title.replace("(Another Widget)", ""))
.with<TextView>(R.id.product_title) {
it.text = when (item.sku) {
"donation_coffee" -> getString(R.string.donation_coffee)
"donation_donuts" -> getString(R.string.donation_donuts)
"donation_breakfast" -> getString(R.string.donation_breakfast)
"donation_lunch" -> getString(R.string.donation_lunch)
else -> ""
}
}
.text(R.id.product_price, item.price)
.clicked(R.id.item) {
viewModel.purchase(this, item)

View File

@ -32,11 +32,6 @@ class WeatherProviderActivity : AppCompatActivity() {
openURI("https://home.openweathermap.org/users/sign_up")
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
last_info.text = Html.fromHtml(getString(R.string.api_key_info_all_set), Html.FROM_HTML_MODE_LEGACY)
} else {
last_info.text = Html.fromHtml(getString(R.string.api_key_info_all_set))
}
api_key.editText?.setText(Preferences.weatherProviderApi)
}
}

View File

@ -99,7 +99,7 @@ class CalendarTabFragment : Fragment() {
viewModel.calendarAllDay.observe(viewLifecycleOwner, Observer {
maintainScrollPosition {
all_day_label?.text =
if (it) getString(R.string.settings_all_day_subtitle_visible) else getString(R.string.settings_all_day_subtitle_gone)
if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
}
checkReadEventsPermission()
})
@ -215,7 +215,7 @@ class CalendarTabFragment : Fragment() {
}
dialog.addItem(
if (calendarSelectorList[index].name == calendarSelectorList[index].accountName) getString(R.string.account_events) else calendarSelectorList[index].name,
if (calendarSelectorList[index].name == calendarSelectorList[index].accountName) getString(R.string.main_calendar) else calendarSelectorList[index].name,
calendarSelectorList[index].id
)
}
@ -232,8 +232,8 @@ class CalendarTabFragment : Fragment() {
action_show_all_day.setOnClickListener {
if (Preferences.showEvents) {
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_all_day_title)).setSelectedValue(Preferences.calendarAllDay)
.addItem(getString(R.string.settings_all_day_subtitle_visible), true)
.addItem(getString(R.string.settings_all_day_subtitle_gone), false)
.addItem(getString(R.string.settings_visible), true)
.addItem(getString(R.string.settings_not_visible), false)
.addOnSelectItemListener { value ->
Preferences.calendarAllDay = value
}.show()
@ -300,7 +300,7 @@ class CalendarTabFragment : Fragment() {
action_show_until.setOnClickListener {
if (Preferences.showEvents) {
val dialog = BottomSheetMenu<Int>(requireContext(), header = getString(R.string.settings_show_until_title)).setSelectedValue(Preferences.showUntil)
intArrayOf(6,7,0,1,2,3).forEach {
intArrayOf(6,7,0,1,2,3, 4, 5).forEach {
dialog.addItem(getString(SettingsStringHelper.getShowUntilString(it)), it)
}
dialog.addOnSelectItemListener { value ->

View File

@ -251,24 +251,22 @@ class GeneralTabFragment : Fragment() {
}
action_date_format.setOnClickListener {
if (Preferences.showEvents) {
val now = Calendar.getInstance()
val dialog = BottomSheetMenu<String>(requireContext(), header = getString(R.string.settings_date_format_title)).setSelectedValue(Preferences.dateFormat)
val now = Calendar.getInstance()
val dialog = BottomSheetMenu<String>(requireContext(), header = getString(R.string.settings_date_format_title)).setSelectedValue(Preferences.dateFormat)
dialog.addItem(DateHelper.getDefaultDateText(requireContext(), now), "")
if (Preferences.dateFormat != "") {
dialog.addItem(DateHelper.getDateText(requireContext(), now), Preferences.dateFormat)
}
dialog.addItem(getString(R.string.custom_date_format), "-")
dialog.addOnSelectItemListener { value ->
if (value == "-") {
startActivity(Intent(requireContext(), CustomDateActivity::class.java))
} else {
Preferences.dateFormat = value
}
}.show()
dialog.addItem(DateHelper.getDefaultDateText(requireContext(), now), "")
if (Preferences.dateFormat != "") {
dialog.addItem(DateHelper.getDateText(requireContext(), now), Preferences.dateFormat)
}
dialog.addItem(getString(R.string.custom_date_format), "-")
dialog.addOnSelectItemListener { value ->
if (value == "-") {
startActivity(Intent(requireContext(), CustomDateActivity::class.java))
} else {
Preferences.dateFormat = value
}
}.show()
}
action_background_color.setOnClickListener {
@ -321,7 +319,7 @@ class GeneralTabFragment : Fragment() {
}
action_show_dividers.setOnClickListener {
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_show_multiple_events_title)).setSelectedValue(Preferences.showDividers)
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_show_dividers_title)).setSelectedValue(Preferences.showDividers)
.addItem(getString(R.string.settings_visible), true)
.addItem(getString(R.string.settings_not_visible), false)
.addOnSelectItemListener { value ->

View File

@ -44,6 +44,7 @@ import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
import com.tommasoberlose.anotherwidget.utils.checkIfFitInstalled
import com.tommasoberlose.anotherwidget.utils.toast
import kotlinx.android.synthetic.main.fragment_calendar_settings.*
import kotlinx.android.synthetic.main.fragment_glance_settings.*
import kotlinx.android.synthetic.main.fragment_glance_settings.scrollView
@ -97,6 +98,7 @@ class GlanceTabFragment : Fragment() {
viewModel.showGlance.observe(viewLifecycleOwner, Observer {
maintainScrollPosition {
binding.isGlanceVisible = it
show_glance_label.text = if (it) getString(R.string.description_show_glance_visible) else getString(R.string.description_show_glance_not_visible)
}
})
@ -176,6 +178,22 @@ class GlanceTabFragment : Fragment() {
}
}
action_show_next_alarm.setOnLongClickListener {
with(requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
val alarm = nextAlarmClock
if (alarm != null && alarm.showIntent != null) {
val pm = requireContext().packageManager as PackageManager
val appNameOrPackage = try {
pm.getApplicationLabel(pm.getApplicationInfo(alarm.showIntent?.creatorPackage ?: "", 0))
} catch (e: Exception) {
alarm.showIntent?.creatorPackage ?: ""
}
activity?.toast(getString(R.string.next_alarm_warning).format(appNameOrPackage), long = true)
}
}
true
}
action_show_low_battery_level_warning.setOnClickListener {
if (Preferences.showGlance) {
BottomSheetMenu<Boolean>(
@ -231,8 +249,7 @@ class GlanceTabFragment : Fragment() {
} catch (e: Exception) {
alarm.showIntent?.creatorPackage ?: ""
}
show_next_alarm_warning.text =
getString(R.string.next_alarm_warning).format(appNameOrPackage)
show_next_alarm_warning.text = getString(R.string.next_alarm_warning).format(appNameOrPackage)
} else {
show_next_alarm_label?.text = if (Preferences.showNextAlarm) getString(R.string.settings_visible) else getString(
R.string.settings_not_visible)

View File

@ -36,6 +36,7 @@ import com.tommasoberlose.anotherwidget.helpers.BitmapHelper
import com.tommasoberlose.anotherwidget.helpers.ColorHelper
import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
import com.tommasoberlose.anotherwidget.ui.activities.SupportDevActivity
import com.tommasoberlose.anotherwidget.ui.adapters.ViewPagerAdapter
import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
@ -145,7 +146,7 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
ColorHelper.getBackgroundColor()
)
)
uiJob = viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
uiJob = lifecycleScope.launch(Dispatchers.IO) {
val generatedView = MainWidget.generateWidgetView(requireContext())
withContext(Dispatchers.Main) {
@ -186,7 +187,7 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
clock_bottom_margin_large?.isVisible =
Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value
if ((Preferences.showClock && time_container?.isVisible == false) || (!Preferences.showClock && time_container?.isVisible == true)) {
if ((Preferences.showClock && (time?.alpha ?: 1f < 1f)) || (!Preferences.showClock && (time?.alpha ?: 0f > 0f))) {
if (Preferences.showClock) {
time_container?.layoutParams = time_container.layoutParams.apply {
height = RelativeLayout.LayoutParams.WRAP_CONTENT
@ -230,10 +231,12 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
).apply {
duration = 500L
addUpdateListener {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview.layoutParams = layoutParams
if (preview != null) {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview.layoutParams = layoutParams
}
}
}.start()
}
@ -253,10 +256,12 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
).apply {
duration = 300L
addUpdateListener {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview?.layoutParams = layoutParams
if (preview != null) {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview?.layoutParams = layoutParams
}
}
}.start()
}
@ -278,10 +283,12 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
).apply {
duration = 300L
addUpdateListener {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview.layoutParams = layoutParams
if (preview != null) {
val animatedValue = animatedValue as Int
val layoutParams = preview.layoutParams
layoutParams.height = animatedValue
preview.layoutParams = layoutParams
}
}
}.start()
}

View File

@ -10,6 +10,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.os.BuildCompat
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
@ -28,7 +29,9 @@ import com.tommasoberlose.anotherwidget.databinding.FragmentWeatherSettingsBindi
import com.tommasoberlose.anotherwidget.global.Constants
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.global.RequestCode
import com.tommasoberlose.anotherwidget.helpers.ColorHelper
import com.tommasoberlose.anotherwidget.helpers.SettingsStringHelper
import com.tommasoberlose.anotherwidget.helpers.WeatherHelper
import com.tommasoberlose.anotherwidget.receivers.WeatherReceiver
import com.tommasoberlose.anotherwidget.ui.activities.ChooseApplicationActivity
import com.tommasoberlose.anotherwidget.ui.activities.CustomLocationActivity
@ -129,9 +132,12 @@ class WeatherTabFragment : Fragment() {
viewModel.weatherIconPack.observe(viewLifecycleOwner, Observer {
maintainScrollPosition {
label_weather_icon_pack?.text = when (it) {
Constants.WeatherIconPack.MINIMAL.value -> getString(R.string.settings_weather_icon_pack_minimal)
else -> getString(R.string.settings_weather_icon_pack_default)
label_weather_icon_pack?.text = getString(R.string.settings_weather_icon_pack_default).format((it + 1))
weather_icon_pack.setImageDrawable(ContextCompat.getDrawable(requireContext(), WeatherHelper.getWeatherIconResource("01d")))
if (it == Constants.WeatherIconPack.MINIMAL.value) {
weather_icon_pack.setColorFilter(ContextCompat.getColor(requireContext(), R.color.colorPrimaryText))
} else {
weather_icon_pack.setColorFilter(ContextCompat.getColor(requireContext(), android.R.color.transparent))
}
}
checkLocationPermission()
@ -230,12 +236,13 @@ class WeatherTabFragment : Fragment() {
action_weather_icon_pack.setOnClickListener {
if (Preferences.showWeather) {
BottomSheetMenu<Int>(requireContext(), header = getString(R.string.settings_weather_icon_pack_title)).setSelectedValue(Preferences.weatherIconPack)
.addItem(getString(R.string.settings_weather_icon_pack_default), Constants.WeatherIconPack.DEFAULT.value)
.addItem(getString(R.string.settings_weather_icon_pack_minimal), Constants.WeatherIconPack.MINIMAL.value)
.addOnSelectItemListener { value ->
Preferences.weatherIconPack = value
}.show()
val dialog = BottomSheetMenu<Int>(requireContext(), header = getString(R.string.settings_weather_icon_pack_title)).setSelectedValue(Preferences.weatherIconPack)
Constants.WeatherIconPack.values().forEach {
dialog.addItem(getString(R.string.settings_weather_icon_pack_default).format(it.value + 1), it.value)
}
dialog.addOnSelectItemListener { value ->
Preferences.weatherIconPack = value
}.show()
}
}

View File

@ -36,6 +36,7 @@ import java.text.DateFormat
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.math.min
import kotlin.math.roundToInt
class MainWidget : AppWidgetProvider() {
@ -111,7 +112,7 @@ class MainWidget : AppWidgetProvider() {
context,
appWidgetId,
IntentHelper.getWidgetUpdateIntent(context),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.widget_shape_background, refreshIntent)
} catch (ex: Exception) {
@ -140,9 +141,8 @@ class MainWidget : AppWidgetProvider() {
}
private fun updateCalendarView(context: Context, v: View, views: RemoteViews, widgetID: Int): RemoteViews {
val eventRepository = EventRepository(context)
try {
val eventRepository = EventRepository(context)
views.setImageViewBitmap(
R.id.empty_date_rect,
BitmapHelper.getBitmapFromView(v.empty_date, draw = false)
@ -157,7 +157,7 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getCalendarIntent(context),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.empty_date_rect, calPIntent)
@ -180,7 +180,7 @@ class MainWidget : AppWidgetProvider() {
context,
NewCalendarEventReceiver::class.java
).apply { action = Actions.ACTION_GO_TO_NEXT_EVENT },
0
PendingIntent.FLAG_UPDATE_CURRENT
)
)
@ -198,7 +198,7 @@ class MainWidget : AppWidgetProvider() {
context,
NewCalendarEventReceiver::class.java
).apply { action = Actions.ACTION_GO_TO_PREVIOUS_EVENT },
0
PendingIntent.FLAG_UPDATE_CURRENT
)
)
} else {
@ -210,7 +210,7 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getEventIntent(context, nextEvent),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.next_event_rect, pIntent)
views.setOnClickPendingIntent(R.id.next_event_difference_time_rect, pIntent)
@ -233,7 +233,7 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getGoogleMapsIntentFromAddress(context, nextEvent.address),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, mapIntent)
} else {
@ -245,7 +245,7 @@ class MainWidget : AppWidgetProvider() {
nextEvent,
forceEventDetails = true
),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, pIntentDetail)
}
@ -263,7 +263,7 @@ class MainWidget : AppWidgetProvider() {
views.setViewVisibility(R.id.empty_layout_rect, View.GONE)
views.setViewVisibility(R.id.calendar_layout_rect, View.VISIBLE)
} else if (GlanceProviderHelper.showGlanceProviders(context)) {
} else if (GlanceProviderHelper.showGlanceProviders(context) && v.calendar_layout.isVisible) {
loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders(context)) {
when (provider) {
Constants.GlanceProviderId.PLAYING_SONG -> {
@ -272,7 +272,7 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getMusicIntent(context),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, musicIntent)
break@loop
@ -284,22 +284,25 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getClockIntent(context),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, alarmIntent)
break@loop
}
}
Constants.GlanceProviderId.BATTERY_LEVEL_LOW -> {
if (Preferences.isBatteryLevelLow) {
val alarmIntent = PendingIntent.getActivity(
context,
widgetID,
IntentHelper.getClockIntent(context),
0
)
views.setOnClickPendingIntent(R.id.second_row_rect, alarmIntent)
break@loop
if (Preferences.showBatteryCharging) {
BatteryHelper.updateBatteryInfo(context)
if (Preferences.isCharging || Preferences.isBatteryLevelLow) {
val batteryIntent = PendingIntent.getActivity(
context,
widgetID,
IntentHelper.getBatteryIntent(),
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, batteryIntent)
break@loop
}
}
}
Constants.GlanceProviderId.CUSTOM_INFO -> {
@ -313,7 +316,7 @@ class MainWidget : AppWidgetProvider() {
context,
widgetID,
IntentHelper.getFitIntent(context),
0
PendingIntent.FLAG_UPDATE_CURRENT
)
views.setOnClickPendingIntent(R.id.second_row_rect, fitIntent)
break@loop
@ -340,6 +343,8 @@ class MainWidget : AppWidgetProvider() {
} catch (ex: Exception) {
ex.printStackTrace()
CrashlyticsReceiver.sendCrash(context, ex)
} finally {
eventRepository.close()
}
return views
@ -525,7 +530,7 @@ class MainWidget : AppWidgetProvider() {
} else {
val flags: Int = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NO_YEAR or DateUtils.FORMAT_ABBREV_MONTH
v.next_event_date.text = DateUtils.formatDateTime(context, now.timeInMillis, flags)
v.next_event_date.text = DateUtils.formatDateTime(context, nextEvent.startDate, flags)
}
}
@ -533,6 +538,7 @@ class MainWidget : AppWidgetProvider() {
v.calendar_layout.visibility = View.VISIBLE
} else if (GlanceProviderHelper.showGlanceProviders(context)) {
v.second_row_icon.isVisible = true
var showSomething = false
loop@ for (provider:Constants.GlanceProviderId in GlanceProviderHelper.getGlanceProviders(context)) {
when (provider) {
Constants.GlanceProviderId.PLAYING_SONG -> {
@ -544,6 +550,7 @@ class MainWidget : AppWidgetProvider() {
)
)
v.next_event_date.text = MediaPlayerHelper.getMediaInfo()
showSomething = true
break@loop
}
}
@ -556,47 +563,60 @@ class MainWidget : AppWidgetProvider() {
)
)
v.next_event_date.text = AlarmHelper.getNextAlarm(context)
showSomething = true
break@loop
}
}
Constants.GlanceProviderId.BATTERY_LEVEL_LOW -> {
if (Preferences.isBatteryLevelLow) {
v.second_row_icon.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.round_battery_charging_full
)
)
v.next_event_date.text = context.getString(R.string.battery_low_warning)
break@loop
if (Preferences.showBatteryCharging) {
BatteryHelper.updateBatteryInfo(context)
if (Preferences.isCharging) {
v.second_row_icon.isVisible = false
val batteryLevel = BatteryHelper.getBatteryLevel(context)
if (batteryLevel == 100) {
v.next_event_date.text = "%s - %d%%".format(context.getString(R.string.charging), batteryLevel)
} else {
v.next_event_date.text = context.getString(R.string.charging)
}
showSomething = true
break@loop
} else if (Preferences.isBatteryLevelLow) {
v.second_row_icon.isVisible = false
v.next_event_date.text =
context.getString(R.string.battery_low_warning)
showSomething = true
break@loop
}
}
}
Constants.GlanceProviderId.CUSTOM_INFO -> {
if (Preferences.customNotes.isNotEmpty()) {
v.second_row_icon.isVisible = false
v.next_event_date.text = Preferences.customNotes
v.next_event_date.gravity
v.next_event_date.maxLines = 2
showSomething = true
break@loop
}
}
Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> {
if (Preferences.showDailySteps && Preferences.googleFitSteps > 0) {
v.second_row_icon.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.round_steps
)
)
v.second_row_icon.isVisible = false
v.next_event_date.text = context.getString(R.string.daily_steps_counter).format(Preferences.googleFitSteps)
showSomething = true
break@loop
}
}
}
}
v.next_event.text = DateHelper.getDateText(context, now)
v.empty_layout.visibility = View.GONE
v.calendar_layout.visibility = View.VISIBLE
if (showSomething) {
v.next_event.text = DateHelper.getDateText(context, now)
v.empty_layout.visibility = View.GONE
v.calendar_layout.visibility = View.VISIBLE
} else {
v.second_row_icon.isVisible = false
}
}
@ -605,7 +625,7 @@ class MainWidget : AppWidgetProvider() {
it.setTextColor(ColorHelper.getFontColor())
}
if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) {
if (Preferences.weatherIconPack != Constants.WeatherIconPack.MINIMAL.value) {
listOf<ImageView>(v.action_next, v.action_previous)
} else {
listOf<ImageView>(v.action_next, v.action_previous, v.empty_weather_icon, v.special_weather_icon)
@ -617,7 +637,7 @@ class MainWidget : AppWidgetProvider() {
it.setTextColor(ColorHelper.getSecondaryFontColor())
}
if (Preferences.weatherIconPack == Constants.WeatherIconPack.DEFAULT.value) {
if (Preferences.weatherIconPack != Constants.WeatherIconPack.MINIMAL.value) {
listOf<ImageView>(v.second_row_icon)
} else {
listOf<ImageView>(v.second_row_icon, v.weather_icon)
@ -698,7 +718,7 @@ class MainWidget : AppWidgetProvider() {
v.weather.visibility = View.VISIBLE
v.calendar_weather.visibility = View.VISIBLE
v.special_weather.visibility = View.VISIBLE
val currentTemp = String.format(Locale.getDefault(), "%.0f °%s", Preferences.weatherTemp, Preferences.weatherRealTempUnit)
val currentTemp = String.format(Locale.getDefault(), "%d °%s", Preferences.weatherTemp.roundToInt(), Preferences.weatherRealTempUnit)
val icon: String = Preferences.weatherIcon
if (icon == "") {
@ -734,6 +754,8 @@ class MainWidget : AppWidgetProvider() {
it.isVisible = Preferences.showDividers
}
eventRepository.close()
return v
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -155,7 +155,7 @@
android:textSize="16sp"
android:gravity="start"
android:textAlignment="viewStart"
android:id="@+id/last_info"/>
android:text="@string/api_key_info_all_set"/>
<com.google.android.material.button.MaterialButton
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -15,7 +15,7 @@
android:paddingBottom="8dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:textSize="16sp"
android:textSize="18sp"
android:gravity="start"
android:textAlignment="viewStart"
android:id="@+id/header_text"

View File

@ -89,6 +89,18 @@
android:id="@+id/calendar_settings"
android:alpha="@{isCalendarEnabled ? 1f : 0.2f, default=1}"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/filters_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -237,6 +249,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/event_detail_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -348,6 +372,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/actions_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -95,7 +95,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_clock_label"
android:text="@string/description_show_clock"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
@ -112,6 +111,18 @@
android:id="@+id/clock_settings"
android:alpha="@{isClockVisible ? 1f : 0.2f, default=1}"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/clock_text_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -186,6 +197,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/appearance_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -261,6 +284,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/actions_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -298,27 +333,27 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/small_clock_warning"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingBottom="32dp"
android:duplicateParentState="true"
android:textSize="14sp"
android:text="@string/clock_warning"
android:textColor="@color/colorPrimaryText"
android:letterSpacing="0"
android:fontFamily="@font/product_sans"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:textAllCaps="false" />
android:id="@+id/small_clock_warning"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingBottom="32dp"
android:duplicateParentState="true"
android:textSize="14sp"
android:text="@string/clock_warning"
android:textColor="@color/colorPrimaryText"
android:letterSpacing="0"
android:fontFamily="@font/product_sans"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:textAllCaps="false" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@ -18,6 +18,18 @@
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/first_row_header"
android:paddingTop="16dp"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -92,6 +104,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/second_row_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -166,6 +190,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/global_style_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -203,43 +239,6 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_date_format"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:src="@drawable/round_text_format"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_date_format_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_format_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -288,33 +287,30 @@
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_background_color"
android:id="@+id/action_date_format"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/round_aspect_ratio"
android:padding="10dp"
android:src="@drawable/round_text_format"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="8dp"
android:paddingRight="8dp">
android:paddingRight="8dp"
android:orientation="vertical">
<TextView
style="@style/AnotherWidget.Settings.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_background_color_title" />
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_date_format_title"/>
<TextView
android:id="@+id/background_color_label"
style="@style/AnotherWidget.Settings.Subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:id="@+id/date_format_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
@ -355,6 +351,46 @@
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_background_color"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/round_aspect_ratio"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<TextView
style="@style/AnotherWidget.Settings.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_background_color_title" />
<TextView
android:id="@+id/background_color_label"
style="@style/AnotherWidget.Settings.Subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</layout>

View File

@ -38,8 +38,8 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="11dp"
android:src="@drawable/round_widgets"
android:padding="12dp"
android:src="@drawable/round_hourglass_empty"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="0dp"
@ -56,8 +56,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_clock_label"
android:text="@string/description_show_glance"
android:id="@+id/show_glance_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
@ -74,6 +73,18 @@
android:id="@+id/calendar_settings"
android:alpha="@{isGlanceVisible ? 1f : 0.2f, default=1}"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/providers"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -90,7 +101,7 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:padding="11dp"
android:src="@drawable/round_music_note"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
@ -143,7 +154,7 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="11dp"
android:padding="12dp"
android:src="@drawable/round_alarm"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
@ -188,8 +199,8 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:src="@drawable/round_steps"
android:padding="11dp"
android:src="@drawable/round_directions_walk"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
@ -234,7 +245,6 @@
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:visibility="gone"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_show_low_battery_level_warning"
@ -279,7 +289,7 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:padding="12dp"
android:src="@drawable/round_notes"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
@ -300,6 +310,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/preferences_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -316,7 +338,7 @@
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:padding="12dp"
android:src="@drawable/round_flip_to_front"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
@ -337,6 +359,27 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/small_clock_warning"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingBottom="32dp"
android:duplicateParentState="true"
android:textSize="14sp"
android:text="@string/glance_info"
android:textColor="@color/colorPrimaryText"
android:letterSpacing="0"
android:fontFamily="@font/product_sans"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:textAllCaps="false" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@ -112,6 +112,18 @@
android:id="@+id/weather_settings"
android:alpha="@{isWeatherVisible ? 1f : 0.2f, default=1}"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/provider_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -212,43 +224,6 @@
android:text="@string/action_grant_permission"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_change_unit"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:src="@drawable/round_text_format"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_unit_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/temp_unit"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -286,6 +261,55 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_change_unit"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="10dp"
android:src="@drawable/round_text_format"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_unit_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/temp_unit"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/appearance_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -303,6 +327,7 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:id="@+id/weather_icon_pack"
android:src="@drawable/round_cloud_queue"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
@ -323,6 +348,18 @@
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:text="@string/actions_header"
android:textAlignment="viewStart"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:textAppearance="@style/AnotherWidget.Settings.Header"
app:textAllCaps="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -19,7 +19,7 @@
android:paddingBottom="8dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:textSize="16sp"
android:textSize="18sp"
android:gravity="start"
android:textAlignment="viewStart"
android:id="@+id/header_text"

View File

@ -123,7 +123,7 @@
android:layout_height="20dp"
android:id="@+id/special_weather_icon"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"/>
android:layout_marginEnd="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -183,6 +183,8 @@
android:layout_width="18dp"
android:layout_height="18dp"
android:id="@+id/weather_icon"
android:layout_marginEnd="4dp"
android:layout_marginStart="4dp"
android:src="@drawable/clear_night"/>
<TextView
android:layout_width="wrap_content"

View File

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Another Widget</string>
<string name="add_widget">Add</string>
<!-- Display -->
<string name="settings_general_title">Visning</string>
<string name="divider" translatable="false">|</string>
<string name="settings_font_color_title">Tekstfarve</string>
<string name="settings_secondary_font_color_title">Tekstfarve</string>
<string name="settings_background_color_title">Baggrundsfarve</string>
<string name="title_main_text_size">Tekststørrelse</string>
<string name="title_second_text_size">Tekststørrelse</string>
<string name="title_text_shadow">Tekstskygge</string>
<string name="settings_text_shadow_subtitle_none">Ingen</string>
<string name="settings_text_shadow_subtitle_low">Lav</string>
<string name="settings_text_shadow_subtitle_high">Høj</string>
<string name="settings_custom_font_title">Widget skrifttype</string>
<string name="custom_font_subtitle_0">Enhedsskrifttype</string>
<string name="custom_font_subtitle_1">Product Sans</string>
<string name="custom_date_format">Tilpasset datoformat</string>
<string name="alpha">Alpha</string>
<string name="transparent">Gennemsigtig</string>
<string name="settings_show_dividers_title">Vis tekstdelere</string>
<string name="first_row_header">Første række</string>
<string name="second_row_header">Anden række</string>
<string name="global_style_header">Widget</string>
<string name="action_capitalize_the_date">Skift mellem stort og småt begyndelsesbogstav</string>
<string name="settings_date_format_title">Datoformat</string>
<!-- Calendar -->
<string name="settings_calendar_title">Kalender</string>
<string name="title_permission_calendar">Vis dine begivenheder</string>
<string name="description_permission_calendar">Giv tilladelse til at din kalender\n kan vise begivenheder i din widget.</string>
<string name="settings_filter_calendar_title">Filtrer begivenheder</string>
<string name="settings_filter_calendar_subtitle">Ændr kalenderens synlighed</string>
<string name="settings_all_day_title">Heldagsbegivenheder</string>
<string name="main_calendar">Kontokalender</string>
<string name="calendar_settings_list_error">Fejl ved indlæsning af kalenderlisten</string>
<string name="all_day">Heldagsbegivenhed</string>
<string name="show_events_visible">Begivenheder er synlige</string>
<string name="show_events_not_visible">Begivenheder er skjulte</string>
<string name="settings_show_until_subtitle_6">30 minutter senere</string>
<string name="settings_show_until_subtitle_7">1 time senere</string>
<string name="settings_show_until_subtitle_0">3 timer senere</string>
<string name="settings_show_until_subtitle_1">6 timer senere</string>
<string name="settings_show_until_subtitle_2">12 timer senere</string>
<string name="settings_show_until_subtitle_3">24 timer senere</string>
<string name="settings_show_until_subtitle_4">3 dage senere</string>
<string name="settings_show_until_subtitle_5">7 dage senere</string>
<string name="settings_show_until_title">Vis begivenheder mindst</string>
<string name="day_char">d</string>
<string name="settings_calendar_app_title">Standard app til kalender</string>
<string name="error_no_calendar">Ingen kalendere fundet.</string>
<string name="tomorrow">i morgen</string>
<string name="today">i dag</string>
<string name="settings_event_app_title">Tryk på begivenhed åbner</string>
<string name="settings_second_row_info_title">Begivenhedsinformationer</string>
<string name="settings_second_row_info_subtitle_1">Adresse på begivenhed</string>
<string name="settings_second_row_info_subtitle_0">Begivenhedstid</string>
<string name="settings_show_diff_time_title">Tid tilbage til begivenheds start</string>
<string name="settings_show_declined_events_title">Afviste begivenheder</string>
<string name="default_event_app">Begivenhedsdetaljer</string>
<string name="default_calendar_app">Standard kalender app</string>
<string name="settings_show_multiple_events_title">Skift mellem flere begivenheder</string>
<string name="soon">snart</string>
<string name="now">nu</string>
<string name="settings_widget_update_frequency_title">Opdateringsfrekvens på resterende tid</string>
<string name="settings_widget_update_frequency_subtitle">Høj frekvens forårsager højere batteriforbrug</string>
<string name="settings_widget_update_frequency_low">Lav</string>
<string name="settings_widget_update_frequency_default">Standard</string>
<string name="settings_widget_update_frequency_high">Høj</string>
<string name="filters_header">Filtre</string>
<string name="event_detail_header">Begivenhedsdetaljer</string>
<!-- Weather -->
<string name="settings_weather_title">Vejr</string>
<string name="title_permission_location">Vis vejret</string>
<string name="description_permission_location">Giv tilladelse til din lokation\nfor at se vejret i din widget.</string>
<string name="settings_unit_title">Måleenhed</string>
<string name="fahrenheit" translatable="false">°F - Fahrenheit</string>
<string name="celsius" translatable="false">°C - Celsius</string>
<string name="settings_weather_refresh_period_title">Opdateringsfrekvens</string>
<string name="settings_weather_refresh_period_subtitle_0">30 minutter</string>
<string name="settings_weather_refresh_period_subtitle_1">1 time</string>
<string name="settings_weather_refresh_period_subtitle_2">3 timer</string>
<string name="settings_weather_refresh_period_subtitle_3">6 timer</string>
<string name="settings_weather_refresh_period_subtitle_4">12 timer</string>
<string name="settings_weather_refresh_period_subtitle_5">24 timer</string>
<string name="settings_custom_location_title">Lokation</string>
<string name="custom_location_gps">Brug geolocation</string>
<string name="show_weather_visible">Vejrinfo er synlig</string>
<string name="show_weather_not_visible">Vejrinfo er skjult</string>
<string name="settings_weather_app_title">Tryk på vejret åbner</string>
<string name="settings_weather_provider_api_key_title">Vejr API nøgle</string>
<string name="settings_weather_provider_api_key_subtitle_all_set">Vejrudbyderen er konfigureret korrekt</string>
<string name="settings_weather_provider_api_key_subtitle_not_set">Vejrudbyderen skal konfigureres</string>
<string name="api_key_hint">OpenWeather API nøgle</string>
<string name="default_weather_app">Google Weather</string>
<string name="weather_warning">Vejr fra Google Awareness er forældet. Der kræves nu en OpenWeather API nøgle for at vise vejret i widget\'en.</string>
<string name="api_key_title_1">Opret en OpenWeather konto</string>
<string name="api_key_subtitle_1">Opret en gratis konto hos OpenWeather. Det vil kun tage få minutter.</string>
<string name="api_key_title_2">Kopier din API nøgle</string>
<string name="api_key_subtitle_2">Find menuen API keys i dine kontoindstillinger, og kopier standardnøglen.</string>
<string name="api_key_title_3">Indtast nøglen i app\'en</string>
<string name="api_key_subtitle_3">Indsæt nøglen i feltet ovenfor og gem ændringen. Så snart nøglen er aktiveret, vil vejret blive synligt.</string>
<string name="action_open_provider">Gå til OpenWeatherMap.com</string>
<string name="api_key_info_all_set">Der kan gå op til 10 minutter inden din API nøgle er aktiveret. Vejret vil blive opdateret så snart det er tilgængeligt.</string>
<string name="settings_weather_icon_pack_title">Ikonpakke</string>
<string name="settings_weather_icon_pack_default">Ikonpakke %d</string>
<!-- Clock -->
<string name="settings_clock_title">Ur</string>
<string name="settings_clock_app_title">Tryk på ur åbner</string>
<string name="title_show_clock">Vis uret</string>
<string name="show_clock_visible">Uret vises</string>
<string name="show_clock_not_visible">Uret er skjult</string>
<string name="settings_clock_text_size_title">Tekststørrelse</string>
<string name="default_clock_app">Standard ur app</string>
<string name="settings_clock_bottom_margin_title">Nedre margen på ur</string>
<string name="settings_clock_bottom_margin_subtitle_none">Ingen</string>
<string name="settings_clock_bottom_margin_subtitle_small">Lille</string>
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
<string name="settings_clock_bottom_margin_subtitle_large">Stor</string>
<string name="clock_warning">Grundet teknologiske begrænsninger har uret ikke den tilpassede skrifttype og tekstskyggerne, som valgt under Typografi sektionen.</string>
<string name="settings_clock_text_color_title">Tekstfarve</string>
<string name="settings_ampm_indicator_title">Vis AM/PM indikator</string>
<string name="clock_text_header">Tekststil på ur</string>
<!-- Glance -->
<string name="settings_show_next_alarm_title">Vis næste alarm</string>
<string name="next_alarm_warning">Den næste alarm lader til at være forkert.\nDen er indstillet af %s.</string>
<string name="settings_at_a_glance_title">Overblik</string>
<string name="settings_show_music_title">Aktuel sang</string>
<string name="settings_request_notification_access">Vi har brug for tilladelse til aflæsning af notifikationer, for at vise den aktuelle sang.</string>
<string name="settings_request_fitness_access">Vi har brug for et par få tilladelser, til at vise dine daglige skridt fra Google Fit.</string>
<string name="title_show_glance">Vis overbliks-informationer</string>
<string name="description_show_glance_visible">Service aktiveret</string>
<string name="description_show_glance_not_visible">Service deaktiveret</string>
<string name="settings_sort_glance_providers_title">Datakildeprioritet</string>
<string name="settings_sort_glance_providers_subtitle">Skift datakilders prioritet</string>
<string name="settings_custom_notes_title">Brugerdefinerede noter</string>
<string name="settings_low_battery_level_title">Batteri</string>
<string name="settings_daily_steps_title">Daglige skridt</string>
<string name="battery_low_warning">Lavt batteriniveau</string>
<string name="daily_steps_counter">%d skridt indtil videre</string>
<string name="charging">Oplader</string>
<string name="providers">Kilder</string>
<string name="glance_info">Glance info will show up only when there are no events displayed and only when a few conditions are verified.</string>
<!-- Settings -->
<string name="action_share">Del</string>
<string name="action_rate">Bedøm app</string>
<string name="action_support">Støt mig</string>
<string name="action_feedback">Feedback</string>
<string name="action_about">Om</string>
<string name="action_refresh_widget">Genindlæs widget</string>
<string name="toolbar_transition_name" translatable="false">toolbar</string>
<string name="error_opening_uri">Fejl ved åbning af URL: Link kopieret til udklipsholder.</string>
<string name="loading_text">Indlæser data…</string>
<string name="error_opening_app">Fejl ved åbning af app.</string>
<string name="default_name">Standard app</string>
<string name="action_save">Gem</string>
<string name="settings_visible">Synlig</string>
<string name="settings_not_visible">Skjult</string>
<string name="support_translations_title">Hjælp med oversættelser</string>
<string name="support_translations_subtitle">Åbn en pull-anmodning på GitHub</string>
<string name="support_website_title">Se mine andre projekter</string>
<string name="support_website_subtitle">Samme udvikler, mange muligheder</string>
<string name="error">Ups, noget gik galt!</string>
<string name="settings_theme_title">Tema</string>
<string name="support_main_subtitle">Udviklere har altid brug for meget kaffe</string>
<string name="settings_subtitle_dark_theme_light">Lys</string>
<string name="settings_subtitle_dark_theme_dark">Mørk</string>
<string name="settings_subtitle_dark_theme_by_battery_saver">Angivet af batterisparefunktionen</string>
<string name="settings_subtitle_dark_theme_follow_system">Følg systemtemaet</string>
<string name="settings_subtitle_dark_theme_default">Standard</string>
<string name="search">Søg</string>
<string name="settings_app_version_title">App version</string>
<string name="settings_title_show_wallpaper">Vis baggrundsbillede</string>
<string name="support_refresh_widget_subtitle">Tving en genstart af widget-tjenesten</string>
<string name="settings_feedback_subtitle">Dette er et open-source projekt, du er velkommen til at hjælpe.</string>
<string name="settings_feedback_title">Feedback og feature requests</string>
<string name="xiaomi_manufacturer" translatable="false">xiaomi</string>
<string name="xiaomi_warning_title">Xiaomi Enheder</string>
<string name="xiaomi_warning_message">Aktiver tilladelsen til visning af popup-vinduer, når app\'en kører i baggrunden, som findes under "Andre tilladelser" i appindstillingerne. Ellers vil du ikke kunne åbne nogle applikationer ved tryk på widget\'en.</string>
<string name="action_ignore">Ignorér</string>
<string name="action_grant_permission">Giv tilladelse</string>
<string name="settings_title">Indstillinger</string>
<string name="style_header">Stil</string>
<string name="actions_header">Handlinger</string>
<string name="provider_header">Opsætning</string>
<string name="appearance_header">Udseende</string>
<string name="preferences_header">Præferencer</string>
<!-- Activities -->
<string name="action_choose_application">Vælg applikation</string>
<string name="support_main_title">Støt udvikleren</string>
<string name="thanks">Tak for støtten!</string>
<string name="donation_coffee">En italiensk kaffe</string>
<string name="donation_donuts">Nogle glaserede donuts</string>
<string name="donation_dinner">En dyr middag</string>
<string name="donation_breakfast">En english breakfast</string>
<string name="donation_lunch">En hurtig frokost</string>
<string name="action_show_widget_preview">Vis widget forhåndsvisning</string>
<string name="support_dev_subtitle">Dette er et projekt fra en enkelt udvikler,\nså tak for støtten!</string>
<string name="settings_title_integrations">Integrationer</string>
<string name="label_count_installed_integrations">%d installerede integrationer</string>
</resources>

View File

@ -1,244 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="add_widget">Widget hinzufügen</string>
<string name="button_request_permission">Rechte erteilen</string>
<string name="title_permission_calendar">Sehen Sie Ihre Termine</string>
<string name="title_permission_location">Kontrolliere das Wetter</string>
<string name="description_permission_calendar">Gewähren Sie Zugriff auf Ihren Kalender, um Ereignisse in Ihrem
Widget anzuzeigen.\n\t
</string>
<string name="description_permission_location">Gewähren Sie Zugriff auf Ihren Ort, um das Wetter in Ihrem Widget
anzuzeigen.\n\t
</string>
<string name="settings_filter_calendar_title">Veranstaltungen filtern</string>
<string name="action_share">Teilen</string>
<string name="action_rate">App bewertern</string>
<string name="action_support">Ünterstützten Sie mich</string>
<string name="all_set_title">Gut gemacht!</string>
<string name="notification_subtitle">Sehen Sie sich Ihre Ereignisse und das Wetter in einem anderen Widget an.
</string>
<string name="notification_title">Holen Sie mehr aus Ihrem Widget heraus</string>
<string name="all_set_subtitle">Sie haben die Konfiguration abgeschlossen. Achten Sie auf Updates.</string>
<string name="all_set_btn">Bleiben Sie aktuell</string>
<string name="action_about">Über</string>
<string name="h_code">Std</string>
<string name="min_code">" Min"</string>
<string name="in_code">in</string>
<string name="action_project">Projekt</string>
<string name="settings_unit_title">Messeinheit</string>
<string name="settings_unit_subtitle">Wählen Sie die Einheit der Temperaturmessung</string>
<string name="settings_filter_calendar_subtitle">Sichtbarkeit der Kalender</string>
<string name="settings_all_day_title">Ganztag-Veranstaltungen</string>
<string name="settings_all_day_subtitle_visible">Sichtbar</string>
<string name="settings_all_day_subtitle_gone">Nicht sichtbar</string>
<string name="main_calendar">Kalender-Account</string>
<string name="settings_calendar_title">Kalender-Einstellungen</string>
<string name="settings_weather_title">Wetter-Einstellungen</string>
<string name="settings_general_title">Allgemeine Einstellungen</string>
<string name="calendar_settings_list_error">Fehler beim Laden der Kalenderliste</string>
<string name="settings_hour_format_title">Stundenformat</string>
<string name="settings_hour_format_subtitle_12">12 Stunden AM/PM</string>
<string name="settings_hour_format_subtitle_24">24 Stunden</string>
<string name="all_day">Ganztag-Veranstaltung</string>
<string name="settings_date_format_title">Datumsformat</string>
<string name="settings_weather_refresh_period_title">Aktualisierungszeitraum</string>
<string name="settings_weather_refresh_period_subtitle_0">30 Minuten</string>
<string name="settings_weather_refresh_period_subtitle_1">1 Stunde</string>
<string name="settings_weather_refresh_period_subtitle_2">3 Stunden</string>
<string name="settings_weather_refresh_period_subtitle_3">6 Stunden</string>
<string name="settings_weather_refresh_period_subtitle_4">12 Stunden</string>
<string name="settings_weather_refresh_period_subtitle_5">24 Stunden</string>
<string name="settings_custom_location_title">" Benutzerdefinierte Position"</string>
<string name="custom_location_gps">Geo-Lokalisierung</string>
<string name="action_refresh_widget">Widget erneuern</string>
<string name="show_events_visible">Veranstaltungen sind sichtbar</string>
<string name="show_events_not_visible">Veranstaltungen sind nicht sichtbar</string>
<string name="show_weather_visible">Wetterinfos sind sichtbar</string>
<string name="show_weather_not_visible">Wetterinfos sind nicht sichtbar</string>
<string name="settings_show_until_subtitle_0">3 Stunden später</string>
<string name="settings_show_until_subtitle_1">6 Stunden später</string>
<string name="settings_show_until_subtitle_2">12 Stunden später</string>
<string name="settings_show_until_subtitle_3">24 Stunden später</string>
<string name="settings_show_until_subtitle_4">3 Tage später</string>
<string name="settings_show_until_subtitle_5">7 Tage später</string>
<string name="settings_show_until_title">Sehen Sie die Ereignisse höchstens bis</string>
<string name="day_char">T</string>
<string name="error_opening_uri">Fehler beim Öffnen der URL: Link in die Zwischenablage kopiert.</string>
<string name="loading_text">Daten werden geladen...</string>
<string name="error_opening_app">Fehler beim Öffnen der App.</string>
<string name="settings_calendar_app_title">Standard Kalender-App</string>
<string name="settings_weather_app_title">Beim Klick auf\'s Wetter öffnet sich</string>
<string name="default_name">Standardapp</string>
<string name="action_choose_application">App wählen</string>
<string name="settings_weather_provider_api_key_title">Wetter-Anbieter</string>
<string name="settings_weather_provider_api_key_subtitle_all_set">Der Wetteranbieter ist korrekt konfiguriert
</string>
<string name="settings_weather_provider_api_key_subtitle_not_set">Der Wetteranbieter muss konfiguriert werden
</string>
<string name="notification_gps_title">GPS einschalten</string>
<string name="notification_gps_subtitle">Google Awareness benötigt aktives GPS zum Arbeiten.</string>
<string name="action_feedback">Rückmeldung</string>
<string name="feedback_title">AW Rückmeldung</string>
<string name="feedback_chooser_title">E-Mail senden...</string>
<string name="feedback_error">Fehler beim Senden der E-Mail.</string>
<string name="api_key_hint">OpenWeather API Key</string>
<string name="action_save">Speichern</string>
<string name="error_no_calendar">Keine Kalender gefunden</string>
<string name="api_key_info_title">Was ist zu tun</string>
<string name="api_key_info_text">
<![CDATA[Another Widget ist eine kostenlose Anwendung und wird ohne Bannerwerbung bleiben.<BR /> <BR />Aufgrund seines großen Erfolges, der sicherlich meine Erwartungen übertrifft, unterstützt der Wetteranbieter nicht alle ankommenden Anfragen (einfach, weil es kostenlos und daher begrenzt ist).<BR /><BR />Ich muss jeden von Ihnen bitten, ein Konto bei OpenWeather persönlich zu registrieren. Der Vorgang dauert nur ein paar Minuten, und wenn der Schlüssel aktiviert ist, haben Sie keine Probleme mit dem Wetter.<BR /><BR />Ich entschuldige mich für die Unannehmlichkeiten und stütze mich weiter!]]></string>
<string name="api_key_title_1">Registrierung eines OpenWeather Kontos</string>
<string name="api_key_subtitle_1">Registrieren Sie ein kostenloses Konto bei OpenWeather. Es wird nur ein paar
Minuten dauern.
</string>
<string name="api_key_title_2">API-Key kopieren</string>
<string name="api_key_subtitle_2">Greifen Sie über Ihre Kontoeinstellungen auf das API-Schlüsselmenü zu und kopieren
Sie den Standardschlüssel.
</string>
<string name="api_key_title_3">Fügen Sie den Schlüssel zur App hinzu</string>
<string name="api_key_subtitle_3">Geben Sie den Schlüssel in diesem Abschnitt ein und speichern Sie ihn. Sobald der
Schlüssel aktiviert ist, ist das Wetter sichtbar.
</string>
<string name="api_key_info_start">Hi zusammen!</string>
<string name="action_open_provider">Öffnen von OpenWeatherMap.com</string>
<string name="api_key_info_all_set">
<![CDATA[Es kann bis zu <b> zehn Minuten </b> dauern, bis der API-Schlüssel aktiviert wird.<BR /><i> Entspannen </ i> Sie! Das Wetter wird aktualisiert, sobald es verfügbar ist !!]]></string>
<string name="well_done">Gut gemacht!</string>
<string name="hs_code">Std</string>
<string name="tomorrow">Morgen</string>
<string name="today">Heute</string>
<string name="settings_event_app_title">Klick auf die Veranstaltung öffnet</string>
<string name="settings_second_row_info_title">Informationen der zweiten Reihe</string>
<string name="settings_font_color_title">Textfarbe</string>
<string name="title_main_text_size">Schriftgröße erste Reihe</string>
<string name="title_second_text_size">Schriftgröße zweite Reihe</string>
<string name="settings_clock_title">Einstellung der Uhr</string>
<string name="settings_second_row_info_subtitle_1">Zeige Ereignisadresse anstelle von Zeit</string>
<string name="settings_second_row_info_subtitle_0">Zeige Ereignisszeit</string>
<string name="settings_second_row_info_subtitle_2">Zeige nächste Erinnerung</string>
<string name="settings_clock_app_title">Klick der Uhr öffnet</string>
<string name="title_show_clock">Uhr anzeigen</string>
<string name="description_show_clock">Zeigt die Zeit über Ereignisse und Wetter an</string>
<string name="show_clock_visible">Uhr ist sichtbar</string>
<string name="show_clock_not_visible">Uhr ist nicht sichtbar</string>
<string name="settings_clock_text_size_title">Schriftgrößte der Uhr</string>
<string name="title_text_shadow">Schatten des Textes</string>
<string name="settings_text_shadow_subtitle_none">Keins</string>
<string name="settings_text_shadow_subtitle_low">Niedrig</string>
<string name="settings_text_shadow_subtitle_high">Hoch</string>
<string name="advanced_settings_title">Erweiterte Einstellungen</string>
<string name="settings_product_sans_font_title">Product Sans Font</string>
<string name="settings_product_sans_font_subtitle">Durch die Verwendung von Product Sans wurde die Möglichkeit zum
Antippen von Widget-Elementen deaktiviert. Ich arbeite dran.
</string>
<string name="settings_show_diff_time_title">Zeit für die Veranstaltung</string>
<string name="settings_visible">Sichtbar</string>
<string name="settings_not_visible">Nicht sichtbar</string>
<string name="settings_show_declined_events_title">Abgelehnte Ereignisse</string>
<string name="default_weather_app">Google Wetter</string>
<string name="default_event_app">Veranstalungsdetails</string>
<string name="default_calendar_app">Standard Kalender-App</string>
<string name="default_clock_app">Standard Uhr-App</string>
<string name="settings_show_until_subtitle_7">1 Stunde später</string>
<string name="settings_show_until_subtitle_6">30 Minuten später</string>
<string name="action_default">Default</string>
<string name="action_none">Deaktiviert</string>
<string name="settings_custom_font_title">Widget Schriftart</string>
<string name="custom_font_subtitle_0">Geräte Schriftart</string>
<string name="custom_font_subtitle_1">Produkt Schriftart</string>
<string name="action_go_to_next_event">Zeige nächste Veranstaltung</string>
<string name="settings_show_multiple_events_title">Zähler für mehrere Ereignisse</string>
<string name="support_main_title">Unterstütze den Entwickler mit</string>
<string name="support_translations_title">Bei der Übersetzung helfen</string>
<string name="support_translations_subtitle">Öffne einen pull request auf GitHub</string>
<string name="support_website_title">Schauen Sie sich meine anderen Projekte an</string>
<string name="support_website_subtitle">Selber Entwickler, mehr Möglichkeiten</string>
<string name="error">Ops, da ist etwas falsch gelaufen!</string>
<string name="thanks">Danke für Ihre Unterstützung</string>
<string name="donation_coffee">Einen italenischen Kaffee</string>
<string name="donation_donuts">Einige glasierte Donuts</string>
<string name="donation_dinner">Ein teueres Abendessen</string>
<string name="donation_breakfast">Ein englischen Frühstück</string>
<string name="donation_lunch">Ein schnelles Mittagsessen</string>
<string name="background_service_title">Another Widget läuft</string>
<string name="background_service_subtitle">AW läuft im Hintergrund</string>
<string name="action_show_widget_preview">Zeige die Widget Vorschau</string>
<string name="action_hide_widget_preview">Verstecke die Widget Vorschau</string>
<string name="error_widget_notification_title">GPS ist aus</string>
<string name="error_widget_notification_subtitle">GPS wieder aktivieren, damit ein Another Widget
Wetterinformationen mit der Google Awareness API aktualisieren kann.
</string>
<!-- TODO -->
<string name="error_weather_api_key">The provider is not configured correctly, do you still want to go back?</string>
<string name="settings_show_next_alarm_title">Show next alarm when possible</string>
<string name="open_location_settings">Location settings</string>
<string name="change_provider">Change provider</string>
<string name="disable_notification">Disable notification</string>
<string name="settings_theme_title">Theme</string>
<string name="support_main_subtitle">Devs always need a lot of coffee</string>
<string name="settings_subtitle_dark_theme_light">Light</string>
<string name="settings_subtitle_dark_theme_dark">Dark</string>
<string name="settings_subtitle_dark_theme_by_battery_saver">Set by Battery Saver</string>
<string name="settings_subtitle_dark_theme_follow_system">Follow the system theme</string>
<string name="settings_subtitle_dark_theme_default">Default</string>
<string name="search">Search</string>
<string name="settings_title_show_wallpaper">Show wallpaper</string>
<string name="support_refresh_widget_subtitle">Force the restart of the widget service</string>
<string name="account_events">Account events</string>
<string name="clock_warning">Due to technological limitations, the clock won\'t have the custom font and the text shadows selected in the typography section.</string>
<string name="weather_warning">Google Awareness weather has been deprecated. It\'s now required an OpenWeather API key to show the weather in the widget.</string>
<string name="custom_date_format">Custom date format</string>
<string name="settings_app_version_title">App version</string>
<string name="support_dev_subtitle">This is a single developer project,\nso thank you for the support!</string>
<string name="settings_feedback_subtitle">This is an open-source project, feel free to help.</string>
<string name="settings_feedback_title">Feedback and feature requests</string>
<string name="settings_clock_bottom_margin_title">Clock bottom margin</string>
<string name="settings_clock_bottom_margin_subtitle_none">None</string>
<string name="settings_clock_bottom_margin_subtitle_small">Small</string>
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
<string name="settings_clock_bottom_margin_subtitle_large">Large</string>
<string name="xiaomi_warning_title">Xiaomi Devices</string>
<string name="xiaomi_warning_message">Enable the permission to display pop-up windows when running in the background inside the "Other permission" section of the app settings. Otherwise, you will not able to open any applications tapping on the widget.</string>
<string name="action_ignore">Ignore</string>
<string name="action_grant_permission">Grant permission</string>
<string name="alpha">Alpha</string>
<string name="settings_background_color_title">Background color</string>
<string name="transparent">Transparent</string>
<string name="next_alarm_warning">The next alarm clock seems to be wrong.\nIt has been set by %s.</string>
<string name="settings_title">Settings</string>
<string name="settings_clock_text_color_title">Clock text color</string>
<string name="settings_music_title">Music</string>
<string name="settings_show_music_title">Show current playing song</string>
<string name="settings_show_music_enabled_subtitle">Playing song info visible</string>
<string name="settings_show_music_disabled_subtitle">Playing song info hidden</string>
<string name="settings_song_info_format_title">Song info format</string>
<string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string>
<string name="settings_at_a_glance_title">At a Glance</string>
<string name="settings_title_integrations">Integrations</string>
<string name="label_count_installed_integrations">%d installed integrations</string>
<string name="title_show_glance">Show at a glance info</string>
<string name="description_show_glance">Show multiple provider data when there are no events displayed.</string>
<string name="settings_show_dividers_title">Show text dividers</string>
<string name="settings_show_next_alarm_subtitle">Show the next clock alarm</string>
<string name="settings_sort_glance_providers_title">Data source priority</string>
<string name="settings_sort_glance_providers_subtitle">Change the data provider importance</string>
<string name="settings_custom_notes_title">Custom notes</string>
<string name="settings_low_battery_level_title">Battery level</string>
<string name="settings_daily_steps_title">Daily steps</string>
<string name="battery_low_warning">Low battery level</string>
<string name="settings_request_fitness_access">We need a few permissions to get your daily steps from Google Fit.</string>
<string name="settings_ampm_indicator_title">Show AM/PM Indicator</string>
<string name="daily_steps_counter">%d steps today</string>
<string name="settings_secondary_font_color_title">Second row text color</string>
<string name="soon">soon</string>
<string name="now">now</string>
<string name="settings_widget_update_frequency_title">Time left update frequency</string>
<string name="settings_widget_update_frequency_subtitle">High frequency causes more battery consume</string>
<string name="settings_widget_update_frequency_low">Low</string>
<string name="settings_widget_update_frequency_default">Default</string>
<string name="settings_widget_update_frequency_high">High</string>
<string name="settings_weather_icon_pack_title">Icon pack</string>
<string name="settings_weather_icon_pack_default">Default</string>
<string name="settings_weather_icon_pack_minimal">Minimal</string>
</resources>

View File

@ -1,40 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="add_widget">Ajouter</string>
<string name="button_request_permission">Donner la permission</string>
<string name="title_permission_calendar">Afficher vos événements</string>
<string name="title_permission_location">Afficher la météo</string>
<string name="description_permission_calendar">Accorder l\'accès à votre calendrier\npour voir les événements dans votre widget.</string>
<string name="description_permission_location">Accorder l\'accès à votre localisation\npour voir la météo dans votre widget.</string>
<string name="notification_title">Obtenez plus de la part de votre widget</string>
<string name="notification_subtitle">Voir vos événements et la météo dans Another Widget.</string>
<string name="action_share">Partager</string>
<string name="action_rate">Noter l\'app</string>
<string name="action_support">Soutenez-moi</string>
<string name="all_set_title">Bon travail !</string>
<string name="all_set_subtitle">Vous avez fini la configuration.\nDes mises à jour sont à venir.</string>
<string name="all_set_btn">Restez à jour</string>
<string name="action_about">À propos</string>
<string name="h_code">h</string>
<string name="min_code">" min"</string>
<string name="in_code">dans</string>
<string name="action_project">Projet</string>
<string name="settings_unit_title">Unité de mesure</string>
<string name="settings_unit_subtitle">Choisir l\'unité de mesure de température</string>
<string name="settings_filter_calendar_title">Filtrer les événements</string>
<string name="settings_filter_calendar_subtitle">Changer la visibilité du calendrier</string>
<string name="settings_all_day_title">Événements toute la journée</string>
<string name="settings_all_day_subtitle_visible">Visible</string>
<string name="settings_all_day_subtitle_gone">Non visible</string>
<string name="main_calendar">Calendrier du compte</string>
<string name="settings_calendar_title">Calendrier</string>
<string name="settings_weather_title">Météo</string>
<string name="settings_general_title">Typographie</string>
<string name="calendar_settings_list_error">Erreur de chargement du calendrier</string>
<string name="settings_hour_format_title">Format d\'heure</string>
<string name="settings_hour_format_subtitle_12">12 heures</string>
<string name="settings_hour_format_subtitle_24">24 heures</string>
<string name="all_day">Événement toute la journée</string>
<!-- Display -->
<string name="settings_general_title">Affichage</string>
<string name="settings_font_color_title">Couleur du texte</string>
<string name="settings_secondary_font_color_title">Couleur du texte</string>
<string name="settings_background_color_title">Couleur de l\'arrière-plan</string>
<string name="title_main_text_size">Taille du texte</string>
<string name="title_second_text_size">Taille du texte</string>
<string name="title_text_shadow">Ombre du texte</string>
<string name="settings_text_shadow_subtitle_none">Aucune</string>
<string name="settings_text_shadow_subtitle_low">Faible</string>
<string name="settings_text_shadow_subtitle_high">Élevée</string>
<string name="settings_custom_font_title">Police du widget</string>
<string name="custom_font_subtitle_0">Police de l\'appareil</string>
<string name="custom_font_subtitle_1">Product Sans</string>
<string name="custom_date_format">Format personnalisé</string>
<string name="alpha">Opacité </string>
<string name="transparent">Transparent</string>
<string name="settings_show_dividers_title">Séparateur de texte</string>
<string name="first_row_header">Première ligne</string>
<string name="second_row_header">Seconde ligne</string>
<string name="global_style_header">Widget</string>
<string name="action_capitalize_the_date">Date en majuscules</string>
<string name="settings_date_format_title">Format de date</string>
<!-- Calendar -->
<string name="settings_calendar_title">Calendrier</string>
<string name="title_permission_calendar">Afficher vos événements</string>
<string name="description_permission_calendar">Accordez l\'accès à votre calendrier\npour afficher les événements dans votre widget</string>
<string name="settings_filter_calendar_title">Filtrer les événements</string>
<string name="settings_filter_calendar_subtitle">Modifier la visibilité du calendrier</string>
<string name="settings_all_day_title">Événements toute la journée</string>
<string name="main_calendar">Calendrier du compte</string>
<string name="calendar_settings_list_error">Erreur de chargement de la liste des calendriers</string>
<string name="all_day">Événement toute la journée</string>
<string name="show_events_visible">Événements visibles</string>
<string name="show_events_not_visible">Événements non visibles</string>
<string name="settings_show_until_subtitle_6">30 minutes avant</string>
<string name="settings_show_until_subtitle_7">1 heure avant</string>
<string name="settings_show_until_subtitle_0">3 heures avant</string>
<string name="settings_show_until_subtitle_1">6 heures avant</string>
<string name="settings_show_until_subtitle_2">12 heures avant</string>
<string name="settings_show_until_subtitle_3">24 heures avant</string>
<string name="settings_show_until_subtitle_4">3 jours avant</string>
<string name="settings_show_until_subtitle_5">7 jours avant</string>
<string name="settings_show_until_title">Afficher les événements au moins</string>
<string name="day_char">j</string>
<string name="settings_calendar_app_title">App calendrier par défaut</string>
<string name="error_no_calendar">Aucun calendrier trouvé</string>
<string name="tomorrow">demain</string>
<string name="today">aujourd\'hui</string>
<string name="settings_event_app_title">Taper sur l\'événement ouvre</string>
<string name="settings_second_row_info_title">Infos de l\'événement</string>
<string name="settings_second_row_info_subtitle_1">Adresse de l\'événement</string>
<string name="settings_second_row_info_subtitle_0">Heure de l\'événement</string>
<string name="settings_show_diff_time_title">Temps restant jusqu\'à l\'événement</string>
<string name="settings_show_declined_events_title">Événements refusés</string>
<string name="default_event_app">Détails de l\'événement</string>
<string name="default_calendar_app">App calendrier par défaut</string>
<string name="settings_show_multiple_events_title">Sélecteur d\'événements multiples</string>
<string name="soon">bientôt</string>
<string name="now">maintenant</string>
<string name="settings_widget_update_frequency_title">Fréquence de màj du temps restant</string>
<string name="settings_widget_update_frequency_subtitle">Une fréquence élevée consomme plus de batterie</string>
<string name="settings_widget_update_frequency_low">Faible</string>
<string name="settings_widget_update_frequency_default">Par défaut</string>
<string name="settings_widget_update_frequency_high">Élevée</string>
<string name="filters_header">Filtres</string>
<string name="event_detail_header">Détails</string>
<!-- Weather -->
<string name="settings_weather_title">Météo</string>
<string name="title_permission_location">Afficher la météo</string>
<string name="description_permission_location">Accordez l\'accès à votre localisation\npour voir la météo dans votre widget</string>
<string name="settings_unit_title">Unité de mesure</string>
<string name="settings_weather_refresh_period_title">Fréquence d\'actualisation</string>
<string name="settings_weather_refresh_period_subtitle_0">30 minutes</string>
<string name="settings_weather_refresh_period_subtitle_1">1 heure</string>
@ -44,115 +85,84 @@
<string name="settings_weather_refresh_period_subtitle_5">24 heures</string>
<string name="settings_custom_location_title">Localisation</string>
<string name="custom_location_gps">Utiliser le GPS</string>
<string name="action_refresh_widget">Actualisation forcée</string>
<string name="show_events_visible">Événements visibles</string>
<string name="show_events_not_visible">Événements non visibles</string>
<string name="show_weather_visible">Infos météo visibles</string>
<string name="show_weather_not_visible">Infos météo non visibles</string>
<string name="settings_show_until_subtitle_0">3 heures avant</string>
<string name="settings_show_until_subtitle_1">6 heures avant</string>
<string name="settings_show_until_subtitle_2">12 heures avant</string>
<string name="settings_show_until_subtitle_3">24 heures avant</string>
<string name="settings_show_until_subtitle_4">3 jours avant</string>
<string name="settings_show_until_subtitle_5">7 jours avant</string>
<string name="settings_show_until_title">Afficher les événements au moins</string>
<string name="day_char">j</string>
<string name="error_opening_uri">Erreur lors de l\'ouverture de l\'URL : Lien copié dans le presse-papiers.</string>
<string name="loading_text">Chargement des données…</string>
<string name="error_opening_app">Erreur lors de l\'ouverture de l\'app.</string>
<string name="settings_calendar_app_title">App calendrier par défaut</string>
<string name="settings_weather_app_title">Taper sur la météo ouvre</string>
<string name="default_name">App par défaut</string>
<string name="action_choose_application">Choisir une application</string>
<string name="settings_weather_provider_api_key_title">Clé API pour la méteo</string>
<string name="settings_weather_provider_api_key_subtitle_all_set">Le fournisseur météo est correctement configuré</string>
<string name="settings_weather_provider_api_key_subtitle_not_set">Le fournisseur de météo doit être configuré</string>
<string name="notification_gps_title">Activer le GPS</string>
<string name="notification_gps_subtitle">Google Awareness a besoin d\'un GPS actif pour fonctionner.</string>
<string name="action_feedback">Commentaires</string>
<string name="feedback_title">Commentaires AW</string>
<string name="feedback_chooser_title">Envoyer un email…</string>
<string name="feedback_error">Erreur lors de l\'envoi de l\'email.</string>
<string name="settings_weather_provider_api_key_title">Clé API pour la météo</string>
<string name="settings_weather_provider_api_key_subtitle_all_set">Fournisseur météo correctement configuré</string>
<string name="settings_weather_provider_api_key_subtitle_not_set">Le fournisseur météo doit être configuré</string>
<string name="api_key_hint">Clé API OpenWeather</string>
<string name="error_weather_api_key">Le fournisseur n\'est pas configuré correctement, voulez-vous toujours revenir en arrière ?</string>
<string name="action_save">Sauvegarder</string>
<string name="error_no_calendar">Aucun calendrier trouvé.</string>
<string name="api_key_info_title">Instructions</string>
<string name="api_key_info_text"><![CDATA[Another Widget est une application gratuite et restera sans publicité. <BR /> <BR /> En raison de son grand succès, au-delà de toutes mes attentes, le fournisseur de météo ne peut prendre en charge toutes les demandes (tout simplement parce qu\'il est gratuit et donc limité). <BR /> <BR /> Je dois demander à chacun d\'enregistrer personnellement un compte sur OpenWeather ; l\'opération ne prendra que quelques minutes, et lorsque votre clé sera activée, vous n\'aurez aucun problème avec la météo. <BR /> <BR /> Je suis désolé pour le désagrément, continuez à me soutenir !]]></string>
<string name="default_weather_app">Google Weather</string>
<string name="weather_warning">La météo de Google Awareness est obsolète. Il faut désormais une clé API OpenWeather pour afficher la météo dans le widget.</string>
<string name="api_key_title_1">Inscrivez-vous sur OpenWeather</string>
<string name="api_key_subtitle_1">Créez un compte gratuit sur OpenWeather. Cela ne prendra que quelques minutes.</string>
<string name="api_key_subtitle_1">Créez un compte gratuit sur OpenWeather. \nCela ne prendra que quelques minutes.</string>
<string name="api_key_title_2">Copiez votre clé API</string>
<string name="api_key_subtitle_2">Recherchez la clé API dans vos paramètres du compte et copiez la clé par défaut.</string>
<string name="api_key_title_3">Saisissez la clé dans l\'app</string>
<string name="api_key_title_3">Saisissez la clé API dans l\'app</string>
<string name="api_key_subtitle_3">Collez la clé dans le champ ci-dessus et enregistrez-la. Une fois la clé activée, la météo deviendra visible.</string>
<string name="api_key_info_start">Bonjour tout le monde !</string>
<string name="action_open_provider">Aller sur le site d\'OpenWeatherMap</string>
<string name="api_key_info_all_set"><![CDATA[Cela peut prendre jusqu\'à <b> 10 minutes </b> avant que votre clé API soit activée. La météo sera mise à jour dès qu\'elle sera disponible !]]></string>
<string name="well_done">Bien joué !</string>
<string name="hs_code">h</string>
<string name="tomorrow">demain</string>
<string name="today">aujourd\'hui</string>
<string name="settings_event_app_title">Taper sur l\'événement ouvre</string>
<string name="settings_second_row_info_title">Information de la seconde ligne</string>
<string name="settings_second_row_info_subtitle_1">Afficher l\'adresse de l\'événement au lieu de l\'heure</string>
<string name="settings_second_row_info_subtitle_0">Afficher l\'heure de l\'événement</string>
<string name="settings_second_row_info_subtitle_2">Afficher l\'heure de la prochaine alarme</string>
<string name="settings_font_color_title">Couleur du texte</string>
<string name="title_main_text_size">Taille du texte de la première ligne</string>
<string name="title_second_text_size">Taille du texte de la seconde ligne</string>
<string name="action_open_provider">Aller sur OpenWeatherMap.com</string>
<string name="api_key_info_all_set">Cela peut prendre jusqu\'à 10 minutes avant que votre clé API soit activée. La météo sera mise à jour dès qu\'elle sera disponible !</string>
<string name="settings_weather_icon_pack_title">Pack d\'icônes</string>
<string name="settings_weather_icon_pack_default">Pack d\'icônes %d</string>
<!-- Clock -->
<string name="settings_clock_title">Horloge</string>
<string name="settings_clock_app_title">Taper sur l\'horloge ouvre</string>
<string name="title_show_clock">Afficher l\'horloge</string>
<string name="description_show_clock">Voir l\'heure au-dessus des événements et la météo</string>
<string name="show_clock_visible">Horloge visible</string>
<string name="show_clock_not_visible">Horloge non visible</string>
<string name="settings_clock_text_size_title">Taille du texte de l\'horloge</string>
<string name="settings_show_next_alarm_title">Afficher la prochaine alarme si possible</string>
<string name="title_text_shadow">Ombre du texte</string>
<string name="settings_text_shadow_subtitle_none">Aucune</string>
<string name="settings_text_shadow_subtitle_low">Faible</string>
<string name="settings_text_shadow_subtitle_high">Élevée</string>
<string name="advanced_settings_title">Avancé</string>
<string name="settings_product_sans_font_title">Police Product Sans</string>
<string name="settings_product_sans_font_subtitle">Utiliser la police Product Sans désactive la possibilité de taper sur les événements. Je travaille dessus.</string>
<string name="settings_show_diff_time_title">Temps restant jusqu\'à l\'événement</string>
<string name="settings_clock_text_size_title">Taille du texte</string>
<string name="default_clock_app">App horloge par défaut</string>
<string name="settings_clock_bottom_margin_title">Marge inférieure de l\'horloge</string>
<string name="settings_clock_bottom_margin_subtitle_none">Aucune</string>
<string name="settings_clock_bottom_margin_subtitle_small">Petite</string>
<string name="settings_clock_bottom_margin_subtitle_medium">Moyenne</string>
<string name="settings_clock_bottom_margin_subtitle_large">Grande</string>
<string name="clock_warning">En raison de limitations technologiques, l\'horloge n\'aura pas la police personnalisée et les ombres de texte sélectionnées dans la section Affichage.</string>
<string name="settings_clock_text_color_title">Couleur du texte</string>
<string name="settings_ampm_indicator_title">Afficher l\'indicateur AM/PM</string>
<string name="clock_text_header">Style du texte</string>
<!-- Glance -->
<string name="settings_show_next_alarm_title">Prochaine alarme</string>
<string name="next_alarm_warning">La prochaine alarme semble erronée.\nElle a été définie par %s.</string>
<string name="settings_at_a_glance_title">Coup d\'œil</string>
<string name="settings_show_music_title">Musique en cours de lecture</string>
<string name="settings_request_notification_access">Nous avons besoin d\'accéder aux notifications pour vérifier la musique en cours de lecture</string>
<string name="settings_request_fitness_access">Nous avons besoin de quelques autorisations pour obtenir vos nombres de pas quotidiens depuis Google Fit</string>
<string name="title_show_glance">Afficher les infos en un coup d\'œil</string>
<string name="description_show_glance_visible">Services activés</string>
<string name="description_show_glance_not_visible">Services désactivés</string>
<string name="settings_sort_glance_providers_title">Priorité des sources de données</string>
<string name="settings_sort_glance_providers_subtitle">Modifier l\'importance des fournisseurs</string>
<string name="settings_custom_notes_title">Notes personnalisées</string>
<string name="settings_low_battery_level_title">Batterie (en charge/faible)</string>
<string name="settings_daily_steps_title">Nombre de pas quotidiens</string>
<string name="battery_low_warning">Batterie faible</string>
<string name="daily_steps_counter">%d pas jusqu\à présent</string>
<string name="charging">En charge</string>
<string name="providers">Fournisseurs</string>
<string name="glance_info">Glance info will show up only when there are no events displayed and only when a few conditions are verified.</string>
<!-- Settings -->
<string name="action_share">Partager</string>
<string name="action_rate">Noter l\'app</string>
<string name="action_support">Soutenez-moi</string>
<string name="action_feedback">Commentaires</string>
<string name="action_about">À propos</string>
<string name="action_refresh_widget">Actualiser le widget</string>
<string name="error_opening_uri">Erreur d\'ouverture de l\'URL : lien copié dans le presse-papiers</string>
<string name="loading_text">Chargement des données…</string>
<string name="error_opening_app">Erreur d\'ouverture de l\'app</string>
<string name="default_name">App par défaut</string>
<string name="action_save">OK</string>
<string name="settings_visible">Visible</string>
<string name="settings_not_visible">Non visible</string>
<string name="settings_show_declined_events_title">Événements refusés</string>
<string name="default_weather_app">Google Weather</string>
<string name="default_event_app">Détails de l\'événement</string>
<string name="default_calendar_app">App calendrier par défaut</string>
<string name="default_clock_app">App horloge par défaut</string>
<string name="settings_show_until_subtitle_7">1 heure après</string>
<string name="settings_show_until_subtitle_6">30 minutes après</string>
<string name="action_default">Par défaut</string>
<string name="action_none">Désactivé</string>
<string name="settings_custom_font_title">Police du widget</string>
<string name="custom_font_subtitle_0">Police de l\'appareil</string>
<string name="custom_font_subtitle_1">Product Sans</string>
<string name="action_go_to_next_event">Afficher l\'événement\nsuivant</string>
<string name="settings_show_multiple_events_title">Sélecteur d\'événements multiples</string>
<string name="support_main_title">Soutenir le développeur</string>
<string name="support_translations_title">Aider à traduire</string>
<string name="support_translations_subtitle">Ouvrir une pull-request sur GitHub</string>
<string name="support_website_title">Consulter mes autres projets</string>
<string name="support_website_subtitle">Un même développeur, plusieurs possibilités</string>
<string name="support_website_subtitle">Un seul développeur, plusieurs possibilités</string>
<string name="error">Oups, quelque chose s\'est mal passé !</string>
<string name="thanks">Merci de m\'avoir soutenu !</string>
<string name="donation_coffee">Un café italien</string>
<string name="donation_donuts">Quelques beignets glacés</string>
<string name="donation_dinner">Un dîner coûteux</string>
<string name="donation_breakfast">Un petit-déjeuner anglais</string>
<string name="donation_lunch">Un déjeuner rapide</string>
<string name="background_service_title">Another Widget est en cours d\'exécution</string>
<string name="background_service_subtitle">AW s\'exécute en arrière-plan</string>
<string name="action_show_widget_preview">Afficher l\'aperçu du widget</string>
<string name="action_hide_widget_preview">Cacher l\'aperçu du widget</string>
<string name="error_widget_notification_title">La localisation est désactivée</string>
<string name="error_widget_notification_subtitle">Réactivez le GPS pour qu\'Another Widget puisse mettre à jour les informations météo avec l\'API Google Awareness.</string>
<string name="open_location_settings">Paramètres de localisation</string>
<string name="change_provider">Changer de fournisseur</string>
<string name="disable_notification">Désactiver les notifications</string>
<string name="settings_theme_title">Thème</string>
<string name="support_main_subtitle">On a toujours besoin de beaucoup de café</string>
<string name="settings_subtitle_dark_theme_light">Clair</string>
@ -160,65 +170,34 @@
<string name="settings_subtitle_dark_theme_by_battery_saver">Défini par l\'économiseur de batterie</string>
<string name="settings_subtitle_dark_theme_follow_system">Selon le thème du système</string>
<string name="settings_subtitle_dark_theme_default">Par défaut</string>
<string name="search">Rechercher</string>
<string name="settings_title_show_wallpaper">Afficher le fond d\'écran</string>
<string name="support_refresh_widget_subtitle">Forcer le redémarrage du service du widget</string>
<string name="account_events">Événements du compte</string>
<string name="clock_warning">En raison de limitations technologiques, l\'horloge n\'aura pas la police personnalisée et les ombres de texte sélectionnées dans la section Typographie.</string>
<string name="weather_warning">La météo de Google Awareness est obsolète. Il faut maintenant une clé API OpenWeather pour afficher la météo dans le widget.</string>
<string name="custom_date_format">Format de date personalisé</string>
<string name="search">Recherche</string>
<string name="settings_app_version_title">Version de l\'app</string>
<string name="support_dev_subtitle">Ceci est un projet de développeur unique,\ndonc merci pour le soutien!</string>
<string name="settings_feedback_subtitle">Ceci est un projet open-source, n\'hésitez pas à aider.</string>
<string name="settings_title_show_wallpaper">Afficher le fond d\'écran</string>
<string name="support_refresh_widget_subtitle">Forcer le redémarrage des services du widget</string>
<string name="settings_feedback_subtitle">Ce projet est open-source, n\'hésitez pas à aider</string>
<string name="settings_feedback_title">Commentaires et suggestions</string>
<string name="settings_clock_bottom_margin_title">Marge inférieure de l\'horloge</string>
<string name="settings_clock_bottom_margin_subtitle_none">Aucun</string>
<string name="settings_clock_bottom_margin_subtitle_small">Petit</string>
<string name="settings_clock_bottom_margin_subtitle_medium">Moyen</string>
<string name="settings_clock_bottom_margin_subtitle_large">Grand</string>
<string name="xiaomi_warning_title">Appareils Xiaomi</string>
<string name="xiaomi_warning_message">Veuillez activer l\'option "Afficher des fenêtres pop-up pendant que vous parcourez en arrière-plan" dans la section "Autres autorisations" des paramètres de l\'application. Sinon, vous ne pourrez ouvrir aucune application en tapant sur le widget.</string>
<string name="action_ignore">Ignorer</string>
<string name="action_grant_permission">Aller dans Paramètres</string>
<string name="settings_title">Paramètres</string>
<string name="style_header">Style</string>
<string name="actions_header">Actions</string>
<string name="provider_header">Configuration</string>
<string name="appearance_header">Apparence</string>
<string name="preferences_header">Préférences</string>
<!-- TODO -->
<string name="xiaomi_warning_title">Xiaomi Devices</string>
<string name="xiaomi_warning_message">Enable the permission to display pop-up windows when running in the background inside the "Other permission" section of the app settings. Otherwise, you will not able to open any applications tapping on the widget.</string>
<string name="action_ignore">Ignore</string>
<string name="action_grant_permission">Grant permission</string>
<string name="alpha">Alpha</string>
<string name="settings_background_color_title">Background color</string>
<string name="transparent">Transparent</string>
<string name="next_alarm_warning">The next alarm clock seems to be wrong.\nIt has been set by %s.</string>
<string name="settings_title">Settings</string>
<string name="settings_clock_text_color_title">Clock text color</string>
<string name="settings_music_title">Music</string>
<string name="settings_show_music_title">Show current playing song</string>
<string name="settings_show_music_enabled_subtitle">Playing song info visible</string>
<string name="settings_show_music_disabled_subtitle">Playing song info hidden</string>
<string name="settings_song_info_format_title">Song info format</string>
<string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string>
<string name="settings_at_a_glance_title">At a Glance</string>
<string name="settings_title_integrations">Integrations</string>
<string name="label_count_installed_integrations">%d installed integrations</string>
<string name="title_show_glance">Show at a glance info</string>
<string name="description_show_glance">Show multiple provider data when there are no events displayed.</string>
<string name="settings_show_dividers_title">Show text dividers</string>
<string name="settings_show_next_alarm_subtitle">Show the next clock alarm</string>
<string name="settings_sort_glance_providers_title">Data source priority</string>
<string name="settings_sort_glance_providers_subtitle">Change the data provider importance</string>
<string name="settings_custom_notes_title">Custom notes</string>
<string name="settings_low_battery_level_title">Battery level</string>
<string name="settings_daily_steps_title">Daily steps</string>
<string name="battery_low_warning">Low battery level</string>
<string name="settings_request_fitness_access">We need a few permissions to get your daily steps from Google Fit.</string>
<string name="settings_ampm_indicator_title">Show AM/PM Indicator</string>
<string name="daily_steps_counter">%d steps today</string>
<string name="settings_secondary_font_color_title">Second row text color</string>
<string name="soon">soon</string>
<string name="now">now</string>
<string name="settings_widget_update_frequency_title">Time left update frequency</string>
<string name="settings_widget_update_frequency_subtitle">High frequency causes more battery consume</string>
<string name="settings_widget_update_frequency_low">Low</string>
<string name="settings_widget_update_frequency_default">Default</string>
<string name="settings_widget_update_frequency_high">High</string>
<string name="settings_weather_icon_pack_title">Icon pack</string>
<string name="settings_weather_icon_pack_default">Default</string>
<string name="settings_weather_icon_pack_minimal">Minimal</string>
</resources>
<!-- Activities -->
<string name="action_choose_application">Choisir l\'app</string>
<string name="support_main_title">Soutenir le développeur</string>
<string name="thanks">Merci de m\'avoir soutenu !</string>
<string name="donation_coffee">Un café italien</string>
<string name="donation_donuts">Quelques donuts glacés</string>
<string name="donation_dinner">Un dîner chic</string>
<string name="donation_breakfast">Un petit-déjeuner anglais</string>
<string name="donation_lunch">Un déjeuner rapide</string>
<string name="action_show_widget_preview">Afficher l\'aperçu du widget</string>
<string name="support_dev_subtitle">Ceci est le projet d\'un unique développeur,\ndonc merci pour le soutien !</string>
<string name="settings_title_integrations">Intégrations</string>
<string name="label_count_installed_integrations">%d intégrations installées</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More