From 07f8685741253be50216694524e6753876d03c68 Mon Sep 17 00:00:00 2001 From: saunaklogan Date: Mon, 4 May 2020 21:23:21 +0530 Subject: [PATCH 001/144] Fix for parsing .ics file when the key BYMONTHDAY is present in the .ics file. --- .../com/simplemobiletools/calendar/pro/helpers/Parser.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt index 81e480568..f868d5e50 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt @@ -60,8 +60,11 @@ class Parser { } else if (repeatInterval.isXMonthlyRepetition() || repeatInterval.isXYearlyRepetition()) { repeatRule = if (value.startsWith("-1")) REPEAT_ORDER_WEEKDAY_USE_LAST else REPEAT_ORDER_WEEKDAY } - } else if (key == BYMONTHDAY && value.toInt() == -1) { - repeatRule = REPEAT_LAST_DAY + } else if (key == BYMONTHDAY) { + val byMonthDayValueArray = value.split(",") + val intFlag = byMonthDayValueArray.find { it.toInt() == -1 } + if (intFlag == null) + repeatRule = REPEAT_LAST_DAY } } return EventRepetition(repeatInterval, repeatRule, repeatLimit) From 0b07825fd340063296602687d510e54633ff12ce Mon Sep 17 00:00:00 2001 From: saunaklogan Date: Mon, 4 May 2020 22:18:12 +0530 Subject: [PATCH 002/144] Fix for parsing .ics file when the key BYMONTHDAY is present in the .ics file. Earlier commit had a wrong check which has been updated. --- .../kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt index f868d5e50..e4ee0a0e3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt @@ -63,7 +63,7 @@ class Parser { } else if (key == BYMONTHDAY) { val byMonthDayValueArray = value.split(",") val intFlag = byMonthDayValueArray.find { it.toInt() == -1 } - if (intFlag == null) + if (intFlag != null) repeatRule = REPEAT_LAST_DAY } } From cdcada8cbee7ff83d3b4d1246072ac12ed7e2990 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 5 May 2020 09:36:33 +0200 Subject: [PATCH 003/144] properly show the Event List widget background even if theres no events --- app/src/main/res/layout/widget_event_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/widget_event_list.xml b/app/src/main/res/layout/widget_event_list.xml index 19f116667..ee31313c4 100644 --- a/app/src/main/res/layout/widget_event_list.xml +++ b/app/src/main/res/layout/widget_event_list.xml @@ -9,10 +9,10 @@ android:id="@+id/widget_event_list_background" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignBottom="@+id/widget_event_list" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" android:src="@drawable/widget_round_background" /> Date: Tue, 5 May 2020 09:45:05 +0200 Subject: [PATCH 004/144] reduce the widgets top padding a bit --- app/src/main/res/layout/widget_config_date.xml | 2 +- app/src/main/res/layout/widget_date.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/widget_config_date.xml b/app/src/main/res/layout/widget_config_date.xml index 86b782e96..7106281dc 100644 --- a/app/src/main/res/layout/widget_config_date.xml +++ b/app/src/main/res/layout/widget_config_date.xml @@ -19,7 +19,7 @@ android:layout_width="60dp" android:layout_height="wrap_content" android:gravity="center" - android:paddingTop="@dimen/normal_margin" + android:paddingTop="@dimen/medium_margin" android:textColor="@color/md_grey_white" android:textSize="28sp" tools:text="13" /> diff --git a/app/src/main/res/layout/widget_date.xml b/app/src/main/res/layout/widget_date.xml index d7e63569f..4c3f4f665 100644 --- a/app/src/main/res/layout/widget_date.xml +++ b/app/src/main/res/layout/widget_date.xml @@ -20,7 +20,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:paddingTop="@dimen/normal_margin" + android:paddingTop="@dimen/medium_margin" android:textColor="@color/md_grey_white" android:textSize="26sp" tools:text="1" /> From 5538daf4098b03078e7b878432c36eaa991ffc05 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Tue, 5 May 2020 09:50:15 +0200 Subject: [PATCH 005/144] tweaking a repetition rule check --- .../com/simplemobiletools/calendar/pro/helpers/Parser.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt index e4ee0a0e3..b9420dac7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Parser.kt @@ -61,10 +61,9 @@ class Parser { repeatRule = if (value.startsWith("-1")) REPEAT_ORDER_WEEKDAY_USE_LAST else REPEAT_ORDER_WEEKDAY } } else if (key == BYMONTHDAY) { - val byMonthDayValueArray = value.split(",") - val intFlag = byMonthDayValueArray.find { it.toInt() == -1 } - if (intFlag != null) + if (value.split(",").any { it.toInt() == -1 }) { repeatRule = REPEAT_LAST_DAY + } } } return EventRepetition(repeatInterval, repeatRule, repeatLimit) From 3b40443fec711222c923376dc045d2ca12d2c31b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 5 May 2020 10:11:45 +0200 Subject: [PATCH 006/144] update version to 6.9.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e9bcb4f5e..a013684f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 175 - versionName "6.9.2" + versionCode 176 + versionName "6.9.3" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 40d5710f671d0dd16abac30ad81a625a3ba64922 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 5 May 2020 10:11:53 +0200 Subject: [PATCH 007/144] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/176.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/176.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index d1f23cd8b..1fb6c05b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.9.3 *(2020-05-05)* +---------------------------- + + * Added a 1x1 widget showing the current date + * Made all widget corners round to make them nicer + * Added some translation and other smaller improvements here and there + Version 6.9.2 *(2020-04-17)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/176.txt b/fastlane/metadata/android/en-US/changelogs/176.txt new file mode 100644 index 000000000..1209bd333 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/176.txt @@ -0,0 +1,3 @@ + * Added a 1x1 widget showing the current date + * Made all widget corners round to make them nicer + * Added some translation and other smaller improvements here and there From f78626b6105d89f487545ad2f102e8ac47ebe07c Mon Sep 17 00:00:00 2001 From: 10cents Date: Tue, 5 May 2020 10:54:38 +0200 Subject: [PATCH 008/144] widget_todays_date --- app/src/main/res/values-da/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 1a8d1a9aa..a7dc764ec 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -16,7 +16,7 @@ Månedlig kalender Begivenhedsliste - Calendar today\'s date + Dags dato-kalender Begivenhed From 1cc28589c9bb13fb790bae1c65e2d929f8f82051 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Tue, 5 May 2020 14:33:47 +0200 Subject: [PATCH 009/144] readding the deleted string tag --- app/src/main/res/values-da/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a7dc764ec..eec9d14bf 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -16,7 +16,7 @@ Månedlig kalender Begivenhedsliste - Dags dato-kalender + Dags dato-kalender Begivenhed From 34877a5a7dc4dc3d0aba3433a3cb91928a51be26 Mon Sep 17 00:00:00 2001 From: spkprs Date: Tue, 5 May 2020 16:20:48 +0300 Subject: [PATCH 010/144] Update strings.xml --- app/src/main/res/values-el/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f4f4d0a94..c2cad7602 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -16,7 +16,7 @@ Μηνιαίο ημερολόγιο Λίστα εκδηλώσεων ημερολογίου - Calendar today\'s date + Σημερινό ημερολόγιο Εκδηλώσεις From 7b3a10ee46dfe963cc07a7676ad642cbd74dcdd1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 6 May 2020 22:58:33 +0200 Subject: [PATCH 011/144] fixing a potential UI glitch at the app settings, reminders name --- app/src/main/res/layout/activity_settings.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 93478b89c..a0456ec20 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -186,22 +186,24 @@ + android:clickable="false" + android:maxLines="3" /> From 6be3f18281c003e261aa00bda929f0457701eed2 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Thu, 7 May 2020 16:34:34 +0200 Subject: [PATCH 012/144] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2bf960c51..39e73c688 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Maandweergave Afsprakenlijst - Calendar today\'s date + Agenda vandaag Afspraak From b6b236f42ed28b08da7822c943d296ab608806c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Sat, 9 May 2020 13:57:04 +0100 Subject: [PATCH 013/144] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d1de7ba10..00c99a1f1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -16,7 +16,7 @@ Calendário mensal Lista de eventos - Calendar today\'s date + Data do dia atual Evento @@ -116,8 +116,8 @@ Importar eventos Exportar eventos - Importar eventos de um ficheiro .ics - Exportar eventos para um ficheiro .ics + Importar de um ficheiro .ics + Exportar para um ficheiro .ics Tipo de evento padrão Exportar eventos antigos Incluir tipos de eventos @@ -208,7 +208,7 @@ Selecione uma cor diferente (pode ser aplicada apenas localmente) Não tem permissão para escrever no calendário selecionado Evento não encontrado. Ative a sincronização CalDAV para os calendários apropriados nas definições. - No synchronizable calendars have been found + Não existem calendários passíveis de sincronização @@ -248,7 +248,7 @@ Simple Calendar Pro - Eventos e lembretes - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Calendário Simple Mobile 2020. Agendamentos e lembretes para os seus eventos Simple Calendar Pro é um calendário local, criado para fazer o que um calendário deve fazer. Funcionalidades simples, apenas as permissões estritamente necessárias e sem anúncios! @@ -284,7 +284,7 @@ Consulte todas as aplicações Simple Tools aqui: https://www.simplemobiletools.com - Standalone website of Simple Calendar Pro: + Site da aplicação Simple Calendar Pro: https://www.simplemobiletools.com/calendar Facebook: From d59e124ad48d777344e1d24b106e95248726cd29 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 May 2020 10:26:31 +0200 Subject: [PATCH 014/144] removing some redundant xml rules --- .../main/res/layout-land/fragment_year.xml | 71 +++++++------------ 1 file changed, 25 insertions(+), 46 deletions(-) diff --git a/app/src/main/res/layout-land/fragment_year.xml b/app/src/main/res/layout-land/fragment_year.xml index d622d72f5..444c16bb8 100644 --- a/app/src/main/res/layout-land/fragment_year.xml +++ b/app/src/main/res/layout-land/fragment_year.xml @@ -1,6 +1,5 @@ - + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> @@ -51,15 +48,14 @@ android:gravity="center_horizontal" android:text="@string/february" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> @@ -67,7 +63,6 @@ android:id="@+id/month_3_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -78,15 +73,14 @@ android:gravity="center_horizontal" android:text="@string/march" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -134,15 +126,14 @@ android:gravity="center_horizontal" android:text="@string/may" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> @@ -150,7 +141,6 @@ android:id="@+id/month_6_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -161,16 +151,15 @@ android:gravity="center_horizontal" android:text="@string/june" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> @@ -233,7 +219,6 @@ android:id="@+id/month_9_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -244,16 +229,15 @@ android:gravity="center_horizontal" android:text="@string/september" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -324,15 +304,14 @@ android:gravity="center_horizontal" android:text="@string/december" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_marginStart="@dimen/yearly_month_padding" /> From fbad874f5deac24687ac6392f7902a529d0eeb05 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 May 2020 10:28:20 +0200 Subject: [PATCH 015/144] removing the redundant xml rule in the portrait yearly view too --- app/src/main/res/layout/fragment_year.xml | 60 ++++++++++------------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/layout/fragment_year.xml b/app/src/main/res/layout/fragment_year.xml index f5e9dc3ec..c193376b0 100644 --- a/app/src/main/res/layout/fragment_year.xml +++ b/app/src/main/res/layout/fragment_year.xml @@ -1,6 +1,5 @@ - + android:textSize="@dimen/normal_text_size" /> + android:layout_centerInParent="true" /> @@ -50,13 +48,13 @@ android:gravity="center_horizontal" android:text="@string/february" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_2_label" /> @@ -64,7 +62,6 @@ android:id="@+id/month_3_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -75,13 +72,13 @@ android:gravity="center_horizontal" android:text="@string/march" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_3_label" /> @@ -93,7 +90,6 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginEnd="@dimen/yearly_padding_full" - android:layout_marginRight="@dimen/yearly_padding_full" android:layout_weight="1"> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -129,13 +125,13 @@ android:gravity="center_horizontal" android:text="@string/may" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_5_label" /> @@ -143,7 +139,6 @@ android:id="@+id/month_6_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -154,14 +149,14 @@ android:gravity="center_horizontal" android:text="@string/june" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -172,7 +167,6 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginEnd="@dimen/yearly_padding_full" - android:layout_marginRight="@dimen/yearly_padding_full" android:layout_weight="1"> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_7_label" /> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_8_label" /> @@ -220,7 +214,6 @@ android:id="@+id/month_9_holder" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginLeft="@dimen/yearly_padding_full" android:layout_marginStart="@dimen/yearly_padding_full" android:layout_weight="1"> @@ -231,14 +224,14 @@ android:gravity="center_horizontal" android:text="@string/september" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -250,7 +243,6 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginEnd="@dimen/yearly_padding_full" - android:layout_marginRight="@dimen/yearly_padding_full" android:layout_weight="1"> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_10_label" /> @@ -285,23 +277,21 @@ android:gravity="center_horizontal" android:text="@string/november" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -312,13 +302,13 @@ android:gravity="center_horizontal" android:text="@string/december" android:textAllCaps="true" - android:textSize="@dimen/normal_text_size"/> + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_12_label" /> From 3f9bbb443f346b619fce6af2d705b1a6a12f11da Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 May 2020 10:38:04 +0200 Subject: [PATCH 016/144] fixing some offset glitches at the yearly view --- .../calendar/pro/views/SmallMonthView.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt index 098c2d3d8..117563411 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt @@ -41,9 +41,9 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie init { val attributes = context.theme.obtainStyledAttributes( - attrs, - R.styleable.SmallMonthView, - 0, 0) + attrs, + R.styleable.SmallMonthView, + 0, 0) try { days = attributes.getInt(R.styleable.SmallMonthView_days, 31) @@ -79,11 +79,11 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie for (y in 1..6) { for (x in 1..7) { if (curId in 1..days) { - canvas.drawText(curId.toString(), x * dayWidth, y * dayWidth, getPaint(curId)) + canvas.drawText(curId.toString(), x * dayWidth - (dayWidth / 4), y * dayWidth, getPaint(curId)) if (curId == todaysId) { val dividerConstant = if (isLandscape) 6 else 4 - canvas.drawCircle(x * dayWidth - dayWidth / dividerConstant, y * dayWidth - dayWidth / dividerConstant, dayWidth * 0.41f, todayCirclePaint) + canvas.drawCircle(x * dayWidth - dayWidth / 2, y * dayWidth - dayWidth / dividerConstant, dayWidth * 0.41f, todayCirclePaint) } } curId++ From 4a2e63927606a17770989c8c54e74942f2eda606 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 May 2020 10:40:16 +0200 Subject: [PATCH 017/144] fix #155, allow landscape orientation on any device --- .../simplemobiletools/calendar/pro/activities/MainActivity.kt | 4 ---- app/src/main/res/values-sw600dp/booleans.xml | 4 ---- app/src/main/res/values/booleans.xml | 4 ---- 3 files changed, 12 deletions(-) delete mode 100644 app/src/main/res/values-sw600dp/booleans.xml delete mode 100644 app/src/main/res/values/booleans.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 93e076112..87efc1937 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -5,7 +5,6 @@ import android.app.Activity import android.app.SearchManager import android.content.Context import android.content.Intent -import android.content.pm.ActivityInfo import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager import android.graphics.drawable.ColorDrawable @@ -89,9 +88,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } storeStateVariables() - if (resources.getBoolean(R.bool.portrait_only)) { - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - } if (!hasPermission(PERMISSION_WRITE_CALENDAR) || !hasPermission(PERMISSION_READ_CALENDAR)) { config.caldavSync = false diff --git a/app/src/main/res/values-sw600dp/booleans.xml b/app/src/main/res/values-sw600dp/booleans.xml deleted file mode 100644 index c06e0147e..000000000 --- a/app/src/main/res/values-sw600dp/booleans.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - diff --git a/app/src/main/res/values/booleans.xml b/app/src/main/res/values/booleans.xml deleted file mode 100644 index 9f60d109a..000000000 --- a/app/src/main/res/values/booleans.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - true - From d793b011dd3d0f2473e790d82a120d109cab7091 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 23 May 2020 18:26:37 +0200 Subject: [PATCH 018/144] align the Reminder Sound settings value to the right --- app/src/main/res/layout/activity_settings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index a0456ec20..54cc36913 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -203,7 +203,9 @@ android:layout_toEndOf="@+id/settings_reminder_sound_label" android:background="@null" android:clickable="false" - android:maxLines="3" /> + android:gravity="end" + android:maxLines="3" + tools:text="None" /> From 2c2bfcfda05992fe2671dcf80bd1b58cecc6e483 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 24 May 2020 20:48:58 +0200 Subject: [PATCH 019/144] refreshing the app icon on devices below Android 8 --- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 5187 -> 3287 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 3113 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_amber.png | Bin 3164 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_blue.png | Bin 3108 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_blue_grey.png | Bin 2788 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_brown.png | Bin 2763 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_cyan.png | Bin 2989 -> 0 bytes .../mipmap-mdpi/ic_launcher_deep_orange.png | Bin 3092 -> 0 bytes .../mipmap-mdpi/ic_launcher_deep_purple.png | Bin 3103 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2530 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_green.png | Bin 2987 -> 0 bytes .../mipmap-mdpi/ic_launcher_grey_black.png | Bin 1809 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_indigo.png | Bin 2973 -> 0 bytes .../mipmap-mdpi/ic_launcher_light_blue.png | Bin 3108 -> 0 bytes .../mipmap-mdpi/ic_launcher_light_green.png | Bin 3082 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_lime.png | Bin 3096 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_pink.png | Bin 3083 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_purple.png | Bin 3132 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_red.png | Bin 2869 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_teal.png | Bin 2804 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_yellow.png | Bin 3239 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 7480 -> 4115 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 12542 -> 7659 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 18409 -> 10440 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_amber.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_blue.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_brown.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_green.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_lime.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_pink.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_purple.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_red.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_teal.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index ceca9c73cd564238481e02c7aaff754f05421d06..221cdf24d1df1ce653d4a0fae9b20be1c97d78b7 100644 GIT binary patch delta 3284 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 STE@fx0000NRN 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 x1~bjGjOiy0VD5A)GKpT(zA`b(}c| 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png deleted file mode 100644 index f9139ef03c0381fdcba714bf229cfcebf5a141b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3092 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index dd943776e229423118ec680902977f4439494659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2530 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png deleted file mode 100644 index 481305805033a58deeab1d02f6712a85122242cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2973 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 T%Dg(@00000NkvXXu0mjfVG5)r diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png deleted file mode 100644 index 41c04f1d5ddfc6cfcbef96236b5f76059c3a08a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3108 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ΜxJ=KrX%y=8*vfQo*7%%JT~{1NKdi z_fDt2sLvtA`Qca%evn%c_aG)esJVO2}V`UA?l zW)tr99y6WFsE&W;9=^?}>;7jCxfP*Ep||_p#QTY`I`sdCKk&GXFB?VA&`D~>F#Vn2 Yf4gY2Ux+X5vH$=807*qoM6N<$f-5x0RR910 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png deleted file mode 100644 index 60623a83bc4b803af87bd654bb72d014b8ba5e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3096 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 TUY26p00000NkvXXu0mjfrEXvO diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png deleted file mode 100644 index b34d325aeda65bb7d0c38417c2ed12c09127ff35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2804 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

Qq!f<=71 z$_df?p9WK5D3k>AF+c(wB5=O$v;00G?#z~CMeWyrU%td4pftqm*GR5)CIVVhaB!nP zXahGwo@yHu#_Zs5A$A88sQv(Ye;MQkJ_#3NUxSNrJHSZ5`}|W+K;8*C6sp$4#i;E( zqPOGcjgT9(4(dx(P#)?mfD#5-!JNX27!(9xZDa}B?dIkXU_9aBKA>T{rV~KBuO$uL zsMsG0!e4>5x@;I38FrwhG8QhLQb1+ePOw=!9PPFn?QkXi4JZv(Kx<_rZem>ySWIbP zjNA+jrD0Hk0_x+($cqA6&O8>Hss*8KygKuba#vK>z(J&)Eq$2Dz&3(0VP$ zDG(bg;-KK997>YjL;>B7cAK>m%97uJ3#a5*S|mC3X|2(KAq)kSgu$gSUV!NTB6$K? zp*2}y@6A*~XFAgz{Ga8FLqO^`tCr&?W|@tE?2zqXu5}jBP#y=l$K_C*xO0Mll0;ul zT+^jQr#|Lt4dkmxfJzXca9a8C0%(tDOkmm$zqicYAz=4k7BA_`WU6N+Aapx4n{+Td zJnTSyX$&WzDB(@8_H{Vgt$l4!obWmr0!Tmty48pSEhe=?KqU&e9`BmGD4-qZH$}>7 zeK#$7NLtU`-JZte&L#%3Pd^XIhn|Iq0~;ZH|3-*9_yS}e`5hMn`r~UL;k)O#XOW1c zL(fC*$;UBGDnK3ZA|(0yK>QCrka*Mw&K`dW@`i0(kt&6L})e3t%Akm}eMrUdVA5 zN{RWUr@h`4>+i|R38{dhsLfDcupcZ};yJWkjf3ksA0Y__OetHzQW=JA@jNP3P?Nd^ zsv@-)Cmg7&U7E>g0duEoLmmgl@kRR1OZnfPmq=0p7b0JQs-jeE&*D*( z0>-FqT)AAK{tCa#x6`#;dk8nOO@a$K3n20w(%6x%GfJpb$*LcByN4?wVDGqty`bnG z&7qZh=v@re-s7zxje-2&^^o?z)e!Z$Cq(?$6Joyf1oh$7TtSw9LI%nEy&(Dv4-TmZ zJkhmeP@z(Q_Q-08|H=bmuswdC2b}-j3ofdja|oaym6Go`!;E%kC`VgUScv>|`Det@ z<@+JYA^DMpc$v{vERX;iys#4D*GT@(I14%I{sRniwFCHZ=p8-TQK1v|7tc5 zy1$lx5VICO%i}-OO8~moV4qrpKQvS%V3tyF{y#<@k*>Vim7xStYo{ANfA)L)?rfruhLx5b_(22(0O;ooagmRhU%cTu%^deFX>FvRCo53GzLF2rfZzuE}#K&Dz* zc)}w^umri#h-e9NCpzFzb=Z)|lN%$*aBU*FCRe2~1|_+RG~-C!hT6}6=bnZfRuPv; z{eGGsIPONc>khAqz-pBfL4l2X#i%qc=-f(VrANWZN@7==6b~#FFkp#1xs9;$9>js$ zaevI8(2+#AMSt$Lzb#d6Bhp-4NQ7`A&hoM0YQ@J_mE$)lyxyc#N!g|@R&EQ~v*G~F zc}wJ_?!++j?jk?j_4?93SA=*O$r_ZQ975FGd;C!nL1d?2d1jPq8!8WIhow!5#1)?O zGQR((hj!3hH0P|{W~#uB*~^d!dJ`ZI|8&LYHBmBC?^y-}i|{d$#n^i?6!w-xxxHCH zOOo7fM$ln|D~D4RTv0|KpKn326(KTH;D;-|z_ArH2hH`9{2PLhgUO{H{?&sE*97cZ zwx{Tnr{0__?;)$u4n8QncBi`ClFCpONu>Y>uBOM&M7kzM-jjROQ-An_WqW8W8goW@ zelDybOmZ(`DPr|&8qIJ|p&xG$R75Z?eD!84*U0H-OMP&?gmk=kSb?E;eej(s~p=}}O-*}RuK6Byc Z{|6ae5Nb=Cje-CG002ovPDHLkV1oLTE0q8M diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 5590c9eaa0c1b3d9afbf4804f7db7f270a1aac89..7b92a5cfd1a360534ef899dfd4870d343384bbf8 100644 GIT binary patch literal 4115 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 RfW!a*002ovPDHLkV1g2g$_xMi literal 7480 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 Z{C^08VMz`6fY<;4002ovPDHLkV1fY-i!%TK literal 12542 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 U?UxCzEdT%j07*qoM6N<$f{#WOX#fBK diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 79a9b4e5480fe555c3a68a615c7af918e9646192..10d722b8a2f895c67bf0ebbf3c7d6b11ce49eeca 100644 GIT binary patch literal 10440 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 literal 18409 zcmYgWWmHt}*S#|gFo3`e-QBIU)X?3as5D4Px8%@6mjTl80~Dk|K#(D%q@}w&fX_hPe+vyp9UWQ077*&C4+}2`hOP`=izR!;EW3Zs@3XB z@<#r12WGfIWRvGVq_P$XVF9E{arq|b=#h)(ddD(BVn(o(B?XeS6b(X9-lg-*(P!N} z>p=W6rZ!vyHE_Yj5*{AAw}K&4^L?P}Y@5`)cwIlZu6_C9mz|&8-{HZF#lYd_?Ob`a z&|SgX|Ju(!-i=#aYySV2az4R?6i~7v{@>^XvUNR_ZuLPay5@}cOM7_M24arOmZW&H zm4A$=o*7aYuNZ1;ET3#f9g*8|qttaI6Wi^Vvkn|GiB#u=3+yc}w9bwXRlpFvw(I>HqBbhlpIKC;z!Ol9AI zh|Ut_Tc+3T=Kk0zyLcPeRv5+`9{PQ?SM{nZlQ5ND*=nto&s;xSvj`v+-4JdF)etA3dzI5igG`35wcM#!i8gNy|Bbri**3q& zP)&SXNQv<6o({wyKB??KO@Bi)ZO%wIFgx{eFo$C!TFdz7k*0Uy2SuoH98HG|GH`XD zVYdp%l%_P$C-yu}{>>gPfjUFL5K znhfcmMPut5V7IBj+k8esu^fh|+)-^7e(l`HTydr|1mTykrHNR|>|JsUgPDXd4dIk_ z;gdARk|n_(VX|X^x3q2|$Qy4la_x*BRlp1)o7T=mJ;_4p-N-Xgl)m4C_F)b;EE>!9 z(JxC905kT5%3?R97*MZR|5+WP9c3fQnVKDQxD8X9FrW;hOn6x&=o+kCC=9_4Fj`{7y1vul7aO<1|vLw=m3eQTw)J&pk~iF*zCG??o5a#+_{~ ze`ml>%Qs>ijgj*RQ=kCw-w4DdP;d_BH6J2K8aT$$d%|G$DMT-iBw+%kR z*~!mV$Ldyy*$Rh#w-mhGQQ_-U{!N#0YbTNCWY$GHvGGw|A*7D{C28*qsW7I`bzXSg zR}c+|GAn%P3FHbfpqgxRM`FIMk>lM z`%ftC_WoS8+jfGIL1_Q(pCFxdU!C8LkBAN+UUbed{Wm2~97UY;= z(5J3NWcOP&1zVt&sXz0AcC{|=TZg@D=({`YY=&jBJPoVvV^zpAg_r$hqc*kcng^|c zQnFuNOZm1HlYFk*=D%)t4aZ_`H_U^a5@vZKEh#$KUGZI#l-plz?PC4dZv11%TzGJkPbD3Sf5;@0k0V+pdvM}NU=tJIis3!sO}6NlHe-l#KFH zLj0;f$v$~8>{&|&e?pcdvYJlKxSp0qB1JcJ$Ka+_mOv0qd#wH*+PZtIEcFhNwKzwyYv@ubw+J|)OzM5J&a--e$5ESOtvY!6IV5{T?<6F) z2pEQgDrjdRZn5I2E*a1uxR3G>F&%B#QMALEsJrva>L}%}q~=9q7XQ6YWbatI!OBcd zH*dDg03Fgh_4IxSSyLOVIP}o*CU1S(6aI|^PDgFUwxQ%2sNJ9rKA>YQme!iDSy}%@ zkL_-G=bue!hF2BeutFcp5#(H~p#9E^VGblAlgEb5_-daES%*8d{=O?K#dpx37XIo^ z=zUp)2oI#)#e${f9YazssPZephq4sZ#pzP0j!>5Dd3XK40o)j#NN+pSj4du?MCS5( zLZ47;kUN*TVqbG&{7M2(+FAvD^K+c^4a5^i&i?S^r*QO-x9c9hM(nLm=EA3mYgTeh zA(dLpe%oHqVNUaosCYVT_h=}Sp9AT5615vjI33=rH6#TKYfr5_$)=s5iWrAZE9g}Z z61vY@Ft-_hwDbvz&zT)4%G5R&GVQogb8BYL&5($v$F9zUTK4A)Ws{P}Jx|rQ49>0RM;-KL(!fuXorGUg%%Rjf=>IOMl_{U2mbaOVW9enynxk^#z(N{W< z>SUc zll4^%A|(Nw^052;51_eYkywLfSE&D1vCpJHT=E$i?Wn3Eeb+A|ClHFGV zr0kM=9arCbJhSCG#^#$)StheD;g~iT2p1+gn8_Q_UmDh7sc#rl3F^xP&cF6*u4Sza z%2TvjS7&Ctvik#b)3s%hcrw0)EXSsVuwuQl>BUX&=Mn%tXfx zpLyF+%#7?mDa>B8>a>|KwcHwMl!zj^K^NjBmEghA*>_g{{b;?`gtYWTun|Ovgza%2 zki=_es(YH7*C-s`fVDL;CBbS=PaAhy7y2-LDLA?l^gfoFOk;@YQU;+Tq#p@QBK6Fr zaam4Uyn6I;*uFaT>C_)z9TE^92Uv~xo1U1YFjE(4v}_EHI==L0siTXQhk z>O=?5IsZVp^X*T}NdzM8NI@{NAY7;N^z|`cm72z+*&O1>btL4zvii*a_tM*76RPP) zrG)jcy5aECJ}#hWNM#O(6fCjgF6%y|Q-Tt~-*8|sUf}|MAbNmz5IVjKRLah6Z-Z*V z21`YS+PsB!$Q)_1Tii&{6-4%59_NvIT;pXox=9t2zs z|0(Xlaq4?RdZ?HG0XX~07q=C2aPI#v@ZdQ5_~4kM_TU3?Ue7DJ02(*WnXBX9{`aN2 zzik-q>5`T|+{vi8Z`AopPrHy|HM!V_3QVHwEKeJ-;LFa7_K_U3&Ly?!E-EUK6e0 zeKCRgv6$m_Tj_Dn@rJalt;_y3WX>P|Fz1NO1$P*?lG*f^aGoqu_rFj33TSfnaLolu z6Us!f*739}@a9weqfCka9F%^lgiKf=goyL)`E&wFEqDbCRw1~7q3w^h;7i0`?}9N!tL{~-LF(8e#W5Wy6lp9eNVL52EN8AQAfsa zd1g_<8bd=!oOl_u%;3qK4LV|$=8t(f!C9Q0KV?Y5d=&l(>`T1B(K%Ua1J8>{#uS0Pxkr zX+$GCU5~h`#LAF@JNzm!POBK}ul!Ax^=Rt7w~8N@c)KGh8U>?7rp}n_cV4yWg$-9d z#RjZbvaA!E+-n4Y1MF&i`<}^CD?=)5Ces#i?rs70;-+wg!kcuI@B(on;EFRyy;Y!# z+{IAUm$4}3If3Z5xd|=rDmcLst!n?9zd9s^;Z>eaZbxee#TvoB)}xM_G{qgrVl)0H zCeq=f0kwC^O)p}%px7)j3TJmxq2Kb0O1vB6if#n5HD_e=| za8l%~4XJkCjC@d-%tK_B6N&UyAZG@zFu7a3qH8(w5v!z5elU3lraiLN_KsZ1<+*S z_(;O;nro4!K;vhTK1IW=A+NxpDnGI)4R}UK#0F!41YXljV%4NUfKsP?*Koi(76OfXLGZ;nCA=Lz&d&23ccw+N07*Lsj89tup=}mqp z=((t73h5THmUy1FvKKGUc@+VZKO}{cFqLT@S}m1|2UO?9ufX6P{hnkXtvGoRF3#{0 z6{GRNM|0>BZjl7`RQ3`Mm1N_Vt_ zw|5Zk#7kjewG261|6LyKkoS-xpfMaM^aj041{C%o`C<`78Z5{_BcfIPm%851r90bw zl;P4eMvV(hgPwO*5TQJ(*dAQPW>PbNoFCYNd?!KQ+1}`{FkRs3eCSdG79x2(32qAS z!S-R_Uk|{@W8EMH_Nql^aYUhiz))8ZN-YJ3DUq>;R!ed9!+7KUcVF;Rx)rvgoQz2@Q>m!Oe++=l^9ur7y7 zay)h;Ru@espKfI@J^rmCrZc&85Eo7MwAilhwu0b*H|Vi+%v)q zxK=W8CqU~!6v=tO`k`v&sre>fXy3^IU%$801o!3Ufh~!ucVnK9(Qn}5L}67BFqs4a z(_pF5uaw@3}Y6CPdCNiUq@Jk*>mAUx$>L0K2sOooVS12$}% z_NJ@We|;2O*Ze53sMq9wY^?``{AzeJO;;;_06`cQ=3LzQvM^n!BKW~pM2__pX*wvE zIC)CBU{D)k8w=weNhsI&fQ41B{jv`{R4K#r|I}%M)MoQp=&#qV>io60=(1(p;utf6 zG_7YB)FrZPCda8S7j{|Z0|0e^HUSL>QBTx^Nu1UqiV20==})| z%_F+pBZ(oxCzq_q(TIL7$qbF$KoVf0n~cCZj>xq)@85Ug_G58jhTlsGhIlG+Ln(7h zlo=IN>)_A2!swftk*1yuds9Z63eJ?^}F3ySY$#F)cp-X(f38_DP6EZ>ec-c6y3-a zEf~A;CR}&(5Z&I>*lFQc8F@edndI(^A=l4PnU%far0NjWBf|SP!~{RZb3g?;k82)X zo;T=Wax_h(*KP!sK#jK)jhq=z%BW>)ZT@r77P270E2@B@E0waY>P85!%wktkNa5LQ z!ac9?q7*c`v(0y;R)n@|-M|hJWyE@$-D+oVswL1w;1r5(lxWAEwR8NMF5^;IY45il zIp435q5ID=?`|!`qw}O$CfGxKqox&)+2kJ2lDEXHag&4``b1|*- zBdL5puH4GbLs_6PZe8t;}oFoaG7*=rl! z?mN`uK=h|2pM6KEZi7mLLMoPui_OaRod#_QTI#Q92_&iK(`=V~8Ik?{q^(H#r z_c17&1>8qxK)me6=-m?0Yo+VQ%p z*$Sv-3rNr>T%_i-U65);cEGLg@EOqM4AzTBm+B*-z|%hRR0oT1H+lpswSr)wqo&WB zbxAvwUPUkPx-H3(Uj@p-FF0yry69KI5~`3C*;aCP*%TVJR&Tx6+2of|{0n zBq%or#qi4?%*tY_M6-h8sTg{L_>@tFyxsSTbc)nR)Y2O);+0~vjUZ(m1+3ckHydiO zn+i22{nV*T7ma=IfkS27IId7v~Xi8JL5_RYbsri>3nBI^lCFhp*H z$XabvfIl`I{Zt+J-VC(X+{oY|4hYJIn5$I7Yn)RtpVYkB&INavA6Ao84MXf~xR!}Z z>gkUXAfHD^jH8@Dwn+}k{lsm4*ZB|S5bUzMBsVY56KI*vkp$_P*S6*JL& zr78E#l~^KAkns&x3??LE@%-n;JqG)5wUyaQ1dH^~aYZU{uNa$la38{Om?aH4+?)}P zwS3acM$R$M)VM7E8oG3BOqoqds}hyMukxJ{h@vRY5*80y(|-y z1zkL!RxL6t%2P?k`q*1j{lgD@iNU4-=S&ecFylU@tp_8=QQVE=s56gJCs2a3@(>ja zklt~9;b|Cje0lez6o+o$G8!L%5^tEYgCeV?e~8I8y1Hi0OSV`)fg?mU&Kn+cv{2Dc zt#?|Kjp7{8Tl{oX;A{qT6g?LF8-N5O;3fzf7{JmVKn4R> z$640fdzEF3;JBgWxABhWu|D3Cp!XSeswjK&<0;($5DK^3C6SeqXNUvI#{xKA1E^b~ zwmEDwjfp{LS4p5ptWU`QIf8Q-A~JdiaGI3_d0~{bJEF1+*9N5rg1Bsl7e^tDH>vT4>U-YIDmc zPM|V;vepNBy?)SMv>o=VUv?0O_Hx2w^D1~W-4@ampa@0EF`MxtwFCh8rh2?vT)Zd@ zz4RZcV>bkf)pq36k9mP3h2OSvD(r$9T5fMEsNsAa)~-zq>L3ScsV{s->ZfS=33-mB>2On1agzcT}_lmKe| zNeA7LK_)N@K;@FZnBXofn=Srz@PRP{n~<2rFcA0U!T*{9DXu@lI6DtKS&&!^kQIWf zNfsFE17iQ#NihZ#M<@NHX7JGEJ|KMYurDyqCVFa+z;Y9K#x)Tvj|pYaa`;ICqT~Gz z_zGsKC2J1lbJ<-(PjMmDCafU3fy{)DO3#X9WauoEkdaqds~TS)9O!OFamTiy%jm$O zQ(XioF{F5b9CSmT|3KEIqUC|dI|ErG`IKS579b}&K+rl*ySHL8ZWihO2$adr-U`Rx zRm(8Q91FDn@`O-^1IolXP63X(pzaoVNoI_@T_x}xAR+-3D;t#-hOfu#afvpdxGc#A zEcAUrbc-J%C{-qZYT{&YUx6~6K;2UK=tgKy+rgpW)#O9S1hTFD5xvy?bZI#&;`h;a zAk(Ci*AFOp*-Q}d4)%92Q2>c89SpLIw12~ntdI4VrPhDa#8}M|mnkPS2Kmv^sg?*y zk--*xh6ezL9hmTmD8*l;PAo`lCBV@YlCq}&++;%$nkS6D%wT4q0Xpmjsz_GZHpnfU zEDR<^BTEJ$*R8ApDRf6O|Isc$z#!z6a5=Gjy)PJP1D^eOjQ1D`Lq8NDiZsv_0FEw{ zR{~bWEEH$%nc}c%@GV1Z&7KzW(XV6y=ilMTXB&R(fD}Aojb(+@>J4sDdQGVE0rJ<8 zGeI7<&^h%)TFQRD0HC_h2G00}4HS=Tf{|y?zTM2K0)T=9WE)wY?eYSk$wZts0g==j z`ao=wBqEHZT}lpZ#il0u4jmBQs%A7(F6y*i2bf#FB{dFMjQ^BPo!Gd%0|rj*U6GLL zcS!)n9@LT?p=61jLQ4$=O?1UyD?Txu#m*PKB9_Xe_T>P($Hg1GBPr9!5rrKbj6xO( zOkGEw`W!--D7s)1GLraTr?6K{ffXY`<4nXRGxEIxusVltDL{!fsDfB}b0ZOH7W_a1 zHw4U7qKD`Ftt`)qVD;z#y?Fy4aywNARzxNwWyASV&12X?f(S577UBAqfC=CjT|l)c z0e0VHfeIWiPGrQURtOJrRg83pixPl(JR`>9LwzPN-O4`K0EAvqc!rw2H2bF0p(nzg z@htM{0PBnxi8nF5wgMpl332-8is`sVzG1Yqg5jYJ4<8Pb3_gMelq6)|WUHGNUg|A8 zh(+Wj5aXYN&&<=A+TL)%QJ5UzsNdRt3QP%=MT0X`Axxe5!-a^ePYFQ!XW$90WHQ*1 z8~IiVh+l+SHq(OWj+l_O=a}3+H%?@#M!#5R#G!?82=HL_h7GVer10i{{naPph1G&3 zcl=s8P|F4yEC4%%Cm$?_kL1ZE$H&J9u5Y(YHzke)0*l zm`lHyZ9bD~l_;cP56l%IP7$BsK;F)_ugKkF>a@6KvX!$}o=SXecVR%tkhV&9Z~$Bi z90moO{Z(-+?T=WH=Z`Qgo|JZ+bL)U$-Sog>}Tp5|iIU^Js(Q0vd%1KsD@7x}_|MBsrP3z9> z-w7+S&oFEGgz6zmqA$^ux+wH+x?GPYN3hoUeMZC2S0hd@X`+v|j#k>~}XvmXYs2_$?gS2f?(Ig2X4!ElW8ZU# z=?cG}>d_eRAdn+k|yOp=XxkrW6p;xtdx_|9T-q_a_i-Lfsioas744(_%5zqQ| z#&cjgyf`pRa$1);_Cp&PcAn0Gt+#v_BH@s{m9A~=%VojLqvur_M}k!keFNECA3X3K zM?HB&g2X?&$zYU6di*>05|3ldXxA^ki}W1+n4)U`O+5-}A37$&zWIAQJ=0h{vTeJ} z7$BZ6Ja2i25J;)Bm9W6p18v~GLr2cky8kD!ig(82-XwDh3L-(CNMuQrEp3CIQu{Jx zu*m;_T2foU(p4w}gyBfxN9@}9I7AayS2b_A?tT#PKKb_*^3ppl=uVNcadBgs|MD9H zg><=i27@#FEz!4M(>)sMPS#{Q_8j5D>z`!?y_fS^UZ}lF`dJpjbeXymy767zHp`;r z)zP8MkiQP2u(mcJzj^HKP{V-Wiw--aI2T@}ZbO;0WF3ttdCPe}UO#-Ab^HxN8avaT z3OqDq$fdc2{BdGQDvYgv-RX6cp>{ZeBA(6941um#{!C{qM2J9Is`CntX20(Qto(7I zdHI{EwUV&79^w7u5eA9#Al>ruASYJ1k~Z6bMpDqi2#?^=z$3joMYbOK&kxDa1YUTj zo?(j=I8OO?F2Y5;?Hl&U-!6@q(VgV?8AlJ@FOvHFG7DNmY$yu(;JoF)7Y>O9%K_Ck z;1JRs?mv%euBA_}!z_oMZTtB=3KZGxk>Jwon}Sp%iRq{FMl>oy6z9U0B^pYj=(6ze zETtIF<$}Z$orT*zQjc(e%@B}xJ^jS-R{58cPguhDZMVTQ-PqN=Q2?0!z$3EGzz1SDO`g!;M?E3}c{B0Cx2%H1x@}fJrX#iUxpf3d|d^BF@Wh9E(-nLHbt| zOa`NX5Rgw2o?ZV=7y1wMu>$zmimiWT!@`QaJyuqd9vxtRo?~K41dhCxCFpz1DEnSLSqreBiI=c+)7nDchPo1#%DH;GX| z7c}1;cbFNRzmaUoO#t}MHJ634{`rUM)Qe|Btr=+g6EbnI)rsD|NU_k?Vg^69V%JEt zjhvr*_Xgm9pUmjm*eG8o$A01#8&g`Bwd1K|@{XtkI6WU|hPX}MX7%B6!Sd9^ z3!8LeS3JO5f&AgB#Zg}C*Cs*|oj;&V;!$`&U+R#(v)4|in*a)$#grW$DtK8eWYn6Uo^Vev zHr-6WoJb&+|3T3kmD6-#%DV|RIA;ve67GW;p-X6ueN zrw+IoG8o}QD5F&$q#P4Ix96ig17dF*Sq6Tz#&Lz!E>&*Z{|EJRciv{nX9dAKT1-^T zVc@fkx7iE7B%ir&ya)`ilkJdY%J-o&(ozC`#R4A!nUS|T8adA)S66?k)4-k!S8asY zf}*OrfM0M9q>dm;OhJUi2#X{x>5*!D#83FS88FCD%9hl)GKnV&by_oq@UFjElMW~M z7*6eNk2$c+^HCQ)#tBcvvzl7UBasV>NQOMMFR*{F(97d%k zc_#F3Y&R|}?LLZp<=2gKJjkBcBnZiK%(ENDKV5g@@3#O^&|fiINf(t+2q2aoCFfAl zQNrvHRDB7$gCY`u^0YszHZSgfa!wCfnn+>g9ieu;zZ>pBO4cI`3qNPt(1X}Oqj09r zG_ulfL>8wS8N1X2q{)kIuynAdbbGPeIoJ4O-_xl+@MPG(W5!&5{s41IW(N!06W>q> z_~W{%Rj8-}ZV-T&)oL#+hag|NUvU0j2n(~EG@!J?w_W*j8dhe;R%T{nMB2JbEu$y6 zhGj~CBZp=r<%*x5dD}&^uBrTb1e<5@liCoOP()+*>>%UZO~h5YDFLMmSD=92*g(H6 z8(vY#u$Tat_i8=!%CK1fb(5%i!&h0v3y9v*#<#iqBC=L#h34FAG8%Apa4Vb~IRa<; zt_JgC`EwosmGOScE`b3;AxvL*x7oy}ibbqLw!|@EW9Rxz{<=12u?-YJ2DSmFcIEg1cU<8g z1ss!3{V&MJ7@=mBsH((dCnH+#%@iT0tS&|FvZ0Y23obouTbUNmFC72D3$j@cuJAlr zP(a!Nc8V$lp;;saN0u(hA!XV{v1xK)XNHtEPiOAYFI?|qE^Y2i=&i~s=1Z8rDBg(; zK2l{Bz>&Akt^%ulTsz#w(-z@Lyd(^@W{ICc#a1^+D>Db8#2VxYKI--~KQ?x>#Zkyb zV1}eIcw6{`a}-WY$if3j3EoB`!sM;dSxc61+gD^ekH`@@PaZN;8M*v=REFFe9Nx6UGZW`lsQ$Vsc$f5R zyb+UgzXnC^g$S!r*Es6M*rWrLv=6rgmLV&|vH{me4C{oc{0IMCv{#*mf(KP1ut1R7 z?Qi(Vv%6}Sm!X?l_c3F<=*g+c&xcOu)1byvEY!Qs%kkQh?nf^T##Z$#AV4$1`ol+A zUk5c(ZJsW97d@CUkzf)pXIEHV4ujdNx^Yyd{$xcm2e=LwIAs1oEZh?FTx+sKWNqc? z)U4H04~|W6GYK*Pr>V7{Sd%GUrS@ohqq0Z3b8HK3Jp7{lAXG{Y7|{F%Edn>OdI1{z z42Cri!(t;0>8?+MvSv6wy;mu2kpC}I;uDl|DEok&=7Wk>az#(xutTkm$rxR}+K28B zRjEM!r^WFwK2ni%&aP$}knaN)G4+oOF*E|X8FHK|-2asqkzrQ7271x@!;>1XYwjmQ zkQu}d60P)3p`NxsWkq`!L5MUewnE1jwBA;s6lO2suPth{Pv`RClV$4QVvAq)Z>%^d zl|a-*b01VTxW`r*ASssJH?1%PdXPaSdKCcvEyiu0maR-m25tR zW@0qwU(tE$7ZlwhR3 zm6asEWfTmN?FD-GW@JPUJeId0kAJr-hqd9V|KkF*czEX!{I#;?Ddli+cTKBWX7HTu7Qwn5o; zFJE^5+fdTqBKYk2%GSXk25)izQzIM!{nA(wK@(109|XG&PX>Rh1iA|^)dE2dPr3y$NC2pLhM+)GzXyB=z(?t?*vzh~JD{R|##{5H! zxWZ+UfhXtm+y|qly{d&?QQe)I{u2=IumB3~W=qiQ!#a5aDzX#h_r#8Uv6f1+mp z^9`1A$lOgS*YrwilbrVx0c-&<=bP$@;P|Pnx7lRn(PhF5sFlC`H4fDD*aIGRGt03;CVaAjC3vzP z4pKk7chi<1lpvO+#uZI-s$a+b{6{Zd8o9K(U7bDoR>!%H+san>rAr#k!+;aT5a>3= z*5dMFPO_dkM|RTgvk}eD9Khj)5+xXFG%~V&XL(~0GrB!umhc9Odk7LZi5$`h6AGpC zj6jbyeHY`G3f}I1uID}0cS0EZft}p?JikT4>%_m+dFz|Rn=L;HFPsjou)`c=Xz#a( z+gkhJ_>V#3c?{3ZYKE@&1*{v3Lo*TIhFETFhb{Z^FNg7*=K;&S{Y+Aio^81QZvKGx z6lL0Sg>Z-WVrA^`f?d$#4A<|@CAW{Cm@;`i#jO{P_;z~0)ymZRsX+l^#&@Uyyjp-h z6z3KcCyITBXLr9k6D2m)UqjrhmHFqWpHH$}^uDprsK=o$^h1KhiRIrSdQNDtG1}1) z8pL{kY^|q-FmFr0T&904Un73{?B`*d33>aCwJ2toVDf05r&SYJP7eLdbC=r|MSgto>ad+E zdO0u*xI0-lY(@Ww@Rj{*f*pFULGCGQb-Dfby`xLPp!=&Q*{5*yjsbw(g=K#ZTqz$C zJC3Bc@X+F2{KX=QJ|@`-+rOpHwkm6yY^5MaoC;c~)Tl-mjGt(vpEvNusm0*Hk%B@5 zajO4>*46dCe&sD6Ja@4t$W=Si=A>P@KZO1WO*HntY0jd)pIc0@Kevu5d-C5LLWEYN z$JQRFLrjnQued|}KEeCtd@vo|;rHp88gBD-7jLUgGEP6?RYw^ue_uDdHGsNf_rEt_ ze=#m7NCjktGql@vezoaSMr7al5Y>9*TJ2bb=2v^CXZ++&zqlKI&+7XpH1@~S^4j(^ z4$enE*T}Fkxb)utwYAwt@R9A!$A;}~E^N3hk;sRVdP5b^#or3`cnf3V;?unW>dMad zxN<8?llokz-uSfGaS>WTq0qBvHt?&4M!lC`3BT0e7Jh-^RzGvu>u-!%Gl<8nR!cru zo#fEy^D&4eId3wm6UB2YX?T(yMVDNJiyJD}P@4HcDRMmiw7|hQ)Gi5eD5yaa_YXKS zPXJq1B2QcL8F@=3io~Uc>vJpkSfTDbxIwaQoTMDiQtgZq<6sVWn&Ecp8)Y|_zeije zLM%npNbx*xsXp8PgG2wb#U34SZ!M%@8y_2R&&JHAdba76;)-)bo*Qc4G7$?Xe zbuBp<`{EKjNVnfsHig4hB6{7-Pvk3mcD8qAoxx9+bs1MZDa}ta2R6i0sw-oZ8gBg| zhL}IS+SY>;sc_Cv%)x)wd{C_+x2qR=7I~Yd_6NHdGqJ6Fn-JO~6I~eQ zMaZj9P^`ja7t%%)8xB_A)9#?`BU1g{!5q!jyoOJLeij2qK+(=-l!HrNb!tYD>v&#H zd~5&VzwnW0tnwES;x#9?<^-Dc-ZOE)sQc8*8;<`tJM!?QerbHIK|b%WBiu7}3-~R=)x_rm;JHDQrRL3BuN%``+T6>^GGF|0?3*n1ATT0rzuFmK;3GcC`q1X5ed| zAfy_^Bim|i`p6V(_;|^JDELDb5Gl-;3?9Oj3C~?7kBMXAqv@k#eh!}L#dh!RfINAn zS@dw`oQzX(4yH)qUr16N*04g38xpaqBb2;bzn*Wt#yFn59)5CFSL~U&SbijSAB1g1!%7H;n zT2yS09KvoVc$b6r+h?yQfW8R4IwfkqFT!9W7aVcHmiZGu*1xroCP?wRw7MUM@WO3*SE(U4Vd% z^&`0Fei6YE3zdCW(3Dt^+Z*C@M*G{Gm|`zkrH*#i(9`Ye1LBc%^o1NS&!3AF%z3)c zg#7BEN3+-f)bC$)97kabHpB55mcyoQ9N((?d^$Ic@ftB*YHJs^$PYNs@HWqXOGp~v z?m{-_Zf&$;z$Q(wf)#Xo?L$uk?#yRG{!0UhB;d#o8{2L7q8|>coU2?5iQ8Pw<6qEC z@^+s4iQ%K{@uw+@(BDH9v3xo6%e|u|fRYqWM$6u+BKNzF+smT@tPrg8X{)Zvg%=Wn zKPbq7K#Ax!K>FX^j|`dGT|+fSU#r%q8&&l)#+t)5b6@&&qo8OjbKu$f^KYZ8yGxR7 zWA{YFuYVvskl1=60|-|nh>=O$hIW^~HZ5z_u`9RRFfFe;Jw2~5157m_OM3ab%7a0kSL2}&d9+68!RT<@XUOkpNo$^a9cR}2s-@6BLPS?>XPK>S2N$*X+Z=LA zL5u`TROKXSp~HYs#vul~YZ#~kWpq?3NK*?a(s)`sw{nE82{Z zw@CGwa-oX|Px0{r@+H8D0+JGhMwg&=c+*O}62ZuD`*Zw`_6ti=CGgR`H(~@fy|YTB zB3)DpA7RT-PC6vCJ2}`4w)?^)o45EX%3Ota>&%zPe)-o;^ZfK=jhzSj<|;U0BY@_3 zfUC$ya$|{&1BtO(y0}|Pv*^ZrOCNSNpnN^z@_y6?{h6kqe#M1+3;OV3C%=J{&%ZJ*Oz{q z@xigrKn^72JPfP^z^b7Vpv;;{4Ivd4l8z9pe*CPX9EaA?R3Z&Xnyu|8{=YRnOio6g)*r>TAvU=?{j<9p(PnQAqN~l0>(j!ha!VTlEX4 z3yWo45A8*lm(T;A0X$GP?T|{??=+|-8*&LRfExy;g(o;OtJnL#jPEDnUF?(t>ys#d z$HC+_VDR{dtB0|sdS`fke)YQ?cDT{O7IU=UfO-HDEx^t(^95ri{Tb$a)9yMSNQd`C zk+$92FiCn6(gs~vrTa1>`5I5`cWASuUpk zNpw_%`5&Kl|MELzRzS}F_Nh5{SA8m#Cdr=Wg^>CSQ0HX*w;?8lzVJ}lUVdR8kr-lC zPKnHA0E%&AD90Jj*?5R{N1}8J<^Jx6eB0o(Bc}6nb=%ZfBOMT0d9Pxs4d5 zZ|qnJmj^^WBVoMR!ilbs-@Q59N<|7OO}2KL(=T=RqD%JUO1t^JT*j;^S&(A@oed0} z09ANo1Y^y73sFLHe(htcXSEHdHR-2XgXG3?qjnyBmw}7)i=MY&v(`$Xl?or(kK7vz z1_^48Sac6EaJiU&lIcTnwpwQ6(LJuS{bpw{!MUT&=-2P*9iE_Ty+DvO)N0OUqYGvh z&`SHyi4&~KoB|I+t&lO2moXVQliDLbnZ+{umnKBQssi*sLUcS6Wf-c(Gi7`yxYH6u zX5HHJBvyzNU3A~3=AC;wl-Z1xD-dtUZDCz0ciX=v8#*!7X*y0x$EzB(Ot`+Z#_uS` zo^WzA>FvaXQ8Z}Xf1G0cDwk56Xt=KhQGh=C%@qX-N=YxGLW|6O+z2M#Per>{3(jJt z4InJV-If0+DlW>+JYB}#{X8q&>TH)h@lcd>K3n!PXcViY9#4vqj#{)Z6kYXE#6!R6 z;rfS*vcW1Dy*)T2+D%zvJdk`>kprDjaOaL56MKw=o^#%){k07&>u+5Ky=J}WD5&)4 z!&)E-YLdZ^{x0Yms6>9u&3h&ObDZrPmJ2Pl1)w7WEusjozTp-5Ev$D3m?^w{MP)WT z^~L^;P3h~^GN!!EM`ph@AU|~=9>Y;o2*?U89o0bJp6+4WGCzj1UA*{WA|mi~uo5i3 z;n#rvX;G(Y>#v|+-f#B4i2fB#!IxLO!?8Wttm4Ishlz4b8WrNrtdAPNG4^`2Hs2~h zJ7v#U+}R=a)+tc{i-gF#)TuyETCAx$#f#lUi(~Iof@8WZEU=A9XPK1 zn%EYGmG~up3MDhs!mzEjlL$LGnMbIY4=ahLFS9>L> zt(Y4V7!*kUX~VaaXTkBuZ2uvj^vftg_k5PJ5!LYd@@Q$<1D|)zkE4|x!7n_=>Y!xm zkRPcQb?*NWcMI~x#2ET#&EWKo;ES)_dy8y|RnUx6{B@C;8pAu8UZZPz-FN5=Pvira z>smg^WVrf4di`3PtTRRVL3a8srOGC8A4Jf{nz|i^q#wU{5AEl>IijdS6i`| z+}_G3N#^$BXAj~$TrV%bWR@p9hNHDC=po5(;?vG}|DjYJ!XojRL|!PRT{^F4=RiYX zbzgxzCbR7wuUkFw71>|r1C5k-kv0n=g9(3yz2FJ{8q~GbRm_Z-aIY20 z1b&P56=xpOj#aB4QKD{2Cm&x^vqCM0ENOPRQCH<@kPD*!8DjWDMpUH}BA!$OO%)M2887oP@u{H{2F^3=DRXxF>5*TwffWF7E6mjPcH)_12 zLY1ZG{k!JGv-FJ5kp8&z*D|~BAb53u>F1$UaEPv3tX}D}^w*Pb&7l)WXL;woDFsMs zGEJBLnUM1POtdMGu->-yrairc&yUd78clj zXiN}t_(wyy_32fxS{8IuU0)9?O*ScZChbCTSGk&>H&ZJ)cvk<4+Y7mR@)x2q98Z&s zlS^mwPt9FeH84rj_!Hid-PE4N)sf_HGEc!f;=gzcv`wnggKwqU{fv#9WghIp!lFul z#zEl{27UzXKtOg`Zvy;x3$0iM#}D~cp&v^oip>7J;aRi$pp!h?Zo#lV%IlkMWIU+8hR=dq-)Dv37nt8252|E?z~0(BHI%2fr)wkNM%mQcAr zbM*PM_c9Ucs+?k-uhdH2FSsA%?pYvX()@34Z{S!w?{SEF<&}*=)w0Huw|`Cp*;NC) zPd+}@;=zPFrKv+6Z+Sw(A<;%wGz7H9r;M&49hHDMiocH>T`Ms#g?~QKnmxD z)9A{kSROhZLm%r};*S`-83_&takNJ!JtuxCv<)fC^ZO`QzJA%5%ZcAcm^*My&8(_N zbII11dwo5`S%ISg*qya`^q~nii|&KSgzyib7aP>Z81c=^hPlL9KDBl*!mtcegipB; zN{cmER{$aaLLLqxv*#!W>Gewm@nHmjvXRRp6g;D+a(cpx#(BiliR3*#i|#OU=RR)k zG~w5{HoxY2uU~;8P=`xJq^K?*njsu_7xfQRLU{geW9N^bSH79{x?xxDAVUc_%zQ#k zHjzq;J&X*VMgk#%!xhx?i|>g5-~rPmMI)8#q_?NeIykmV2Nvf!ZvpC;10d2r!J-s7!A#6++EQA#H~}p^W_Y zRl}nBy$wfKMHw(ms?jhi5yK@uGPo0jI}t!pt|L;<9_XH5`mB_Y9wIm;ytk)qLCV6i za0UPVx^nch7mbTz{!bYN*FX>-t_?SJ1o4HPU(boTqxbqj8YwdKFkDs1KWHRI1jK!W zI+f8QCYzt|NV~?yj{j`0yz@gRLxvCoIL=3hGcsQq%S|OGBgAz=yetHk(=vN($87WVOy!U^17+;Zk`-k9Kz%@b4#uq()BZ>G` z`874`5uO{zEK&r<8GDzie1Ay}M!WvVn$6 z8=?{3o5(Uz&pQ!BF?%>Tpj1wtJ1e3?BfKj89-c>;>b3;cY|y^~4>Gpn$uPD{zgzugPs>*T+Ig;19} zauC0UoRz!5$*Th9k;zdEO>2a-AMmge{ob?6f4=KvNT1Qeus6NGp%~J#w+=xV7V3ci zKr3F4<$lCi>sscL^BiYV4V1J6gusPv00bw!w-v{1C>7Bg5DAcddz^yT4pwk>IE~&E zPwuMh{ZB_@`kQ|@e%a??CFb@TA0=GUMxzb18c;@|v22;*_<+I#{> zm`8L}0Af_(CQ@DIFUW#u(})P7S8L;dlqZ#c{rg4bm!CQtvZr-7>`v=vIF&una2cXY zTVfI38ILg3K81&d9~;3$LLcYqqW70gBgie<#~ zci;W>E5_^(o>P7qN_zONt&Ib3BfkyOLS*v>&H>Jalm0%bw-;v4ZTwnP=hsFj{!K0f z;Vg^rsXQv&A&UWQVqqrLsce#chKHq|_0a}ZL!Jb)Df|&-$e5>;x5xiO`Ra>~#_8X^ zYDk~b)v%ffWZQHya?I&t$Y0P`DV*C!IX`yy_Dl~dMky*R?i31 z<>xNS*6%wTSAW^jxb&kJjK9D2jPa}C?Lyw^Puc);ra@T9Qxe%9k$%@h@LMJG=3W)) z?@;yjBAh9lTb=l~fDnu>Mul43{%s(Q49&S?cn{gQ6_ARU5!94`-nFugc(N!2+HjIS zRx>o@$$RRBJolG|#+RSG)7a(dX2x!RZ*J@kfcH-{F?M-`dSe%HVE;kWw=XSCz2s%Q5 z$pq_Ot1wYK)SxnY^p5JLM}e5tNl&a2h);lhtJB`x^e`L~j!lVfqA~i`+>RGLyiEAU z{5Rjm&p}Oki>kNRqdNMiU>y}?F;w9uLJe*w3qdsGrbH7SD{szCjJr7*@8QIRh5fC# zKpy0dw!p(GJXnKo!|nCfyf?p(AL|}|?7Mke&3W5R_-|<_5xzG6&DHohs7bH)_WH|f zF_kTUB}6m8Blu8R2!(>n}~jpcaHPQG{|bR+2`HFi9lUq!Gj!#P?OD{i;YL zuf*GMMs{a}*GaFx%1sn%VF+=UB$1dUu{eXgjl6G&3!>{}*Iz*=2v_1zT!_UPsTDUQ e*9ouT>;C~(KXE{H1`zcC0000 Date: Mon, 25 May 2020 13:33:24 +0200 Subject: [PATCH 020/144] updating commons --- app/build.gradle | 2 +- .../calendar/pro/activities/EventActivity.kt | 2 +- .../calendar/pro/adapters/AutoCompleteTextViewAdapter.kt | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a013684f6..a2f9ae488 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.5' + implementation 'com.simplemobiletools:commons:5.28.23' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index 67609ade1..ab2d5e7fd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -1351,7 +1351,7 @@ class EventActivity : SimpleActivity() { (event_contact_name.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.START_OF, event_contact_me_status.id) } - val placeholder = BitmapDrawable(resources, context.getContactLetterIcon(event_contact_name.value)) + val placeholder = BitmapDrawable(resources, SimpleContactsHelper(context).getContactLetterIcon(event_contact_name.value)) event_contact_image.apply { attendee.updateImage(applicationContext, this, placeholder) beVisible() diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/AutoCompleteTextViewAdapter.kt index 62c2ab030..21321a699 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -9,8 +9,8 @@ import android.widget.Filter import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.SimpleActivity import com.simplemobiletools.calendar.pro.models.Attendee -import com.simplemobiletools.commons.extensions.getContactLetterIcon import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.helpers.SimpleContactsHelper import kotlinx.android.synthetic.main.item_autocomplete_email_name.view.* class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { @@ -27,10 +27,10 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar val nameToUse = when { contact.name.isNotEmpty() -> contact.name contact.email.isNotEmpty() -> contact.email - else -> "S" + else -> "A" } - val placeholder = BitmapDrawable(activity.resources, context.getContactLetterIcon(nameToUse)) + val placeholder = BitmapDrawable(activity.resources, SimpleContactsHelper(context).getContactLetterIcon(nameToUse)) listItem!!.apply { tag = contact.name.isNotEmpty() item_autocomplete_name?.text = contact.name From 10d3f7d0cee88fc5ccdc6f7651b3e3678dee9424 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 25 May 2020 20:01:44 +0200 Subject: [PATCH 021/144] autoformatting some files, no real change --- app/src/main/AndroidManifest.xml | 199 +++++++++--------- .../calendar/pro/helpers/IcsImporter.kt | 10 +- .../calendar/pro/models/Event.kt | 54 ++--- 3 files changed, 131 insertions(+), 132 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 65b7073a5..a715c50a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,16 +1,15 @@ - - - - - - - + + + + + + + tools:node="remove" /> + android:required="false" /> + android:theme="@style/SplashTheme" /> + android:resource="@xml/searchable" /> - + - - + + - - - - - + + + + + - - + + - - - + + + - - - + + + @@ -81,7 +80,7 @@ android:screenOrientation="portrait" android:theme="@style/MyWidgetConfigTheme"> - + @@ -90,7 +89,7 @@ android:screenOrientation="portrait" android:theme="@style/MyWidgetConfigTheme"> - + @@ -99,29 +98,29 @@ android:screenOrientation="portrait" android:theme="@style/MyWidgetConfigTheme"> - + + android:parentActivityName=".activities.MainActivity" /> + android:parentActivityName=".activities.SettingsActivity" /> + android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity" /> + android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity" /> - - + + - - + + - - + + - - + + @@ -160,28 +159,28 @@ + android:parentActivityName=".activities.MainActivity" /> + android:parentActivityName=".activities.SettingsActivity" /> + android:theme="@style/Theme.Transparent" /> - + + android:resource="@xml/widget_monthly_info" /> - + + android:resource="@xml/widget_list_info" /> - + + android:resource="@xml/widget_date_info" /> + android:permission="android.permission.BIND_REMOTEVIEWS" /> + android:permission="android.permission.BIND_REMOTEVIEWS" /> - + + android:permission="android.permission.BIND_JOB_SERVICE" /> - + - + - - - + + + @@ -244,7 +243,7 @@ android:grantUriPermissions="true"> + android:resource="@xml/provider_paths" /> - - + + @@ -268,8 +267,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -281,8 +280,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -294,8 +293,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -307,8 +306,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -320,8 +319,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -333,8 +332,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -346,8 +345,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -359,8 +358,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -372,8 +371,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -385,8 +384,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -398,8 +397,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -411,8 +410,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -424,8 +423,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -436,8 +435,8 @@ android:roundIcon="@mipmap/ic_launcher" android:targetActivity=".activities.SplashActivity"> - - + + @@ -449,8 +448,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -462,8 +461,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -475,8 +474,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + @@ -488,8 +487,8 @@ android:targetActivity=".activities.SplashActivity"> - - + + diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt index 31ff3a369..d2fe2bdde 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt @@ -169,9 +169,9 @@ class IcsImporter(val activity: SimpleActivity) { } var reminders = arrayListOf( - Reminder(curReminderMinutes.getOrElse(0) { REMINDER_OFF }, curReminderActions.getOrElse(0) { REMINDER_NOTIFICATION }), - Reminder(curReminderMinutes.getOrElse(1) { REMINDER_OFF }, curReminderActions.getOrElse(1) { REMINDER_NOTIFICATION }), - Reminder(curReminderMinutes.getOrElse(2) { REMINDER_OFF }, curReminderActions.getOrElse(2) { REMINDER_NOTIFICATION }) + Reminder(curReminderMinutes.getOrElse(0) { REMINDER_OFF }, curReminderActions.getOrElse(0) { REMINDER_NOTIFICATION }), + Reminder(curReminderMinutes.getOrElse(1) { REMINDER_OFF }, curReminderActions.getOrElse(1) { REMINDER_NOTIFICATION }), + Reminder(curReminderMinutes.getOrElse(2) { REMINDER_OFF }, curReminderActions.getOrElse(2) { REMINDER_NOTIFICATION }) ) reminders = reminders.sortedBy { it.minutes }.sortedBy { it.minutes == REMINDER_OFF }.toMutableList() as ArrayList @@ -179,8 +179,8 @@ class IcsImporter(val activity: SimpleActivity) { val eventType = eventTypes.firstOrNull { it.id == curEventTypeId } val source = if (calDAVCalendarId == 0 || eventType?.isSyncedEventType() == false) SOURCE_IMPORTED_ICS else "$CALDAV-$calDAVCalendarId" val event = Event(null, curStart, curEnd, curTitle, curLocation, curDescription, reminders[0].minutes, - reminders[1].minutes, reminders[2].minutes, reminders[0].type, reminders[1].type, reminders[2].type, curRepeatInterval, curRepeatRule, - curRepeatLimit, curRepeatExceptions, "", curImportId, DateTimeZone.getDefault().id, curFlags, curEventTypeId, 0, curLastModified, source) + reminders[1].minutes, reminders[2].minutes, reminders[0].type, reminders[1].type, reminders[2].type, curRepeatInterval, curRepeatRule, + curRepeatLimit, curRepeatExceptions, "", curImportId, DateTimeZone.getDefault().id, curFlags, curEventTypeId, 0, curLastModified, source) if (event.getIsAllDay() && curEnd > curStart) { event.endTS -= DAY diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt index 5f8df9041..ecedb5f91 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt @@ -14,30 +14,30 @@ import java.io.Serializable @Entity(tableName = "events", indices = [(Index(value = ["id"], unique = true))]) data class Event( - @PrimaryKey(autoGenerate = true) var id: Long?, - @ColumnInfo(name = "start_ts") var startTS: Long = 0L, - @ColumnInfo(name = "end_ts") var endTS: Long = 0L, - @ColumnInfo(name = "title") var title: String = "", - @ColumnInfo(name = "location") var location: String = "", - @ColumnInfo(name = "description") var description: String = "", - @ColumnInfo(name = "reminder_1_minutes") var reminder1Minutes: Int = -1, - @ColumnInfo(name = "reminder_2_minutes") var reminder2Minutes: Int = -1, - @ColumnInfo(name = "reminder_3_minutes") var reminder3Minutes: Int = -1, - @ColumnInfo(name = "reminder_1_type") var reminder1Type: Int = REMINDER_NOTIFICATION, - @ColumnInfo(name = "reminder_2_type") var reminder2Type: Int = REMINDER_NOTIFICATION, - @ColumnInfo(name = "reminder_3_type") var reminder3Type: Int = REMINDER_NOTIFICATION, - @ColumnInfo(name = "repeat_interval") var repeatInterval: Int = 0, - @ColumnInfo(name = "repeat_rule") var repeatRule: Int = 0, - @ColumnInfo(name = "repeat_limit") var repeatLimit: Long = 0L, - @ColumnInfo(name = "repetition_exceptions") var repetitionExceptions: ArrayList = ArrayList(), - @ColumnInfo(name = "attendees") var attendees: String = "", - @ColumnInfo(name = "import_id") var importId: String = "", - @ColumnInfo(name = "time_zone") var timeZone: String = "", - @ColumnInfo(name = "flags") var flags: Int = 0, - @ColumnInfo(name = "event_type") var eventType: Long = REGULAR_EVENT_TYPE_ID, - @ColumnInfo(name = "parent_id") var parentId: Long = 0, - @ColumnInfo(name = "last_updated") var lastUpdated: Long = 0L, - @ColumnInfo(name = "source") var source: String = SOURCE_SIMPLE_CALENDAR) + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "start_ts") var startTS: Long = 0L, + @ColumnInfo(name = "end_ts") var endTS: Long = 0L, + @ColumnInfo(name = "title") var title: String = "", + @ColumnInfo(name = "location") var location: String = "", + @ColumnInfo(name = "description") var description: String = "", + @ColumnInfo(name = "reminder_1_minutes") var reminder1Minutes: Int = -1, + @ColumnInfo(name = "reminder_2_minutes") var reminder2Minutes: Int = -1, + @ColumnInfo(name = "reminder_3_minutes") var reminder3Minutes: Int = -1, + @ColumnInfo(name = "reminder_1_type") var reminder1Type: Int = REMINDER_NOTIFICATION, + @ColumnInfo(name = "reminder_2_type") var reminder2Type: Int = REMINDER_NOTIFICATION, + @ColumnInfo(name = "reminder_3_type") var reminder3Type: Int = REMINDER_NOTIFICATION, + @ColumnInfo(name = "repeat_interval") var repeatInterval: Int = 0, + @ColumnInfo(name = "repeat_rule") var repeatRule: Int = 0, + @ColumnInfo(name = "repeat_limit") var repeatLimit: Long = 0L, + @ColumnInfo(name = "repetition_exceptions") var repetitionExceptions: ArrayList = ArrayList(), + @ColumnInfo(name = "attendees") var attendees: String = "", + @ColumnInfo(name = "import_id") var importId: String = "", + @ColumnInfo(name = "time_zone") var timeZone: String = "", + @ColumnInfo(name = "flags") var flags: Int = 0, + @ColumnInfo(name = "event_type") var eventType: Long = REGULAR_EVENT_TYPE_ID, + @ColumnInfo(name = "parent_id") var parentId: Long = 0, + @ColumnInfo(name = "last_updated") var lastUpdated: Long = 0L, + @ColumnInfo(name = "source") var source: String = SOURCE_SIMPLE_CALENDAR) : Serializable { companion object { @@ -123,9 +123,9 @@ data class Event( fun getIsAllDay() = flags and FLAG_ALL_DAY != 0 fun getReminders() = setOf( - Reminder(reminder1Minutes, reminder1Type), - Reminder(reminder2Minutes, reminder2Type), - Reminder(reminder3Minutes, reminder3Type) + Reminder(reminder1Minutes, reminder1Type), + Reminder(reminder2Minutes, reminder2Type), + Reminder(reminder3Minutes, reminder3Type) ).filter { it.minutes != REMINDER_OFF } // properly return the start time of all-day events as midnight From decfcbe1bf352afc2bdc9bf9c27fefe0ed2638ef Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 25 May 2020 20:50:43 +0200 Subject: [PATCH 022/144] removing a redundant variable --- .../calendar/pro/helpers/MyWidgetDateProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt index eef8a9ada..95cbd7f80 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt @@ -19,7 +19,7 @@ class MyWidgetDateProvider : AppWidgetProvider() { override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach { - val views = RemoteViews(context.packageName, R.layout.widget_date).apply { + RemoteViews(context.packageName, R.layout.widget_date).apply { applyColorFilter(R.id.widget_date_background, context.config.widgetBgColor) setText(R.id.widget_date_label, Formatter.getTodayDayNumber()) setText(R.id.widget_month_label, Formatter.getCurrentMonthShort()) From 12e09bdb73c8327f93efabe1399165c614fd7852 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 25 May 2020 20:56:14 +0200 Subject: [PATCH 023/144] adding some crashfixes --- .../pro/adapters/EventListWidgetAdapter.kt | 5 ++++- .../calendar/pro/fragments/WeekFragment.kt | 20 ++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListWidgetAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListWidgetAdapter.kt index f71657f69..50ff6beed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListWidgetAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListWidgetAdapter.kt @@ -48,7 +48,10 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi setupListEvent(remoteView, event) } else { remoteView = RemoteViews(context.packageName, R.layout.event_list_section_widget) - setupListSection(remoteView, events[position] as ListSection) + val section = events.getOrNull(position) as? ListSection + if (section != null) { + setupListSection(remoteView, section) + } } return remoteView diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 01aa3237b..1c1280f56 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -164,7 +164,9 @@ class WeekFragment : Fragment(), WeeklyCalendar { } fun updateCalendar() { - WeeklyCalendarImpl(this, context!!).updateWeeklyCalendar(weekTimestamp) + if (context != null) { + WeeklyCalendarImpl(this, context!!).updateWeeklyCalendar(weekTimestamp) + } } private fun setupDayLabels() { @@ -195,15 +197,15 @@ class WeekFragment : Fragment(), WeeklyCalendar { private fun initGrid() { (0..6).map { getColumnWithId(it) } - .forEachIndexed { index, layout -> - layout.removeAllViews() - val gestureDetector = getViewGestureDetector(layout, index) + .forEachIndexed { index, layout -> + layout.removeAllViews() + val gestureDetector = getViewGestureDetector(layout, index) - layout.setOnTouchListener { view, motionEvent -> - gestureDetector.onTouchEvent(motionEvent) - true - } + layout.setOnTouchListener { view, motionEvent -> + gestureDetector.onTouchEvent(motionEvent) + true } + } } private fun getViewGestureDetector(view: ViewGroup, index: Int): GestureDetector { @@ -294,7 +296,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { if (context != null && activity != null && isAdded) { val replaceDescription = config.replaceDescription val sorted = events.sortedWith( - compareBy { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description } + compareBy { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description } ).toMutableList() as ArrayList currEvents = sorted From 6ec7384cfe30cd3fb6bdee5493c1ef7093a34498 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 25 May 2020 21:01:44 +0200 Subject: [PATCH 024/144] update version to 6.9.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a2f9ae488..7571f2274 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 176 - versionName "6.9.3" + versionCode 177 + versionName "6.9.4" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 93cd469387977285d74ceee9360e1a7c9bca07c1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 25 May 2020 21:01:52 +0200 Subject: [PATCH 025/144] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/177.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/177.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fb6c05b2..4c4437412 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.9.4 *(2020-05-25)* +---------------------------- + + * Allow landscape orientation on any device + * Use the nicer new app icon on lower Android versions + * Some UI, stability and translation improvements + Version 6.9.3 *(2020-05-05)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/177.txt b/fastlane/metadata/android/en-US/changelogs/177.txt new file mode 100644 index 000000000..845cdb682 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/177.txt @@ -0,0 +1,3 @@ + * Allow landscape orientation on any device + * Use the nicer new app icon on lower Android versions + * Some UI, stability and translation improvements From 58969466980aa87b2ddb26f6db9e40e999681b46 Mon Sep 17 00:00:00 2001 From: Tommy He Date: Sun, 31 May 2020 21:25:45 +0800 Subject: [PATCH 026/144] Update pronoun and missing translation for zh_CN. --- app/src/main/res/values-zh-rCN/strings.xml | 120 ++++++++++----------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 35d6db502..99ae03308 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -2,21 +2,21 @@     简易日历     简易日历 -    改变检视模式 -    日历 -    周历 -    月历 -    年历 +    改变视图 +    日历视图 +    周历视图 +    月历视图 +    年历视图     简易活动列表 -    你近期似乎没有任何活动。 +    您近期似乎没有任何活动。     前往今天     前往日期 -    嘿\n\n你似乎从旧版免费应用升级了。你必须手动移动存储在闪存的活动,透过输出.ics后再尝试导入。你可以在主画面选单中,找到 导出/导入 两个按钮。 \n\n然后你能解除安装旧版了,在应用程式设定的顶端有个\'升级至专业版\'按钮。你只需要重置你的应用程式设定。 \n\n感谢! +    嘿\n\n您似乎从旧版免费应用升级了。您必须手动迁移本地存储的活动,通过输出.ics后再尝试导入。您可以在主画面选单中,找到 导出/导入 两个按钮。 \n\n然后您能卸载旧版了,在应用程序设定的顶端有个\'升级至专业版\'按钮。您只需要重置您的应用程序设定。 \n\n感谢!      -    月历 -    行事历活动列表 - Calendar today\'s date +    日历 月历视图 +    日历 活动列表 + 日历 今天的日期          活动 @@ -52,13 +52,13 @@     只更新选择的事件     更新全部事件     重复直到某日 -    经过x次后停止重复 +    经过 x 次后停止重复     永远重复          重复     重复于     每天 -    On selected days +    在选定的天     同一天     最后一天     重复每月同一天 @@ -86,14 +86,14 @@     生日     添加联系人生日     未发现生日 - No new birthdays have been found + 未发现新的生日     生日添加成功          纪念日     添加联系人纪念日     未发现纪念日 - No new anniversaries have been found + 未发现新的纪念日     纪念日添加成功      @@ -111,18 +111,18 @@     被邀请 - Enter a country or time zone + 输入一个国家或者时区          导入活动     导出活动 -    从.ics档案导入活动 -    导出活动成.ics档案 +    从.ics文件导入活动 +    导出活动成.ics文件     预设活动类型     也导出过去的活动     包含活动类型 -    档案名称 (不含.ics) -    覆盖档案内的活动类型 +    文件名称 (不含.ics) +    覆盖文件内的活动类型          地点 @@ -143,12 +143,12 @@     选择活动类型     受影响的活动移到预设活动类型     受影响的活动永久移除 -    想移除CalDAV行事历,你必须取消同步 +    想移除 CalDAV 日历,您必须取消同步          节日     添加节日 -    国定节日 +    法定节日     宗教节日     节日已成功导入"节日"活动类型     导入一些活动失败 @@ -161,20 +161,20 @@     显示第几周     提醒通知时震动     ​​提醒音效 -    未发现能够设置铃声的程式 +    未发现能够设置铃声的程序          结束时间不能比开始早 -    CalDAV同步 +    CalDAV 同步     活动列表     显示过去的活动     活动描述改成地点     删除全部活动 -    你确定要删除全部活动吗?会完整留下你的活动类型和其他设定。 +    您确定要删除全部活动吗?会完整留下您的活动类型和其他设定。     显示网络     不断重复提醒直到解除     淡化过去的活动     活动 -    用于提醒的音源串流 +    用于提醒的音频流     系统     闹钟     通知 @@ -183,32 +183,32 @@     预设提醒1     预设提醒2     预设提醒3 -    从活动列表小工具开启的检视画面 -    最后的检视画面 +    从活动列表小工具开启的视图 +    最后的视图     新活动     预设开始时间     整整下个小时     预设持续时间     最后使用     其他时间 - Highlight weekends on some views - Allow changing event time zones + 在部分视图高亮周末 + 允许更改活动时区          CalDAV -    选择行事历来同步 -    管理同步的行事历 +    选择日历来同步 +    管理同步的日历     只存于本机端 -    重新整理CalDAV行事历 +    重新整理 CalDAV 日历     重新整理中…     重新整理完成 -    编辑行事历失败 +    编辑日历失败     同步中…     同步完成     选择不同的颜色 (只能被添加于本机端) -    你不被允许对选择的行事历写入 - Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings. - No synchronizable calendars have been found +    您不被允许对选择的日历写入 + 未找到活动。请在应用程序设定中为对应的日历启用 CalDAV 同步。 + 未发现可同步的日历           @@ -233,58 +233,58 @@          我如何移除用[添加节日]按钮所导入的节日?     以这方式建立的节日,会被加进一个叫做「节日」的新活动类型。 -        你可以到[设定] -> [管理活动类型],长按特定的活动类型,然后选择垃圾桶来删除。 -    我可以透过Google日历或其它支援CalDAV的服务来同步我的活动吗? -    行的,只要打开程式设定内的[CalDAV同步],然后选择你要同步的行事历。然而你需要一些第三方应用程式来处理装置和伺服器之间的同步。 -        如果你要同步Google日历,他们官方的行事历程式就能做到了。而其它行事历,你需要有第三方同步工具才行,像是DAVx5。 +        您可以到[设定] -> [管理活动类型],长按特定的活动类型,然后选择垃圾桶来删除。 +    我可以透过 Google 日历或其它支援 CalDAV 的服务来同步我的活动吗? +    行的,只要打开程序设定内的[CalDAV同步],然后选择您要同步的日历。然而您需要一些第三方应用程序来处理装置和伺服器之间的同步。 +        如果您要同步 Google 日历,他们官方的日历程序就能做到了。而其它日历,您需要有第三方同步工具才行,像是 DAVx5。     我看到了视觉的提醒,但没听到音效。我能怎么办? -    不只是显示实际的提醒,播放音效也受到系统极大的影响。如果你听不到任何声音,试着到应用程式设定, -        按\"用于提醒的音源串流\"选项,然后更改成不同数值。如果还是没有用,检查你的音量设定,指定串流是不是静音的。 - Does the app support time zones? - Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, - you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. +    不只是显示实际的提醒,播放音效也受到系统极大的影响。如果您听不到任何声音,试着到应用程序设定, +        按\"用于提醒的音频流\"选项,然后更改成不同数值。如果还是没有用,检查您的音量设定,指定串流是不是静音的。 + 该应用程序支持时区吗? + 是的,它支持。默认所有的活动会在您当前的时区下创建。如果您想要改变活动的时区, + 您首先需要在应用程序设定中启用时区选择器,然后在活动详情界面中更改它。这个默认是禁用的因为大多数不会用到它。           -    简易行事历 Pro - 活动&约会 +    简易日历 Pro - 活动&约会      -    Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day +    简易移动日历 2020 。每一天的行程计划 & 约会提醒      -        简易行事历Pro是一个高度自定义,完全旨在于行事历应该做什么的离线行事历。 没有复杂的功能、非必要的权限和广告! +        简易日历Pro 是一个高度自定义,完全旨在于日历应该做什么的离线日历。 没有复杂的功能、非必要的权限和广告! -        无论您是要安排单一还是反复的活动、生日、纪念日、业务会议、约会或任何其他活动,简易行事历Pro都能让您轻松维持安排。透过多样化的自订选项,您可以自订活动提醒、通知音效、行事历小工具和应用程式外观。 +        无论您是要安排单一还是反复的活动、生日、纪念日、业务会议、约会或任何其他活动,简易日历Pro都能让您轻松维持安排。透过多样化的自订选项,您可以自订活动提醒、通知音效、日历小工具和应用程序外观。 -        每日、每周、每月的检视模式使您轻易就确认即将到来的活动&约会。您甚至能够以简单的活动列表来浏览全部,而不是行事历画面,所以您完全知道生活中何时会发生什么事。 +        每日、每周、每月的视图使您轻易就确认即将到来的活动&约会。您甚至能够以简单的活动列表来浏览全部,而不是日历画面,所以您完全知道生活中何时会发生什么事。         -------------------------------------------------- -------- -        简易行事历Pro – 特色 & 优点 +        简易日历Pro – 特色 & 优点         -------------------------------------------------- --------         ✔️ 没有广告和讨厌的弹出画面         ✔️ 不需要网路连线,给您更多隐私及安全         ✔️ 只需要最低限度的权限 -        ✔️ 着重于简单 – 做行事历该做的! +        ✔️ 着重于简单 – 做日历该做的!         ✔️ 开放原始码 -        ✔️ 完整自订化主题&行事历/活动小工具 +        ✔️ 完整自订化主题&日历/活动小工具         ✔️ 翻译成29种语言 -        ✔️ 将设定导出成.txt档案,以导入到别的装置 -        ✔️ 支援CalDAV行事历同步,来跨装置同步活动 -        ✔️ 在行事历上有每日、每周、每月、每年及活动浏览的检视方式 -        ✔️ 支援透过.ics档案来导出&导入活动 +        ✔️ 将设定导出成.txt文件,以导入到别的装置 +        ✔️ 支援 CalDAV 日历同步,来跨装置同步活动 +        ✔️ 在日历上有每日、每周、每月、每年及活动浏览的检视方式 +        ✔️ 支援透过.ics文件来导出&导入活动         ✔️ 设置多个活动提醒,自订活动提醒音效和震动         ✔️ 提醒有延迟选项         ✔️ 轻松添加假日、生日、纪念日和约会         ✔️ 自订活动 – 开始时间、持续时间、提醒…之类的         ✔️ 为每个活动添加活动出席者 -        ✔️ 用做于个人行事历或业务行事历 +        ✔️ 用做于个人日历或业务日历         ✔️ 在提醒和电子信箱通知之间选择,以提醒您关于活动的讯息 -        下载简易行事历PRO – 没有广告的简易离线行事历! +        下载简易日历PRO – 没有广告的简易离线日历!         于此查看简易工具系列全套:         https://www.simplemobiletools.com - Standalone website of Simple Calendar Pro: + 简易日历Pro 的独立网站: https://www.simplemobiletools.com/calendar         Facebook: From e5867714c7fd4a24d5b978c3661f7e8b1205338e Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 31 May 2020 20:01:10 +0200 Subject: [PATCH 027/144] updating the chinese app translation --- .../android/zh-rCN/full_description.txt | 27 ++++++++++--------- .../android/zh-rCN/short_description.txt | 2 +- fastlane/metadata/android/zh-rCN/title.txt | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/fastlane/metadata/android/zh-rCN/full_description.txt b/fastlane/metadata/android/zh-rCN/full_description.txt index 2c1032cf7..e5ccd32da 100644 --- a/fastlane/metadata/android/zh-rCN/full_description.txt +++ b/fastlane/metadata/android/zh-rCN/full_description.txt @@ -1,37 +1,40 @@ -简易行事历Pro是一个高度自定义,完全旨在于行事历应该做什么的离线行事历。 没有复杂的功能、非必要的权限和广告! +简易日历Pro 是一个高度自定义,完全旨在于日历应该做什么的离线日历。 没有复杂的功能、非必要的权限和广告! -无论您是要安排单一还是反复的活动、生日、纪念日、业务会议、约会或任何其他活动,简易行事历Pro都能让您轻松维持安排。透过多样化的自订选项,您可以自订活动提醒、通知音效、行事历小工具和应用程式外观。 +无论您是要安排单一还是反复的活动、生日、纪念日、业务会议、约会或任何其他活动,简易日历Pro都能让您轻松维持安排。透过多样化的自订选项,您可以自订活动提醒、通知音效、日历小工具和应用程序外观。 -每日、每周、每月的检视模式使您轻易就确认即将到来的活动&约会。您甚至能够以简单的活动列表来浏览全部,而不是行事历画面,所以您完全知道生活中何时会发生什么事。 +每日、每周、每月的视图使您轻易就确认即将到来的活动&约会。您甚至能够以简单的活动列表来浏览全部,而不是日历画面,所以您完全知道生活中何时会发生什么事。 -------------------------------------------------- -------- -简易行事历Pro – 特色 & 优点 +简易日历Pro – 特色 & 优点 -------------------------------------------------- -------- ✔️ 没有广告和讨厌的弹出画面 ✔️ 不需要网路连线,给您更多隐私及安全 ✔️ 只需要最低限度的权限 -✔️ 着重于简单 – 做行事历该做的! +✔️ 着重于简单 – 做日历该做的! ✔️ 开放原始码 -✔️ 完整自订化主题&行事历/活动小工具 +✔️ 完整自订化主题&日历/活动小工具 ✔️ 翻译成29种语言 -✔️ 将设定导出成.txt档案,以导入到别的装置 -✔️ 支援CalDAV行事历同步,来跨装置同步活动 -✔️ 在行事历上有每日、每周、每月、每年及活动浏览的检视方式 -✔️ 支援透过.ics档案来导出&导入活动 +✔️ 将设定导出成.txt文件,以导入到别的装置 +✔️ 支援 CalDAV 日历同步,来跨装置同步活动 +✔️ 在日历上有每日、每周、每月、每年及活动浏览的检视方式 +✔️ 支援透过.ics文件来导出&导入活动 ✔️ 设置多个活动提醒,自订活动提醒音效和震动 ✔️ 提醒有延迟选项 ✔️ 轻松添加假日、生日、纪念日和约会 ✔️ 自订活动 – 开始时间、持续时间、提醒…之类的 ✔️ 为每个活动添加活动出席者 -✔️ 用做于个人行事历或业务行事历 +✔️ 用做于个人日历或业务日历 ✔️ 在提醒和电子信箱通知之间选择,以提醒您关于活动的讯息 -下载简易行事历PRO – 没有广告的简易离线行事历! +下载简易日历PRO – 没有广告的简易离线日历! 于此查看简易工具系列全套: https://www.simplemobiletools.com +简易日历Pro 的独立网站: +https://www.simplemobiletools.com/calendar + Facebook: https://www.facebook.com/simplemobiletools diff --git a/fastlane/metadata/android/zh-rCN/short_description.txt b/fastlane/metadata/android/zh-rCN/short_description.txt index 43183c485..ded2d2b0b 100644 --- a/fastlane/metadata/android/zh-rCN/short_description.txt +++ b/fastlane/metadata/android/zh-rCN/short_description.txt @@ -1 +1 @@ -A beautiful calendar without ads, 100% money back guarantee. +简易移动日历 2020 。每一天的行程计划 & 约会提醒 diff --git a/fastlane/metadata/android/zh-rCN/title.txt b/fastlane/metadata/android/zh-rCN/title.txt index 22b525289..22cde1e0c 100644 --- a/fastlane/metadata/android/zh-rCN/title.txt +++ b/fastlane/metadata/android/zh-rCN/title.txt @@ -1 +1 @@ -简易行事历 Pro - 活动&约会 +简易日历 Pro - 活动&约会 From 2f348944a7180188d53b8434e0d56bad298fa6a9 Mon Sep 17 00:00:00 2001 From: fnrngg Date: Fri, 5 Jun 2020 22:00:20 +0400 Subject: [PATCH 028/144] Added warning when closing edit scene --- .../calendar/pro/activities/EventActivity.kt | 18 +++++++- .../pro/dialogs/CloseEditingDialog.kt | 33 +++++++++++++++ .../calendar/pro/helpers/Constants.kt | 3 ++ .../layout/dialog_return_without_saving.xml | 42 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 ++ 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt create mode 100644 app/src/main/res/layout/dialog_return_without_saving.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index ab2d5e7fd..0a10696a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -240,11 +240,27 @@ class EventActivity : SimpleActivity() { R.id.delete -> deleteEvent() R.id.duplicate -> duplicateEvent() R.id.share -> shareEvent() + android.R.id.home -> onBackPressed() else -> return super.onOptionsItemSelected(item) } return true } + override fun onBackPressed() { + CloseEditingDialog(this) { + ensureBackgroundThread { + when (it) { + CLOSE_WITHOUT_SAVING -> { + runOnUiThread { + finish() + } + } + SAVE_AND_CLOSE -> saveEvent() + } + } + } + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) if (!mWasActivityInitialized) { @@ -334,6 +350,7 @@ class EventActivity : SimpleActivity() { updateAttendeesVisibility() } + private fun setupEditEvent() { val realStart = if (mEventOccurrenceTS == 0L) mEvent.startTS else mEventOccurrenceTS val duration = mEvent.endTS - mEvent.startTS @@ -1011,7 +1028,6 @@ class EventActivity : SimpleActivity() { eventsHelper.deleteEvent(mEvent.id!!, true) mEvent.id = null } - storeEvent(wasRepeatable) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt new file mode 100644 index 000000000..00f710a75 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.calendar.pro.dialogs + +import android.app.Activity +import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.calendar.pro.R +import com.simplemobiletools.calendar.pro.helpers.* +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_return_without_saving.view.* + +class CloseEditingDialog(val activity: Activity, val callback: (closeRule: Int) -> Unit) { + val dialog: AlertDialog? + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_return_without_saving, null) + + dialog = AlertDialog.Builder(activity) + .setPositiveButton(R.string.yes) { _, _ -> dialogConfirmed(view as ViewGroup) } + .setNegativeButton(R.string.no, null) + .create().apply { + activity.setupDialogStuff(view, this) + } + } + + private fun dialogConfirmed(view: ViewGroup) { + val closeRule = when (view.close_event_radio_view.checkedRadioButtonId) { + R.id.close_event_without_saving -> CLOSE_WITHOUT_SAVING + else -> SAVE_AND_CLOSE + } + dialog?.dismiss() + callback(closeRule) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt index e63fde821..cd7538424 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt @@ -155,4 +155,7 @@ const val DELETE_ALL_OCCURRENCES = 2 const val REMINDER_NOTIFICATION = 0 const val REMINDER_EMAIL = 1 +const val CLOSE_WITHOUT_SAVING = 0 +const val SAVE_AND_CLOSE = 1 + fun getNowSeconds() = System.currentTimeMillis() / 1000L diff --git a/app/src/main/res/layout/dialog_return_without_saving.xml b/app/src/main/res/layout/dialog_return_without_saving.xml new file mode 100644 index 000000000..c32c06cde --- /dev/null +++ b/app/src/main/res/layout/dialog_return_without_saving.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3699b4f9a..5ce6350cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,6 +293,9 @@ Reddit: https://www.reddit.com/r/SimpleMobileTools + Are you sure you want to close? + Close without saving + Save and close Calendario mensual Lista de eventos do calendario - Calendar today\'s date + Calendario no día actual Evento @@ -24,17 +24,17 @@ Novo evento Crear evento novo Duplicar evento - O título non pode estar baldeiro + O título non pode estar baleiro O evento non pode rematar antes de iniciarse Evento engadido con éxito O evento foi actualizado correctamente Filtrar eventos por tipo - Introduza unha localización para que se mostre nun mapa + Escribe a localización para que se mostre nun mapa Hai un evento próximo Repetición - Sin repetición + Sen repetición Diariamente Semanalmente Mensualmente @@ -45,11 +45,11 @@ Repetir ata Sempre O evento é repetible - A seleción contén eventos recurrentes - Eliminar só o evento selecionado + A selección contén eventos recurrentes + Eliminar só o evento seleccionado Eliminar este e todos os eventos futuros Eliminar todos os eventos - Actualizar só o evento selecionado + Actualizar só o evento seleccionado Actualizar todos os eventos Repetir ata a data Deixar de repetir despois de x eventos @@ -58,10 +58,10 @@ Repetir Repertir os Cada día - Nos días selecionados - O mismo día + Nos días seleccionados + O mesmo día O último día - Repetir no mismo día cada mes + Repetir no mesmo día cada mes Repetir no último día do mes Repetir no mesmo día cada ano Repetir cada @@ -78,23 +78,23 @@ Cada primero segundo - tercero + terceiro cuarto último - Cumpleanos - Engadir cumpleanos de contactos - Non se atoparon cumpleanos - Non se atoparon novos cumpleanos - Engadíronse correctamente os cumpleanos + Aniversario + Engadir aniversario de contactos + Non se atoparon aniversarios + Non se atoparon novos aniversarios + Engadíronse correctamente os aniversarios - Aniversarios - Engadir aniversarios de contactos - Non se atoparon aniversarios - Non se atoparon novos aniversarios - Engadíronse correctamente os aniversarios + Celebracións + Engadir celebracións de contactos + Non se atoparon celebracións + Non se atoparon novas celebracións + Engadíronse correctamente as celebracións Recordatorio @@ -103,15 +103,15 @@ Recordatorios de eventos - Add another attendee - My status: - Going - Not going - Maybe going - Invited + Engadir participante + O meu estado: + Vou + Non vou + Pode que vaia + Convidado - Enter a country or time zone + Escribir zona horaria do país Importar eventos @@ -121,8 +121,8 @@ Tipo de evento predeterminado Exportar tamén eventos pasados Incluír tipos de eventos - Nome de ficheiro (sin .ics) - Sobreescribir tipos de evento no ficheiro + Nome do ficheiro (sen .ics) + Sobrescribir tipos de evento no ficheiro Localización @@ -140,10 +140,10 @@ Cor Evento regular Non se pode eliminar o tipo de evento predeterminado - Seleccione un tipo de evento + Selecciona un tipo de evento Mover os eventos afectados ao tipo de evento por omisión Eliminar permanentemente os eventos afectados - Para eliminar un calendario CalDAV antes debe deixar de sincronizalo + Para eliminar un calendario CalDAV antes debes deixar de sincronizalo Festivo @@ -163,13 +163,13 @@ Son de recordatorio Non se atopou ningunha aplicación capaz de establecer o ton de aviso Ningún - O día non puede rematar antes de que comece + O día non pode rematar antes de que comece CalDAV sincr. - Listas de eventos + Listaxes de eventos Mostrar eventos do pasado - Substituir a descrición coa localización + Substituír a descrición coa localización Borrar tódolos eventos - Está seguro de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes. + Tes a certeza de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes. Mostrar unha cuadrícula Repetir recordatorios ata que se descarten Atenuar eventos pasados @@ -178,12 +178,12 @@ Sistema Alarma Notificación - Timbre + Ton Usar os recordatorios dos últimos eventos como recordatorio por defecto para os eventos novos Recordatorio por defecto 1 Recordatorio por defecto 2 Recordatorio por defecto 3 - Vista que abrir desde o widget da lista de eventos + Vista a abrir desde o widget da lista de eventos Última vista Eventos novos Hora de comezo por defecto @@ -192,11 +192,11 @@ A última usada Outra hora Resaltar fins de semana nalgunhas vistas - Allow changing event time zones + Permitir cambiar as zonas horarias do evento CalDAV - Escolla calendarios a sincronizar + Escolle calendarios a sincronizar Xestionar calendarios sincronizados Gardar só localmente Actualizar calendarios CalDAV @@ -205,10 +205,10 @@ Fallou a edición do calendario Sincronizando… Sincronización completa - Escolle un color diferente (pode que só se aplique localmente) + Escolle unha cor diferente (pode que só se aplique localmente) Non tes permiso para escribir no calendario seleccionado Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes da aplicación. - No synchronizable calendars have been found + Non se atoparon calendarios sincronizables @@ -227,7 +227,7 @@ No paseo do León Biblioteca Xantar con Aira - Na plaza + Na praza Hora do café @@ -279,12 +279,12 @@ ✔️ Use as a personal calendar or a business calendar ✔️ Choose between reminders & email notifications to alert you about an event - DOWNLOAD SIMPLE CALENDAR PRO – THE SIMPLE OFFLINE CALENDAR WITH NO ADS! + DESCARGA SIMPLE CALENDAR PRO – CALENDARIO SIMPLE SEN PUBLICIDADE! - Check out the full suite of Simple Tools here: + Aquí tes a listaxe completa de Simple Tools: https://www.simplemobiletools.com - Standalone website of Simple Calendar Pro: + Web propia para Simple Calendar Pro: https://www.simplemobiletools.com/calendar Facebook: From 429d99d9e223287a81f6518dfaf6d94c25b318a1 Mon Sep 17 00:00:00 2001 From: Xose M <704948+xmgz@users.noreply.github.com> Date: Sat, 6 Jun 2020 12:56:28 +0200 Subject: [PATCH 031/144] galician strings.xml updates translated some new text chains, corrected some errors and improving concordance --- app/src/main/res/values-gl/strings.xml | 71 +++++++++++++------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 92dca9772..a068dff1b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -231,53 +231,52 @@ Hora do café - How can I remove the holidays imported via the \"Add holidays\" button? - Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types, - long press the given event type and delete it by selecting the trashbin. - Can I sync my events via Google Calendar, or other service supporting CalDAV? - Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers. - In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVx5. - I see the visual reminders, but hear no audio. What can I do? - Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings, - pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted. - Does the app support time zones? - Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, - you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + Como podo eliminar as vacacións engadidas vía o botón \"Engadir vacacións\"? + As vacacións creadas dese xeito insértanse nun tipo de evento chamado \"Vacacións\". Podes ir a Axustes -> Xestionar tipo de eventos, + manter preso o tipo de evento desexado e eliminalo escollendo o caldeiro do lixo. + Podo sincronizar os meus eventos vía Google Calendar, ou outro servizo que use CalDAV? + Si, activa \"CalDAV sincr.\" nos axustes da app e escolle os calendarios que queres sincronizar. Porén, precisas unha app de terceiros para xestionar a sincronización entre dispositivos e servidores. + Se desexas sincronizar un calendario de Google, a súa app oficial Calendar fará o traballo. Para outros calendario precisas unha app de sincronización, como DAVx5. + Vexo os recordatorios visualmente, pero non escoito audio. Que podo facer? + Non só mostrar o recordatorio propiamente dito, se non que a reprodución do son depende en gran medida do sistema tamén. Se non podes escoitar ningún son, intenta ir aos axustes da app e premer en \"Son utilizado polos recordatorios\" e cambia a un valor diferente. Se aínda así non funciona, comproba os axustes de son, que o fluxo en particular non esté acalado. + A app soporta zonas horarias? + Si. Por omisión todos os eventos créanse na túa zona horaria actual. Se desexas cambiar a zona horaria dos eventos, + primeiro tes que activar o selector de zona horaria nos axustes da app, e despois cambialo na pantalla de Detalles do Evento. Se está desactivado de inicio porque non o utiliza moita xente. - Simple Calendar Pro - Events & Reminders + Simple Calendar Pro - Eventos & Recordatorios - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Calendario Simple mobile 2020. Planificador & recordatorio de citas en calquera día - Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads! + Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e se publicidade! - Whether you’re organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it easy to stay organized. With an incredible variety of customization options you can customize event reminders, notification sounds, calendar widgets and how the app looks. + Tanto se organizas eventos puntuais ou recurrentes, aniversarios, cabodanos, xuntanzas de negocios, citas ou calquera outro evento, Simple Calendar Pro poncho doado para estar organizado. Cunha abraiante multitude de opcións de personalización podes personalizar os recordatorios de eventos, sons de notificación, widgets de calendario e o aspecto da app. - Daily, weekly and monthly views make checking your upcoming events & appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you know exactly what’s coming up in your life and when. + A vista Diaria, Semanal e Mensual facilítanche comprobar as próximas citas & eventos. Podes incluso visualizalos como unha simple listaxe de eventos en lugar de nunha vista de calendario, así sabes exactamente o que está por vir e cando. ---------------------------------------------------------- - Simple Calendar Pro – Features & Benefits + Simple Calendar Pro – Características & Melloras ---------------------------------------------------------- - ✔️ No ads or annoying popups - ✔️ No internet access needed, giving you more privacy & security - ✔️ Only the bare minimum permissions required - ✔️ Emphasis on simplicity – does what a calendar needs to do! - ✔️ Open source - ✔️ Fully customizable themes & calendar / event widgets - ✔️ Translated into 29 languages - ✔️ Export settings to .txt files to import to another device - ✔️ CalDAV calendar sync supported to sync events across devices - ✔️ Daily, weekly, monthly, yearly & event views on the calendar - ✔️ Supports exporting & importing events via .ics files - ✔️ Set multiple event reminders, customize event reminder sound and vibration - ✔️ Snooze option for reminders - ✔️ Easily add holidays, birthdays, anniversaries & appointments - ✔️ Customize events – start time, duration, reminders etc - ✔️ Add event attendees to each event - ✔️ Use as a personal calendar or a business calendar - ✔️ Choose between reminders & email notifications to alert you about an event + ✔️ Sen publicidade nin ventás emerxentes + ✔️ Non precisa acceso a internet, proporcionando máis privacidade & seguridade + ✔️ Precisa os permisos mínimos imprescindibles + ✔️ Énfase na simplicidade – fai o que ten que facer! + ✔️ Código aberto + ✔️ Aspecto personalizable & widget de calendario / eventos + ✔️ Traducido a 29 idiomas + ✔️ Exporta os axustes a un ficheiro .txt e importao noutro dispositivo + ✔️ Sincronización CalDAV de calendario entre varios dispositivos + ✔️ Vista de eventos no calendario Diario, Semanal, Mensual ou Anual + ✔️ Soporta a exportación & importación de eventos via ficheiros .ics + ✔️ Establece múltiples recordatorios, con son e vibración personalizable + ✔️ Posibilidade de adiar recordatorios + ✔️ Engade facilmente citas, aniversarios, vacacións & celebracións + ✔️ Personaliza os eventos – hora de inicio, duración, recordatorios etc + ✔️ Engade participantes aos eventos + ✔️ Utilízao como calendario personal ou para o traballo + ✔️ Escolle entre recordatorios & notificacións por email para avisarte dun evento DESCARGA SIMPLE CALENDAR PRO – CALENDARIO SIMPLE SEN PUBLICIDADE! From 9dbcd3a67663569a59942548c93f96cd1e241d17 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 7 Jun 2020 09:31:38 +0200 Subject: [PATCH 032/144] shortening the short description --- app/src/main/res/values-gl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index a068dff1b..4f1976924 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -247,7 +247,7 @@ Simple Calendar Pro - Eventos & Recordatorios - Calendario Simple mobile 2020. Planificador & recordatorio de citas en calquera día + Un calendario simple con eventos, widget personalizable e sin anuncios. Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e se publicidade! From fb7b5c7989347629b7f326852f02d07f2fb6512d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 7 Jun 2020 09:33:47 +0200 Subject: [PATCH 033/144] updating the galician app translation --- .../metadata/android/gl/full_description.txt | 42 +++++++++++++++++++ .../metadata/android/gl/short_description.txt | 1 + fastlane/metadata/android/gl/title.txt | 1 + 3 files changed, 44 insertions(+) create mode 100644 fastlane/metadata/android/gl/full_description.txt create mode 100644 fastlane/metadata/android/gl/short_description.txt create mode 100644 fastlane/metadata/android/gl/title.txt diff --git a/fastlane/metadata/android/gl/full_description.txt b/fastlane/metadata/android/gl/full_description.txt new file mode 100644 index 000000000..fff78730d --- /dev/null +++ b/fastlane/metadata/android/gl/full_description.txt @@ -0,0 +1,42 @@ +Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e se publicidade! + +Tanto se organizas eventos puntuais ou recurrentes, aniversarios, cabodanos, xuntanzas de negocios, citas ou calquera outro evento, Simple Calendar Pro poncho doado para estar organizado. Cunha abraiante multitude de opcións de personalización podes personalizar os recordatorios de eventos, sons de notificación, widgets de calendario e o aspecto da app. + +A vista Diaria, Semanal e Mensual facilítanche comprobar as próximas citas & eventos. Podes incluso visualizalos como unha simple listaxe de eventos en lugar de nunha vista de calendario, así sabes exactamente o que está por vir e cando. + +---------------------------------------------------------- +Simple Calendar Pro – Características & Melloras +---------------------------------------------------------- + +✔️ Sen publicidade nin ventás emerxentes +✔️ Non precisa acceso a internet, proporcionando máis privacidade & seguridade +✔️ Precisa os permisos mínimos imprescindibles +✔️ Énfase na simplicidade – fai o que ten que facer! +✔️ Código aberto +✔️ Aspecto personalizable & widget de calendario / eventos +✔️ Traducido a 29 idiomas +✔️ Exporta os axustes a un ficheiro .txt e importao noutro dispositivo +✔️ Sincronización CalDAV de calendario entre varios dispositivos +✔️ Vista de eventos no calendario Diario, Semanal, Mensual ou Anual +✔️ Soporta a exportación & importación de eventos via ficheiros .ics +✔️ Establece múltiples recordatorios, con son e vibración personalizable +✔️ Posibilidade de adiar recordatorios +✔️ Engade facilmente citas, aniversarios, vacacións & celebracións +✔️ Personaliza os eventos – hora de inicio, duración, recordatorios etc +✔️ Engade participantes aos eventos +✔️ Utilízao como calendario personal ou para o traballo +✔️ Escolle entre recordatorios & notificacións por email para avisarte dun evento + +DESCARGA SIMPLE CALENDAR PRO – CALENDARIO SIMPLE SEN PUBLICIDADE! + +Aquí tes a listaxe completa de Simple Tools: +https://www.simplemobiletools.com + +Web propia para Simple Calendar Pro: +https://www.simplemobiletools.com/calendar + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/gl/short_description.txt b/fastlane/metadata/android/gl/short_description.txt new file mode 100644 index 000000000..a20771ef8 --- /dev/null +++ b/fastlane/metadata/android/gl/short_description.txt @@ -0,0 +1 @@ +Un calendario simple con eventos, widget personalizable e sin anuncios. diff --git a/fastlane/metadata/android/gl/title.txt b/fastlane/metadata/android/gl/title.txt new file mode 100644 index 000000000..84775a896 --- /dev/null +++ b/fastlane/metadata/android/gl/title.txt @@ -0,0 +1 @@ +Simple Calendar Pro - Eventos & Recordatorios From ca8ed4c462fdd600d79bdfe45b40f5d428820a3d Mon Sep 17 00:00:00 2001 From: Xose M <704948+xmgz@users.noreply.github.com> Date: Sun, 7 Jun 2020 12:01:19 +0200 Subject: [PATCH 034/144] shorter short description keeping it under 80 --- app/src/main/res/values-gl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 4f1976924..6719e83d4 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -247,7 +247,7 @@ Simple Calendar Pro - Eventos & Recordatorios - Un calendario simple con eventos, widget personalizable e sin anuncios. + Calendadario simple, con eventos, widget personalizable e sen publicidade. Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e se publicidade! From dcc6d289b6c51ea6406e8fbce6a66d31bb94f9fc Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 7 Jun 2020 12:59:53 +0200 Subject: [PATCH 035/144] updating the app short description --- fastlane/metadata/android/gl/short_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/gl/short_description.txt b/fastlane/metadata/android/gl/short_description.txt index a20771ef8..168f2a63d 100644 --- a/fastlane/metadata/android/gl/short_description.txt +++ b/fastlane/metadata/android/gl/short_description.txt @@ -1 +1 @@ -Un calendario simple con eventos, widget personalizable e sin anuncios. +Calendadario simple, con eventos, widget personalizable e sen publicidade. From 719414c42c7d121c109890c2db67b60cd0646a72 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 8 Jun 2020 10:48:52 +0200 Subject: [PATCH 036/144] updating commons and constraintlayout --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7571f2274..0aa1a26fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,10 +64,10 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.28.23' + implementation 'com.simplemobiletools:commons:5.29.1' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta6' kapt 'androidx.room:room-compiler:2.2.5' implementation 'androidx.room:room-runtime:2.2.5' From dfeee92598f0b67b6ffbc106aeb35355c176fcfe Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 8 Jun 2020 11:09:03 +0200 Subject: [PATCH 037/144] removing a redundant wrapper around the weekly view holder --- .../main/res/layout/fragment_week_holder.xml | 62 ++++++++----------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/layout/fragment_week_holder.xml b/app/src/main/res/layout/fragment_week_holder.xml index 925869dad..fc1ad4682 100644 --- a/app/src/main/res/layout/fragment_week_holder.xml +++ b/app/src/main/res/layout/fragment_week_holder.xml @@ -1,48 +1,40 @@ - + android:orientation="horizontal"> - + android:layout_alignEnd="@+id/week_view_hours_scrollview" + android:background="@drawable/stroke_bottom_right" + android:importantForAccessibility="no" /> - + - + android:orientation="vertical" /> - + - + - - - - + From 783890bf461fa18ec749f08e77b1b298af355195 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 8 Jun 2020 12:14:11 +0200 Subject: [PATCH 038/144] adding a slider at the weekly view for changing days count --- .../calendar/pro/activities/MainActivity.kt | 9 ++-- .../pro/fragments/WeekFragmentsHolder.kt | 43 ++++++++++++++++--- .../calendar/pro/helpers/Config.kt | 5 ++- .../calendar/pro/helpers/Constants.kt | 1 + .../main/res/layout/fragment_week_holder.xml | 32 ++++++++++++++ 5 files changed, 79 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 87efc1937..a1e5d2c3f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -82,7 +82,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { appLaunched(BuildConfig.APPLICATION_ID) checkWhatsNewDialog() - calendar_fab.beVisibleIf(config.storedView != YEARLY_VIEW) + calendar_fab.beVisibleIf(config.storedView != YEARLY_VIEW && config.storedView != WEEKLY_VIEW) calendar_fab.setOnClickListener { launchNewEventIntent(currentFragments.last().getNewEventDayCode()) } @@ -279,7 +279,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { mIsSearchOpen = false search_holder.beGone() - calendar_fab.beVisibleIf(currentFragments.last() !is YearFragmentsHolder) + calendar_fab.beVisibleIf(currentFragments.last() !is YearFragmentsHolder && currentFragments.last() !is WeekFragmentsHolder) invalidateOptionsMenu() return true } @@ -410,10 +410,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { RadioItem(EVENTS_LIST_VIEW, getString(R.string.simple_event_list))) RadioGroupDialog(this, items, config.storedView) { - calendar_fab.beVisibleIf(it as Int != YEARLY_VIEW) resetActionBarTitle() closeSearch() - updateView(it) + updateView(it as Int) shouldGoToTodayBeVisible = false invalidateOptionsMenu() } @@ -643,7 +642,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun updateView(view: Int) { - calendar_fab.beVisibleIf(view != YEARLY_VIEW) + calendar_fab.beVisibleIf(view != YEARLY_VIEW && view != WEEKLY_VIEW) config.storedView = view checkSwipeRefreshAvailability() updateViewPager() diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt index 8deba96df..11b2e8114 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.DatePicker +import android.widget.RelativeLayout import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -28,6 +29,8 @@ import org.joda.time.DateTime class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { private val PREFILLED_WEEKS = 151 + private val MIN_SEEKBAR_VALUE = 1 + private val MAX_SEEKBAR_VALUE = 14 private var viewPager: MyViewPager? = null private var weekHolder: ViewGroup? = null @@ -104,6 +107,27 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { } }) weekHolder!!.week_view_hours_scrollview.setOnTouchListener { view, motionEvent -> true } + + weekHolder!!.week_view_seekbar.apply { + progress = context?.config?.weeklyViewDays ?: 7 + max = MAX_SEEKBAR_VALUE + + onSeekBarChangeListener { + if (it == 0) { + progress = 1 + } + + updateWeeklyViewDays(progress) + } + } + + // avoid seekbar width changing if the days count changes to 1, 10 etc + weekHolder!!.week_view_days_count.onGlobalLayout { + weekHolder!!.week_view_seekbar.layoutParams.width = weekHolder!!.week_view_seekbar.width + (weekHolder!!.week_view_seekbar.layoutParams as RelativeLayout.LayoutParams).removeRule(RelativeLayout.START_OF) + } + + updateDaysCount(context?.config?.weeklyViewDays ?: 7) updateActionBarTitle() } @@ -149,11 +173,11 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { datePicker.init(dateTime.year, dateTime.monthOfYear - 1, dateTime.dayOfMonth, null) AlertDialog.Builder(context!!) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.ok) { dialog, which -> dateSelected(dateTime, datePicker) } - .create().apply { - activity?.setupDialogStuff(view, this) - } + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.ok) { dialog, which -> dateSelected(dateTime, datePicker) } + .create().apply { + activity?.setupDialogStuff(view, this) + } } private fun dateSelected(dateTime: DateTime, datePicker: DatePicker) { @@ -176,6 +200,15 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { setupFragment() } + private fun updateWeeklyViewDays(days: Int) { + context!!.config.weeklyViewDays = days + updateDaysCount(days) + } + + private fun updateDaysCount(cnt: Int) { + weekHolder!!.week_view_days_count.text = context!!.resources.getQuantityString(R.plurals.days, cnt, cnt) + } + override fun refreshEvents() { (viewPager?.adapter as? MyWeekPagerAdapter)?.updateCalendars(viewPager!!.currentItem) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt index 153ba98cd..3a6092b47 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt @@ -2,7 +2,6 @@ package com.simplemobiletools.calendar.pro.helpers import android.content.Context import android.media.AudioManager -import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.scheduleCalDAVSync import com.simplemobiletools.commons.extensions.getDefaultAlarmTitle @@ -183,4 +182,8 @@ class Config(context: Context) : BaseConfig(context) { var weeklyViewItemHeightMultiplier: Float get() = prefs.getFloat(WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER, 1f) set(weeklyViewItemHeightMultiplier) = prefs.edit().putFloat(WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER, weeklyViewItemHeightMultiplier).apply() + + var weeklyViewDays: Int + get() = prefs.getInt(WEEKLY_VIEW_DAYS, 7) + set(weeklyViewDays) = prefs.edit().putInt(WEEKLY_VIEW_DAYS, weeklyViewDays).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt index e63fde821..58112c0c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt @@ -75,6 +75,7 @@ const val ALLOW_CHANGING_TIME_ZONES = "allow_changing_time_zones" const val LAST_EXPORT_PATH = "last_export_path" const val EXPORT_PAST_EVENTS = "export_past_events" const val WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER = "weekly_view_item_height_multiplier" +const val WEEKLY_VIEW_DAYS = "weekly_view_days" // repeat_rule for monthly and yearly repetition const val REPEAT_SAME_DAY = 1 // i.e. 25th every month, or 3rd june (if yearly repetition) diff --git a/app/src/main/res/layout/fragment_week_holder.xml b/app/src/main/res/layout/fragment_week_holder.xml index fc1ad4682..90728275c 100644 --- a/app/src/main/res/layout/fragment_week_holder.xml +++ b/app/src/main/res/layout/fragment_week_holder.xml @@ -1,5 +1,6 @@ + + + + + + From 110250cf296fdf1f088c910f9939e6106c0e5738 Mon Sep 17 00:00:00 2001 From: fnrngg Date: Mon, 8 Jun 2020 15:18:49 +0400 Subject: [PATCH 039/144] Shows the same "Discard changes" as Simple Draw and doesn't show it if new event hasn't changed --- .../calendar/pro/activities/EventActivity.kt | 42 +++++++++++++++---- .../pro/dialogs/CloseEditingDialog.kt | 33 --------------- .../layout/dialog_return_without_saving.xml | 42 ------------------- app/src/main/res/values/strings.xml | 3 -- 4 files changed, 33 insertions(+), 87 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt delete mode 100644 app/src/main/res/layout/dialog_return_without_saving.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index 63aca978a..eaa7e7ee8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -32,6 +32,7 @@ import com.simplemobiletools.calendar.pro.extensions.* import com.simplemobiletools.calendar.pro.helpers.* import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.models.* +import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.* @@ -123,6 +124,9 @@ class EventActivity : SimpleActivity() { } } + + + private fun gotEvent(savedInstanceState: Bundle?, localEventType: EventType?, event: Event?) { if (localEventType == null || localEventType.caldavCalendarId != 0) { config.lastUsedLocalEventTypeId = REGULAR_EVENT_TYPE_ID @@ -270,8 +274,8 @@ class EventActivity : SimpleActivity() { } private fun isEventChanged(): Boolean { - var newStartTS = 0L - var newEndTS = 0L + var newStartTS: Long + var newEndTS: Long getStartEndTimes().apply { newStartTS = first newEndTS = second @@ -295,12 +299,11 @@ class EventActivity : SimpleActivity() { override fun onBackPressed() { if (isEventChanged()) { - CloseEditingDialog(this) { - when (it) { - CLOSE_WITHOUT_SAVING -> { - finish() - } - SAVE_AND_CLOSE -> saveCurrentEvent() + ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) { + if (it) { + saveCurrentEvent() + } else { + super.onBackPressed() } } } else { @@ -439,6 +442,27 @@ class EventActivity : SimpleActivity() { checkAttendees() } + private fun addDefValuesToNewEvent() { + var newStartTS: Long + var newEndTS: Long + getStartEndTimes().apply { + newStartTS = first + newEndTS = second + } + + mEvent.apply { + startTS = newStartTS + endTS = newEndTS + reminder1Minutes = mReminder1Minutes + reminder1Type = mReminder1Type + reminder2Minutes = mReminder2Minutes + reminder2Type = mReminder2Type + reminder3Minutes = mReminder3Minutes + reminder3Type = mReminder3Type + eventType = mEventTypeId + } + } + private fun setupNewEvent() { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) event_title.requestFocus() @@ -487,7 +511,7 @@ class EventActivity : SimpleActivity() { } mEventEndDateTime = mEventStartDateTime.plusMinutes(addMinutes) } - + addDefValuesToNewEvent() checkAttendees() } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt deleted file mode 100644 index 00f710a75..000000000 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/CloseEditingDialog.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.simplemobiletools.calendar.pro.dialogs - -import android.app.Activity -import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog -import com.simplemobiletools.calendar.pro.R -import com.simplemobiletools.calendar.pro.helpers.* -import com.simplemobiletools.commons.extensions.setupDialogStuff -import kotlinx.android.synthetic.main.dialog_return_without_saving.view.* - -class CloseEditingDialog(val activity: Activity, val callback: (closeRule: Int) -> Unit) { - val dialog: AlertDialog? - - init { - val view = activity.layoutInflater.inflate(R.layout.dialog_return_without_saving, null) - - dialog = AlertDialog.Builder(activity) - .setPositiveButton(R.string.yes) { _, _ -> dialogConfirmed(view as ViewGroup) } - .setNegativeButton(R.string.no, null) - .create().apply { - activity.setupDialogStuff(view, this) - } - } - - private fun dialogConfirmed(view: ViewGroup) { - val closeRule = when (view.close_event_radio_view.checkedRadioButtonId) { - R.id.close_event_without_saving -> CLOSE_WITHOUT_SAVING - else -> SAVE_AND_CLOSE - } - dialog?.dismiss() - callback(closeRule) - } -} diff --git a/app/src/main/res/layout/dialog_return_without_saving.xml b/app/src/main/res/layout/dialog_return_without_saving.xml deleted file mode 100644 index c32c06cde..000000000 --- a/app/src/main/res/layout/dialog_return_without_saving.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ce6350cf..3699b4f9a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,9 +293,6 @@ Reddit: https://www.reddit.com/r/SimpleMobileTools - Are you sure you want to close? - Close without saving - Save and close + Calendar lunar + Calendar listă evenimente + Calendar data de azi + + + Eveniment + Modifică evenimentul + Eveniment nou + Crează un nou eveniment + Duplică evenimentul + Titlul nu poate fi gol + Evenimentul nu se poate încheia mai devreme decât începe + Evenimentul a fost adăugat cu suces + Eveniment actualizat cu succes + Filtrează evenimentele după tip + Completează o locație care să fie afișată pe o hartă + Un eveniment se apropie + + + Repetiție + Fară repetiție + Zilnic + Săptămânal + Lunar + Anual + săptămâni + luni + ani + Repetă până + Pentru totdeauna + Evenimentul este repetabil + Selecția conține evenimente repetitive + Ștergeți numai evenimentul repetitiv selectat + Ștergeți acest și toate evenimentele repetitive viitoare + Ștergeți toate evenimentele repetitive viitoare + Actualizați numai evenimentul repetitiv selectat + Actualizați toate evenimentele repetitive + Repetă până la o dată + Oprește repetiția după x întâmplări + Repetă pentru totdeauna + ori + Repetă + Repeat în + În fiecare zi + On selected days + Aceeași zi + Ultima zi + Repetă în aceeași zi lunar + Repetă în ultima zi lunar + Repetă în aceeași zi anual + Repetă zilnic + În fiecare + prima + a doua + a treia + a patra + ultima + + + + În fiecare + În fiecare + prima + a doua + a treia + a patra + ultima + + + Zile de naștere + Adaugă Zile de naștere din contacte + Nu s-au găsit zile de naștere + Nu s-au găsit zile de naștere nou + Zile de naștere adăugate cu succes + + + Aniversări + Adăugați aniversări din contacte + Nu s-au găsit aniversări + Nu s-au găsit aniversări noi + Aniversări adăugate cu succes + + + Reamintire + înainte de + Adaugă altă reamintire + Remintiri eveniment + + + Adaugă o altă participare + Statusul meu: + Particip + Nu particip + Poate particip + Invitat + + + Introduce o țară sau un fus orar + + + Importă evenimente + Exportă evenimente + Importă evenimente dintr-un fișier .ics + Exportă evenimente dintr-un fișier .ics + Tipul evenimentului implicit + Exportă și evenimentele din trecut + Include tipurile de eveniment + Numefisier (fără .ics) + Înlocuiți tipurile de eveniment din fișier + + + Locație + Descripție + Toată ziua + + + Săptămână + + + Tipuri de eveniment + Adaugă un tip nou + Modifică tipul + Există deja un tip cu acest nume + Culoare + Eveniment normal + Tipul de eveniment implicit nu poate fi șters + Selectează un tip de eveniment + Mută evenimentele afectate în tipul de eveniment implicit + Înlătură definitiv evenimentele afectate + Pentru a elimina un calendar CalDAV, trebuie să îl dezincronizați + + + Sărbătoare + Adaugă sărbători + Sărbători naționale + Sărbători religioase + Sărbătorile au fost importate cu succes în tipul de eveniment \"Sărbători\" + Importarea unor evenimente a eșuat + Importarea sărbătorilor a eșuat + + + Gestionează tipurile de evenimente + Începe ziua la + Ziua se termină la + Afișează numerele săptămânii + Vibrați la notificarea de reamintire + Sunetul reamintiri + Nu a fost găsită nicio aplicație capabilă să stabilească tonul de apel + Nici unul + Ziua nu se poate termina mai devreme decât începe + CalDAV sincronizare + Liste de evenimente + Afișează evenimente din trecut + Înlocuiește descrierea evenimentului cu locația + Șterge toate evenimentele + Sigur doriți să ștergeți toate evenimentele? Acest lucru va lăsa tipurile de evenimente și alte setări intacte. + Show a gridAfișați o grilă + Repetă reamintirile până când sunt închise + Ascunde evenimentele din trecut + Evenimente + Flux audio folosit de reamintiri + Sistem + Alarmă + Notificare + Clopoțel + Utilizați reamintirile din ultimele evenimente ca setare implicită pentru evenimente noi + Reamintire implicită 1 + Reamintire implicită 2 + Reamintire implicită 3 + Vizualizare pentru a deschide din widget-ul listei de evenimente + Ultima vizualizare + Evenimente noi + Ora de pornire implicită + Următoarea oră totală + Durata implicită + Ultima folosită + Alt timp + Evidențiază weekend-urile in anumite vizualizări + Permite modificarea zonele orare ale evenimentului + + + CalDAV + Selectează calendarele pentru sincronizare + Gestionează calendarele sincronizate + Depozitați numai local + Actualizează calendarele CalDAV + Se reîmprospătează… + Reimprospatare completă + Editarea calendarului a eșuat + Se sincronizează… + Sincronizare completă + Selectați o culoare diferită (poate fi aplicată doar local) + Nu aveți voie să scrieți în calendarul selectat + Eveniment nu a fost găsit. Activați sincronizarea CalDAV pentru calendarul corespunzător în setările aplicației. + Nu au fost găsite calendare sincronizabile + + + + Luni + Marți + Miercuri + Joi + Vineri + Sâmbătă + Duminică + + + Antrenament + Leg day + Întâlnire cu Ion + În grădina Rockstone + Bibliotecă + Prânz cu Maria + În Plaza + Timp pentru cafea + + + Cum pot elimina sărbătorile importate prin intermediul butonului \"Adaugă sărbători\"? + Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types, + long press the given event type and delete it by selecting the trashbin. + Can I sync my events via Google Calendar, or other service supporting CalDAV? + Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers. + In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVx5. + I see the visual reminders, but hear no audio. What can I do? + Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings, + pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted. + Does the app support time zones? + Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, + you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + + + + Simple Calendar Pro - Evenimente și Reamintiri + + Calendar simplu 2020. Planificare și reamintire întâlnire pentru orice zi + + Simple Calendar Pro este complet personalizabil, calendar offline conceput pentru a face exact ceea ce ar trebui să facă un calendar. Fără caracteristici complicate, permisiuni inutile și fără reclame! + + Fie că organizați evenimente individuale sau repetitive, zile de naștere, aniversări, întâlniri de afaceri, programări sau orice altceva, Simple Calendar Pro face ușor să rămâneți organizat. Cu o varietate incredibilă de opțiuni de personalizare, puteți personaliza reamintiri pentru evenimente, sunete de notificare, widgeturi de calendar și aspectul aplicației. + + Vizualizările zilnice, săptămânale și lunare fac ca verificarea evenimentelor viitoare și a programărilor să fie o briză. Puteți vedea chiar totul ca pe o simplă listă de evenimente, mai degrabă decât în vizualizarea calendarului, astfel încât să știți exact ce se întâmplă în viața dvs. și când. + + ---------------------------------------------------------- + Simple Calendar Pro – Caracteristici și Benefici + ---------------------------------------------------------- + + ✔️ Fără reclame sau pop-up-uri enervante + ✔️ Nu este nevoie de acces la internet, oferindu-vă mai multă confidențialitate și securitate + ✔️ Doar permisiunile minime necesare + ✔️ Accent pe simplitate - face ceea ce un calendar trebuie să facă! + ✔️ Open source + ✔️ Teme complet personalizabile și widgeturi de calendar / eveniment + ✔️ Tradus în 29 de limbi + ✔️ Exportați setările în fișiere .txt pentru a le importa pe un alt dispozitiv + ✔️ Sincronizare calendar CalDAV este suportată, pentru a sincroniza evenimente pe dispozitive multiple + ✔️ Vizualizări zilnice, săptămânale, lunare, anuale și evenimente din calendar + ✔️ Acceptă exportarea și importarea evenimentelor prin fișiere .ics + ✔️ Setați multiple reamintiri pentru evenimente, personalizați sunetul și vibrațiile pentru acestea + ✔️ Opțiune de amânare pentru reamintiri + ✔️ Puteți adăuga ușor sărbători, zile de naștere, aniversări și programări + ✔️ Personalizați evenimentele - ora de pornire, durata, reamintiri etc. + ✔️ Puteți seta optine de participare la eveniment pentru fiecare eveniment + ✔️ Utilizați ca calendar personal sau calendar de afaceri + ✔️ Alegeți dintre reamintiri și notificări prin e-mail pentru a vă avertiza despre un eveniment + + DESCARCĂ SIMPLE CALENDAR PRO – CALENDARUL SIMPLU OFFLINE FĂRĂ RECLAME! + + Verificați aici pachetul complet al Simple Tools aici: + https://www.simplemobiletools.com + + Site propriu pentru Simple Calendar Pro: + https://www.simplemobiletools.com/calendar + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + From 65b23ec68e4b1c4e966186974aa6a76a3e2be553 Mon Sep 17 00:00:00 2001 From: Rel-Oiv <67479592+Rel-Oiv@users.noreply.github.com> Date: Fri, 26 Jun 2020 22:51:21 +0300 Subject: [PATCH 065/144] Fixed Romanian language errors Fixed spelling errors, translated the FAQ part. --- app/src/main/res/values-ro/strings.xml | 40 +++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1f7e064ad..f2cd291c6 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -26,7 +26,7 @@ Duplică evenimentul Titlul nu poate fi gol Evenimentul nu se poate încheia mai devreme decât începe - Evenimentul a fost adăugat cu suces + Evenimentul a fost adăugat cu succes Eveniment actualizat cu succes Filtrează evenimentele după tip Completează o locație care să fie afișată pe o hartă @@ -56,9 +56,9 @@ Repetă pentru totdeauna ori Repetă - Repeat în + Repetă în În fiecare zi - On selected days + În zilele selectate Aceeași zi Ultima zi Repetă în aceeași zi lunar @@ -100,7 +100,7 @@ Reamintire înainte de Adaugă altă reamintire - Remintiri eveniment + Reamintiri eveniment Adaugă o altă participare @@ -143,7 +143,7 @@ Selectează un tip de eveniment Mută evenimentele afectate în tipul de eveniment implicit Înlătură definitiv evenimentele afectate - Pentru a elimina un calendar CalDAV, trebuie să îl dezincronizați + Pentru a elimina un calendar CalDAV, trebuie să îl desincronizați Sărbătoare @@ -170,7 +170,7 @@ Înlocuiește descrierea evenimentului cu locația Șterge toate evenimentele Sigur doriți să ștergeți toate evenimentele? Acest lucru va lăsa tipurile de evenimente și alte setări intacte. - Show a gridAfișați o grilă + Afișați o grilă Repetă reamintirile până când sunt închise Ascunde evenimentele din trecut Evenimente @@ -201,14 +201,14 @@ Depozitați numai local Actualizează calendarele CalDAV Se reîmprospătează… - Reimprospatare completă + Reîmprospătare completă Editarea calendarului a eșuat Se sincronizează… Sincronizare completă Selectați o culoare diferită (poate fi aplicată doar local) Nu aveți voie să scrieți în calendarul selectat Eveniment nu a fost găsit. Activați sincronizarea CalDAV pentru calendarul corespunzător în setările aplicației. - Nu au fost găsite calendare sincronizabile + Nu au fost găsite calendare care se pot sincroniza @@ -222,7 +222,7 @@ Antrenament - Leg day + Zi antrenament pentru picioare Întâlnire cu Ion În grădina Rockstone Bibliotecă @@ -232,17 +232,17 @@ Cum pot elimina sărbătorile importate prin intermediul butonului \"Adaugă sărbători\"? - Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types, - long press the given event type and delete it by selecting the trashbin. - Can I sync my events via Google Calendar, or other service supporting CalDAV? - Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers. - In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVx5. - I see the visual reminders, but hear no audio. What can I do? - Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings, - pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted. - Does the app support time zones? - Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, - you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + Sărbători create așa sunt introduse intr-un tip de event nou numit \"Sărbători\". Puteți să vă duceți in Setări -> Gestionează tipurile de evenimente, + apăsați lung tipul de eveniment dat și ștergeți-l selectând coșul de gunoi. + Pot sincroniza evenimentele mele prin Google Calendar sau alt serviciu care acceptă CalDAV? + Da, trebuie doar să comutați \"sincronizarea CalDAV\" în setările aplicației și să selectați calendarele pe care doriți să le sincronizați. Cu toate acestea, veți avea nevoie de o aplicație terță care se ocupă de sincronizarea dintre dispozitiv și servere. + În cazul în care doriți să sincronizați un calendar Google, aplicația lor oficială Calendar va face sincronizarea. Pentru alte calendare, veți avea nevoie de un adaptor de sincronizare de la terți, de exemplu DAVx5. + Văd reamintiri vizuale, dar nu aud niciun audio. Ce pot sa fac? + Nu doar afișarea reamintirilor propriu-zise, dar și redarea audio este extrem de afectată de sistem. Dacă nu auziți niciun sunet, încercați să accesați setările aplicației, + apăsând opțiunea \"Flux audio folosit de reamintiri\" și schimbați-o la o altă valoare. Dacă tot nu funcționează, verificați setările de sunet, dacă fluxul special nu este dezactivat. + Aplicația acceptă fusuri orare? + Da, aceptă. În mod implicit, toate evenimentele sunt create în fusul dvs. curent. Dacă doriți să schimbați fusul orar al evenimentelor, + mai întâi va trebui să activați selectorul de fus orar la setările aplicației, apoi să-l schimbați în ecranul Detalii despre eveniment. Acesta opțiune este dezactivată implicit, deoarece majoritatea oamenilor nu au nevoie de ea. From e1646d318590a4488de5f2d0471a3fa5d6b4fc7c Mon Sep 17 00:00:00 2001 From: Rel-Oiv <67479592+Rel-Oiv@users.noreply.github.com> Date: Fri, 26 Jun 2020 23:10:55 +0300 Subject: [PATCH 066/144] Romanian grammar fixes Fixed a few Romanian grammar typos. --- app/src/main/res/values-ro/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f2cd291c6..76847efa0 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -22,7 +22,7 @@ Eveniment Modifică evenimentul Eveniment nou - Crează un nou eveniment + Creează un nou eveniment Duplică evenimentul Titlul nu poate fi gol Evenimentul nu se poate încheia mai devreme decât începe @@ -34,7 +34,7 @@ Repetiție - Fară repetiție + Fără repetiție Zilnic Săptămânal Lunar @@ -191,7 +191,7 @@ Durata implicită Ultima folosită Alt timp - Evidențiază weekend-urile in anumite vizualizări + Evidențiază weekend-urile în anumite vizualizări Permite modificarea zonele orare ale evenimentului @@ -232,7 +232,7 @@ Cum pot elimina sărbătorile importate prin intermediul butonului \"Adaugă sărbători\"? - Sărbători create așa sunt introduse intr-un tip de event nou numit \"Sărbători\". Puteți să vă duceți in Setări -> Gestionează tipurile de evenimente, + Sărbători create așa sunt introduse într-un tip de event nou numit \"Sărbători\". Puteți să vă duceți în Setări -> Gestionează tipurile de evenimente, apăsați lung tipul de eveniment dat și ștergeți-l selectând coșul de gunoi. Pot sincroniza evenimentele mele prin Google Calendar sau alt serviciu care acceptă CalDAV? Da, trebuie doar să comutați \"sincronizarea CalDAV\" în setările aplicației și să selectați calendarele pe care doriți să le sincronizați. Cu toate acestea, veți avea nevoie de o aplicație terță care se ocupă de sincronizarea dintre dispozitiv și servere. @@ -241,7 +241,7 @@ Nu doar afișarea reamintirilor propriu-zise, dar și redarea audio este extrem de afectată de sistem. Dacă nu auziți niciun sunet, încercați să accesați setările aplicației, apăsând opțiunea \"Flux audio folosit de reamintiri\" și schimbați-o la o altă valoare. Dacă tot nu funcționează, verificați setările de sunet, dacă fluxul special nu este dezactivat. Aplicația acceptă fusuri orare? - Da, aceptă. În mod implicit, toate evenimentele sunt create în fusul dvs. curent. Dacă doriți să schimbați fusul orar al evenimentelor, + Da, acceptă. În mod implicit, toate evenimentele sunt create în fusul dvs. curent. Dacă doriți să schimbați fusul orar al evenimentelor, mai întâi va trebui să activați selectorul de fus orar la setările aplicației, apoi să-l schimbați în ecranul Detalii despre eveniment. Acesta opțiune este dezactivată implicit, deoarece majoritatea oamenilor nu au nevoie de ea. @@ -250,7 +250,7 @@ Calendar simplu 2020. Planificare și reamintire întâlnire pentru orice zi - Simple Calendar Pro este complet personalizabil, calendar offline conceput pentru a face exact ceea ce ar trebui să facă un calendar. Fără caracteristici complicate, permisiuni inutile și fără reclame! + Simple Calendar Pro poate fi complet personalizat, calendar offline conceput pentru a face exact ceea ce ar trebui să facă un calendar. Fără caracteristici complicate, permisiuni inutile și fără reclame! Fie că organizați evenimente individuale sau repetitive, zile de naștere, aniversări, întâlniri de afaceri, programări sau orice altceva, Simple Calendar Pro face ușor să rămâneți organizat. Cu o varietate incredibilă de opțiuni de personalizare, puteți personaliza reamintiri pentru evenimente, sunete de notificare, widgeturi de calendar și aspectul aplicației. @@ -275,7 +275,7 @@ ✔️ Opțiune de amânare pentru reamintiri ✔️ Puteți adăuga ușor sărbători, zile de naștere, aniversări și programări ✔️ Personalizați evenimentele - ora de pornire, durata, reamintiri etc. - ✔️ Puteți seta optine de participare la eveniment pentru fiecare eveniment + ✔️ Puteți seta opțiune de participare pentru fiecare eveniment ✔️ Utilizați ca calendar personal sau calendar de afaceri ✔️ Alegeți dintre reamintiri și notificări prin e-mail pentru a vă avertiza despre un eveniment From 44ba9d383304c615515d7c426c925aa2407a9c7d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 26 Jun 2020 23:29:08 +0200 Subject: [PATCH 067/144] adding romanian app descriptions --- .../metadata/android/ro/full_description.txt | 42 +++++++++++++++++++ .../metadata/android/ro/short_description.txt | 1 + fastlane/metadata/android/ro/title.txt | 1 + 3 files changed, 44 insertions(+) create mode 100644 fastlane/metadata/android/ro/full_description.txt create mode 100644 fastlane/metadata/android/ro/short_description.txt create mode 100644 fastlane/metadata/android/ro/title.txt diff --git a/fastlane/metadata/android/ro/full_description.txt b/fastlane/metadata/android/ro/full_description.txt new file mode 100644 index 000000000..078d1856b --- /dev/null +++ b/fastlane/metadata/android/ro/full_description.txt @@ -0,0 +1,42 @@ +Simple Calendar Pro poate fi complet personalizat, calendar offline conceput pentru a face exact ceea ce ar trebui să facă un calendar. Fără caracteristici complicate, permisiuni inutile și fără reclame! + +Fie că organizați evenimente individuale sau repetitive, zile de naștere, aniversări, întâlniri de afaceri, programări sau orice altceva, Simple Calendar Pro face ușor să rămâneți organizat. Cu o varietate incredibilă de opțiuni de personalizare, puteți personaliza reamintiri pentru evenimente, sunete de notificare, widgeturi de calendar și aspectul aplicației. + +Vizualizările zilnice, săptămânale și lunare fac ca verificarea evenimentelor viitoare și a programărilor să fie o briză. Puteți vedea chiar totul ca pe o simplă listă de evenimente, mai degrabă decât în vizualizarea calendarului, astfel încât să știți exact ce se întâmplă în viața dvs. și când. + +---------------------------------------------------------- +Simple Calendar Pro – Caracteristici și Benefici +---------------------------------------------------------- + +✔️ Fără reclame sau pop-up-uri enervante +✔️ Nu este nevoie de acces la internet, oferindu-vă mai multă confidențialitate și securitate +✔️ Doar permisiunile minime necesare +✔️ Accent pe simplitate - face ceea ce un calendar trebuie să facă! +✔️ Open source +✔️ Teme complet personalizabile și widgeturi de calendar / eveniment +✔️ Tradus în 29 de limbi +✔️ Exportați setările în fișiere .txt pentru a le importa pe un alt dispozitiv +✔️ Sincronizare calendar CalDAV este suportată, pentru a sincroniza evenimente pe dispozitive multiple +✔️ Vizualizări zilnice, săptămânale, lunare, anuale și evenimente din calendar +✔️ Acceptă exportarea și importarea evenimentelor prin fișiere .ics +✔️ Setați multiple reamintiri pentru evenimente, personalizați sunetul și vibrațiile pentru acestea +✔️ Opțiune de amânare pentru reamintiri +✔️ Puteți adăuga ușor sărbători, zile de naștere, aniversări și programări +✔️ Personalizați evenimentele - ora de pornire, durata, reamintiri etc. +✔️ Puteți seta opțiune de participare pentru fiecare eveniment +✔️ Utilizați ca calendar personal sau calendar de afaceri +✔️ Alegeți dintre reamintiri și notificări prin e-mail pentru a vă avertiza despre un eveniment + +DESCARCĂ SIMPLE CALENDAR PRO – CALENDARUL SIMPLU OFFLINE FĂRĂ RECLAME! + +Verificați aici pachetul complet al Simple Tools aici: +https://www.simplemobiletools.com + +Site propriu pentru Simple Calendar Pro: +https://www.simplemobiletools.com/calendar + +Facebook: +https://www.facebook.com/simplemobiletools + +Reddit: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/ro/short_description.txt b/fastlane/metadata/android/ro/short_description.txt new file mode 100644 index 000000000..c9e0259f9 --- /dev/null +++ b/fastlane/metadata/android/ro/short_description.txt @@ -0,0 +1 @@ +Calendar simplu 2020. Planificare și reamintire întâlnire pentru orice zi diff --git a/fastlane/metadata/android/ro/title.txt b/fastlane/metadata/android/ro/title.txt new file mode 100644 index 000000000..52ef889f3 --- /dev/null +++ b/fastlane/metadata/android/ro/title.txt @@ -0,0 +1 @@ +Simple Calendar Pro - Evenimente și Reamintiri From 67086c2193b83e392b5cdd987c3f6cbeb6ddbbe2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 28 Jun 2020 13:03:46 +0200 Subject: [PATCH 068/144] updating the german and spanish short app descriptions --- app/src/main/res/values-de/strings.xml | 2 +- fastlane/metadata/android/de/short_description.txt | 2 +- fastlane/metadata/android/es/short_description.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 314311e3a..d04efbe6e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -249,7 +249,7 @@ Simple Calendar Pro - Termine & Erinnerungen - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Der beste Kalender zum Organisieren der Ereignisse während des ganzen Tages Simple Calendar Pro ist ein vollständig anpassbarer Offline-Kalender, der genau das bietet, was man von einem Kalender erwartet. Keine umständlichen Funktionen, keine unnötigen Berechtigungen und keine Werbung! diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index 351126245..54a809e68 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Ein großartiger Kalender ohne Werbung, 100% Geld-zurück-Garantie. +Der beste Kalender zum Organisieren der Ereignisse während des ganzen Tages diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt index 0953071f6..cd8d3cf60 100644 --- a/fastlane/metadata/android/es/short_description.txt +++ b/fastlane/metadata/android/es/short_description.txt @@ -1 +1 @@ -Se notificado de los momentos importantes en tu vida. +El mejor calendario práctico para organizar eventos durante todo el día From a9932707ff869eca4d4748f8d46a486524f3eb97 Mon Sep 17 00:00:00 2001 From: Honk2 Date: Sun, 28 Jun 2020 21:47:06 +0200 Subject: [PATCH 069/144] modified day code validation for multi day events to fix 1164 --- .../simplemobiletools/calendar/pro/fragments/WeekFragment.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 7947ae1b0..1e0215b58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -595,8 +595,9 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } - val dayCode = Formatter.getDayCodeFromDateTime(startDateTime) - val dayOfWeek = dayColumns.indexOfFirst { it.tag == dayCode } + val dayCodeStart = Formatter.getDayCodeFromDateTime(startDateTime).toInt() + val dayCodeEnd = Formatter.getDayCodeFromDateTime(endDateTime).toInt() + val dayOfWeek = dayColumns.indexOfFirst { it.tag.toInt() == dayCodeStart || (it.tag.toInt() > dayCodeStart && it.tag.toInt() <= dayCodeEnd) } if (dayOfWeek == -1) { return } From 078df48c3d3b1f9b3a2cff14f6bfd057be3d9726 Mon Sep 17 00:00:00 2001 From: susosl Date: Thu, 2 Jul 2020 20:40:34 +0200 Subject: [PATCH 070/144] improved gl translations of weekdays and faq strings --- app/src/main/res/values-gl/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 6719e83d4..96e8479ed 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -117,7 +117,7 @@ Importar eventos Exportar eventos Importar eventos desde un ficheiro .ics - Exportar eventos desde un ficheiro .ics + Exportar eventos a un ficheiro .ics Tipo de evento predeterminado Exportar tamén eventos pasados Incluír tipos de eventos @@ -212,13 +212,13 @@ - Segunda - Terceira - Cuarta - Quinta - Sexta - Sábado - Domingo + luns + martes + mércores + xoves + venres + sábado + domingo Exercicio @@ -231,17 +231,17 @@ Hora do café - Como podo eliminar as vacacións engadidas vía o botón \"Engadir vacacións\"? - As vacacións creadas dese xeito insértanse nun tipo de evento chamado \"Vacacións\". Podes ir a Axustes -> Xestionar tipo de eventos, + Como podo eliminar os días festivos engadidos vía o botón \"Engadir días festivos\"? + Os días festivos creados dese xeito insértanse nun tipo de evento chamado \"Festivo\". Podes ir a Axustes -> Xestionar tipo de eventos, manter preso o tipo de evento desexado e eliminalo escollendo o caldeiro do lixo. Podo sincronizar os meus eventos vía Google Calendar, ou outro servizo que use CalDAV? Si, activa \"CalDAV sincr.\" nos axustes da app e escolle os calendarios que queres sincronizar. Porén, precisas unha app de terceiros para xestionar a sincronización entre dispositivos e servidores. Se desexas sincronizar un calendario de Google, a súa app oficial Calendar fará o traballo. Para outros calendario precisas unha app de sincronización, como DAVx5. Vexo os recordatorios visualmente, pero non escoito audio. Que podo facer? - Non só mostrar o recordatorio propiamente dito, se non que a reprodución do son depende en gran medida do sistema tamén. Se non podes escoitar ningún son, intenta ir aos axustes da app e premer en \"Son utilizado polos recordatorios\" e cambia a un valor diferente. Se aínda así non funciona, comproba os axustes de son, que o fluxo en particular non esté acalado. + Non só mostrar o recordatorio propiamente dito, se non que a reprodución do son depende en gran medida do sistema tamén. Se non podes escoitar ningún son, intenta ir aos axustes da app e premer en \"Canle de audio usado polos recordatorios\" e cambialo a un valor diferente. Se aínda así non funciona, comproba os axustes de son, que o fluxo en particular non esté acalado. A app soporta zonas horarias? Si. Por omisión todos os eventos créanse na túa zona horaria actual. Se desexas cambiar a zona horaria dos eventos, - primeiro tes que activar o selector de zona horaria nos axustes da app, e despois cambialo na pantalla de Detalles do Evento. Se está desactivado de inicio porque non o utiliza moita xente. + primeiro tes que activar o selector de zona horaria nos axustes da app, e despois cambialo na pantalla de Detalles do Evento. Está desactivado de inicio porque a maioría da xente non o necesita. From c1b4d094468e9cc835c82745a39d3fabda389996 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Jul 2020 16:40:30 +0200 Subject: [PATCH 071/144] fix #796, fix a glitch with inability to create a new event on weekly view --- .../calendar/pro/fragments/WeekFragment.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 7947ae1b0..6f8209150 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.content.res.Resources import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.os.Handler import android.util.Range import android.view.* import android.widget.ImageView @@ -59,6 +60,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private var wasScaled = false private var selectedGrid: View? = null private var currentTimeView: ImageView? = null + private var fadeOutHandler = Handler() private var allDayHolders = ArrayList() private var allDayRows = ArrayList>() private var currEvents = ArrayList() @@ -275,9 +277,13 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } - animate().setStartDelay(PLUS_FADEOUT_DELAY).alpha(0f).withEndAction { - beGone() - } + // do not use setStartDelay, it will trigger instantly if the device has disabled animations + fadeOutHandler.removeCallbacksAndMessages(null) + fadeOutHandler.postDelayed({ + animate().alpha(0f).withEndAction { + beGone() + } + }, PLUS_FADEOUT_DELAY) } return super.onSingleTapUp(event) } From 97b652dc589256d21f97f83cac883cbc23ed8eeb Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Jul 2020 16:46:41 +0200 Subject: [PATCH 072/144] updating gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 0a6167029..f8d8b6768 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2d407db26..87e513270 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Mar 16 12:20:31 CET 2020 +#Sat Jun 20 12:39:19 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip From 09ad7e72cf28484e1f285e66b5f9b6e03e11e3bb Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Jul 2020 16:59:24 +0200 Subject: [PATCH 073/144] adding a crashfix at drawing the weekly view grid --- .../simplemobiletools/calendar/pro/fragments/WeekFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 23717cebd..880bd8299 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -241,7 +241,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { } private fun initGrid() { - (0 until config.weeklyViewDays).map { dayColumns[it] } + (0 until config.weeklyViewDays).mapNotNull { dayColumns.getOrNull(it) } .forEachIndexed { index, layout -> layout.removeAllViews() val gestureDetector = getViewGestureDetector(layout, index) @@ -596,6 +596,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { allDayRows.last().add(dayIndex) } } + if (wasEventHandled) { break } From f82d03566a414e31b5bf777a44a347b63cb92dcd Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Jul 2020 17:39:21 +0200 Subject: [PATCH 074/144] update version to 6.9.7 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 64ad06504..8ca4cd209 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 179 - versionName "6.9.6" + versionCode 180 + versionName "6.9.7" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 5715c8c4466c6ad0434588339cbcc9fdac7abf95 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Jul 2020 17:39:27 +0200 Subject: [PATCH 075/144] updating changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a441f4b..7a2af96f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 6.9.7 *(2020-07-06)* +---------------------------- + + * Fixed some weekly view related glitches + * Added some stability and translation improvements + Version 6.9.6 *(2020-06-12)* ---------------------------- From 861601973f43cb5604cd2f6e4147f86f6a7087a9 Mon Sep 17 00:00:00 2001 From: Luis Alfredo Figueroa Bracamontes Date: Wed, 15 Jul 2020 18:35:56 -0500 Subject: [PATCH 076/144] =?UTF-8?q?Update=20Strings.xml=20Espa=C3=B1ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values-es/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3f3fdcfb5..f9c1a22e6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -16,7 +16,7 @@ Calendario mensual Lista de eventos del calendario - Calendar today\'s date + Calendario de la fecha de hoy Evento @@ -208,7 +208,7 @@ Seleccionar un color diferente (localmente) No tiene permiso para modificar el calendario Evento no encontrado. Habilite la sincronización de CalDAV para los calendarios en la configuración. - No synchronizable calendars have been found + No se han encontrado calendarios para sincronizar @@ -248,9 +248,9 @@ Calendario Simple Pro - Eventos y Recordatorios - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Calendario móvil Simple 2020. Horarios y recordatorios para cualquier día - Calendario Simple Pro es un calendario fuera de línea, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios! + Calendario Simple Pro es un calendario sin conexión, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios! Ya sea que estes organizando eventos individuales o recurrentes, cumpleaños, aniversarios, reuniones de negocios, citas o cualquier otra cosa, Simple Calendar Pro hace que sea fácil mantenerse organizado . Con una increíble variedad de opciones de personalización , puedes personalizar recordatorios de eventos, sonidos de notificación, widgets de calendario y el aspecto de la aplicación. From 4f072a957d26d9d6df85d008ff80369ee0af9d49 Mon Sep 17 00:00:00 2001 From: Enara Larraitz Date: Thu, 30 Jul 2020 16:05:49 +0200 Subject: [PATCH 077/144] created values-eu; started translating strings.xml (not completed) --- app/src/main/res/values-eu/array.xml | 22 ++ app/src/main/res/values-eu/attrs.xml | 6 + app/src/main/res/values-eu/colors.xml | 7 + app/src/main/res/values-eu/dimens.xml | 34 ++ app/src/main/res/values-eu/donottranslate.xml | 65 ++++ app/src/main/res/values-eu/strings.xml | 301 ++++++++++++++++++ app/src/main/res/values-eu/styles.xml | 32 ++ 7 files changed, 467 insertions(+) create mode 100644 app/src/main/res/values-eu/array.xml create mode 100644 app/src/main/res/values-eu/attrs.xml create mode 100644 app/src/main/res/values-eu/colors.xml create mode 100644 app/src/main/res/values-eu/dimens.xml create mode 100644 app/src/main/res/values-eu/donottranslate.xml create mode 100644 app/src/main/res/values-eu/strings.xml create mode 100644 app/src/main/res/values-eu/styles.xml diff --git a/app/src/main/res/values-eu/array.xml b/app/src/main/res/values-eu/array.xml new file mode 100644 index 000000000..d6f7b475b --- /dev/null +++ b/app/src/main/res/values-eu/array.xml @@ -0,0 +1,22 @@ + + + + @string/no_reminder + @string/at_start + @string/custom + + + + @string/minutes_raw + @string/hours_raw + @string/days_raw + + + + @string/no_repetition + @string/daily + @string/weekly + @string/monthly + @string/yearly + + diff --git a/app/src/main/res/values-eu/attrs.xml b/app/src/main/res/values-eu/attrs.xml new file mode 100644 index 000000000..44af24af0 --- /dev/null +++ b/app/src/main/res/values-eu/attrs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/values-eu/colors.xml b/app/src/main/res/values-eu/colors.xml new file mode 100644 index 000000000..d7dccb434 --- /dev/null +++ b/app/src/main/res/values-eu/colors.xml @@ -0,0 +1,7 @@ + + + @color/md_red_400_dark + @color/md_blue_800 + @color/md_green_700 + @color/md_red_400_dark + diff --git a/app/src/main/res/values-eu/dimens.xml b/app/src/main/res/values-eu/dimens.xml new file mode 100644 index 000000000..221830c09 --- /dev/null +++ b/app/src/main/res/values-eu/dimens.xml @@ -0,0 +1,34 @@ + + + 10dp + 3dp + 6dp + + 40dp + + 60dp + 10dp + 10dp + 60dp + + 250dp + 250dp + + 40dp + + 0dp + 24dp + + 11sp + 14sp + 17sp + 22sp + + 8sp + + 4dp + 100dp + + 40dp + 16dp + diff --git a/app/src/main/res/values-eu/donottranslate.xml b/app/src/main/res/values-eu/donottranslate.xml new file mode 100644 index 000000000..da0c3e0c0 --- /dev/null +++ b/app/src/main/res/values-eu/donottranslate.xml @@ -0,0 +1,65 @@ + + + com.simplemobiletools.calendar.pro + + + Added time zone support (customization has to be enabled in the app settings) + Allow customizing the bottom navigation bar color + Added email reminders and attendees in CalDAV synced events + + Allow setting default start time/duration/event type for new events\n + Allow exporting/importing settings + + Allow setting default event reminders, not always reuse the last events\' ones + + Allow changing the app launcher icon color\n + Added support for more advanced yearly repetition rules\n + Allow setting reminder looping till dismissed\n + Added a button in Settings for changing widget colors without recreating them\n + Added optional dimming of past events + + Reworked custom notification sound picking, should be more reliable + + Added a Location field\n + Allow adding Contact birthdays + + Replaced Google Sync with CalDAV sync, please check Settings for enabling it + Added an initial implementation of Google sync, use with caution (will always be optional) + Added a setting for changing the widget font size + Allow editing specific instances of repeating events + Allow displaying some events from the past in the Simple Event List view + + Added an easy way to import Holidays in some countries\n + Allow filtering events to export by event type\n + Added Snooze + + Add more advanced monthly repetition options, like \"Last day of the month\" or \"Every second Tuesday\" + Add a new event repetition type \"Repeat x times\" + + Added more advanced weekly repetition by week days\n + Added sharing individual events by creating temporary .ics files + + + Replaced raw database exporting with proper .ics file exporting\n + Added color themes + + Allow deleting individual occurrences of repeatable events + Allow toggling 24-hour format in settings + + Added customizable event repeat intervals\n + Multiple improvements to importing events from .ics files + + Added event types with customizable colors + Allow setting up to 3 reminders per event + Added all-day long event support + Allow importing events from .ics files + Allow picking colors by hex codes + Added a weekly view + Event reminder types have been tweaked, please update them + + Added more color customization options\n + Your settings have been cleared, please reset them + Allow changing the reminder notification sound + Added a new view, a list of upcoming events + Added the option to vibrate at notifications + diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml new file mode 100644 index 000000000..a3b09051e --- /dev/null +++ b/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,301 @@ + + + Simple Calendar + Egutegia + Aldatu ikuspegia + Eguneko ikuspegia + Asteko ikuspegia + Hilabeteko ikuspegia + Urteko ikuspegia + Gertaera-zerrenda sinplea + Hurrengo gertaerarik ez. + Joan gauro egunera + Joan datara + Kaixo,\n\nbadirudi doako aplikazio zaharra eguneratu duzula. Eskuz biltegiratutako gertaerak migratu behar dituzu .ics fitxategi batean esportatuz, eta gero inportatuz. Esportazio- eta inportazio-botoiak pantaila nagusiaren menuan aurki ditzakezu.\n\nOndoren, bertsio zaharra desinstalatu dezakezu aplikazioaren ezarpenen goiko aldean dagoen \'Eskuratu Pro bertsioa\' botoiarekin. Azkenik, aplikazioaren ezarpenak berrezarri besterik ez dituzu egin behar.\n\nEskerrik asko! + + + Egutegia hilabetea + Egutegia gertaera-zerrenda + Egutegia gaurko eguna + + + Gertaera + Editatu gertaera + Gertaera berria + Sortu gertaera berria + Bikoiztu gertaera + Izenburuak ezin du hutsik egon + Gertaerak ezin du bukatu hasi baino lehen + Gertaera ondo gehitu da + Gertaera ondo eguneratu da + Iragazi gertaerak motaren arabera + Bete kokalekua mapan erakusteko + An event is upcoming + + + Errepikapena + Errepikapenik ez + Egunero + Astero + Hilabetero + Urtero + asteak + hilabeteak + urteak + Errepikapenen amaiera + Betiko + Gertaera errepikagarria da + Hautaketak errepikatzen diren gertaerak ditu + Ezabatu hautatutako gertaera soilik + Ezabatu gertaera hau eta datozen guztiak + Ezabatu gertaera guztiak + Eguneratu hautatutako gertaera soilik + Eguneratu gertaera guztiak + Errepikatu data zehatz batera arte + Errepikatzeari utzi x gertaera ondoren + Errepikatu betiko + aldiz + Errepikatu + Errepikatu egun hauetan: + Egunero + Hautatutako egunetan + Egun bera + Azken eguna + Errepikatu hilabetero egun berean + Errepikatu hilabeteko azken egunean + Errepikatu urtero egun berean + Errepikatze-maiztasuna + Maiztasuna + lehenengo + bigarren + hirugarren + laugarren + azken + + + + Erepikatze-maiztasuna + Maiztasuna + lehenengo + bigarren + hirugarren + laugarren + azken + + + Urtebetetzeak + Gehitu kontaktuen urtebetetzeak + Urtebetetzerik ez da aurkitu + Urtebetetze berririk ez da aurkitu + Urtebetetzeak ondo gehitu dira + + + Urteurrenak + Gehitu kontaktuen urteurrenak + Urteurrenik ez da aurkitu + Urteurren berririk ez da aurkitu + Urteurrenak ondo gehitu dira + + + Abisua + hau baino lehen: + Gehitu beste abisu bat + Gertaera-abisua + + + Gehitu beste parte-hartzaile bat + Nire egoera: + Banoa + Ez noa + Agian noa + Gonbidatua + + + Sartu herrialdea edo ordu-zona + + + Inportatu gertaerak + Esportatu gertaerak + Inportatu gertaerak .ics fitxategi batetik + Esportatu gertaerak .ics fitxategi batetik + Lehenetsitako gertaera mota + Esportatu iraganeko gertaerak ere bai + Gehitu gertaera motak + Fitxategi-izena (.ics gabe) + Gainidatzi fitxategiko gertaera motak + + + Kokalekua + Deskripzioa + Egun osokoa + + + Astea + + + Gertaera motak + Gehitu mota berria + Editatu mota + Izenburu hau duen mota jada badago + Kolorea + Gertaera arrunta + Lehenetsitako gertaera mota ezin da ezabatu + Hautatu gertaera mota + Move affected events into the default event type + Permanently remove affected events + CalDAV egutegia ezabatzeko desinkronizatu behar duzu + + + Jaiegunak + Gehitu jaiegunak + Tokiko jaiegunak + Jaiegun erlijiosoak + Jaiegunak ondo inportatu dira \"Jaiegunak\" gertaera motan + Gertaera batzuen inportazioak huts egin du + Jaiegunak inportatzeak huts egin du + + + Manage event types + Eguna noiz hasi + Eguna noiz bukatu + Erakutsi asteen zenbakiak + Bibratu abisuen jakinarazpenetan + Abisuen soinua + Dei-tonua ezartzeko gai den aplikaziorik ez da aurkitu + Bat ere ez + Egunak ezin du hasi baino lehen bukatu + CalDAVekin sinkronizatu + Gertaera-zerrendak + Bistaratu iraganeko gertaerak + Ordeztu gertaeraren deskripzioa kokalekuarekin + Ezabatu gertaera guztiak + Ziur zaude gertaera guztiak ezabatu nahi dituzula? Honek gertaera motak eta bestelako ezarpenak berdin utziko ditu. + Erakutsi sareta + Errepikatu abisuak baztertu arte + Lausotu iraganeko gertaerak + Gertaerak + Abisuek erabilitako audio-transmisioa + Sistema + Alarma + Jakinarazpena + Jo tonua + Erabili aurreko gertaeren abisuak gertaera berrien lehenetsitako gisa + Lehenetsitako abisua 1 + Lehenetsitako abisua 2 + Lehenetsitako abisua 3 + View to open from the event list widget + Erabilitako azken ikuspegia + Gertaera berriak + Lehenetsitako hasiera-ordua + Hurrengo ordu osoa + Lehenetsitako iraupena + Erabilitako azkena + Other time + Highlight weekends on some views + Allow changing event time zones + + + CalDAV + Select calendars to sync + Manage synced calendars + Store locally only + Refresh CalDAV calendars + Refreshing… + Refreshing complete + Editing calendar failed + Syncing… + Sync completed + Select a different color (might be applied locally only) + You are not allowed to write in the selected calendar + Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings. + No synchronizable calendars have been found + + + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + + Workout + Leg day + Meeting with John + In Rockstone garden + Library + Lunch with Mary + In the Plaza + Coffee time + + + How can I remove the holidays imported via the \"Add holidays\" button? + Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types, + long press the given event type and delete it by selecting the trashbin. + Can I sync my events via Google Calendar, or other service supporting CalDAV? + Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers. + In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVx5. + I see the visual reminders, but hear no audio. What can I do? + Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings, + pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted. + Does the app support time zones? + Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, + you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + + + + Simple Calendar Pro - Events & Reminders + + Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + + Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads! + + Whether you’re organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it easy to stay organized. With an incredible variety of customization options you can customize event reminders, notification sounds, calendar widgets and how the app looks. + + Daily, weekly and monthly views make checking your upcoming events & appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you know exactly what’s coming up in your life and when. + + ---------------------------------------------------------- + Simple Calendar Pro – Features & Benefits + ---------------------------------------------------------- + + ✔️ No ads or annoying popups + ✔️ No internet access needed, giving you more privacy & security + ✔️ Only the bare minimum permissions required + ✔️ Emphasis on simplicity – does what a calendar needs to do! + ✔️ Open source + ✔️ Fully customizable themes & calendar / event widgets + ✔️ Translated into 29 languages + ✔️ Export settings to .txt files to import to another device + ✔️ CalDAV calendar sync supported to sync events across devices + ✔️ Daily, weekly, monthly, yearly & event views on the calendar + ✔️ Supports exporting & importing events via .ics files + ✔️ Set multiple event reminders, customize event reminder sound and vibration + ✔️ Snooze option for reminders + ✔️ Easily add holidays, birthdays, anniversaries & appointments + ✔️ Customize events – start time, duration, reminders etc + ✔️ Add event attendees to each event + ✔️ Use as a personal calendar or a business calendar + ✔️ Choose between reminders & email notifications to alert you about an event + + DOWNLOAD SIMPLE CALENDAR PRO – THE SIMPLE OFFLINE CALENDAR WITH NO ADS! + + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Calendar Pro: + https://www.simplemobiletools.com/calendar + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-eu/styles.xml b/app/src/main/res/values-eu/styles.xml new file mode 100644 index 000000000..3f41654af --- /dev/null +++ b/app/src/main/res/values-eu/styles.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + From d41b2848584a4100e4f96d5f152e426d4be56610 Mon Sep 17 00:00:00 2001 From: Enara Larraitz Date: Thu, 30 Jul 2020 22:00:33 +0200 Subject: [PATCH 078/144] Updated Basque strings.xml --- app/src/main/res/values-eu/strings.xml | 116 ++++++++++++------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index a3b09051e..3f23f59ab 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -9,14 +9,14 @@ Urteko ikuspegia Gertaera-zerrenda sinplea Hurrengo gertaerarik ez. - Joan gauro egunera - Joan datara + Joan gaurko egunera + Joan data zehatz batera Kaixo,\n\nbadirudi doako aplikazio zaharra eguneratu duzula. Eskuz biltegiratutako gertaerak migratu behar dituzu .ics fitxategi batean esportatuz, eta gero inportatuz. Esportazio- eta inportazio-botoiak pantaila nagusiaren menuan aurki ditzakezu.\n\nOndoren, bertsio zaharra desinstalatu dezakezu aplikazioaren ezarpenen goiko aldean dagoen \'Eskuratu Pro bertsioa\' botoiarekin. Azkenik, aplikazioaren ezarpenak berrezarri besterik ez dituzu egin behar.\n\nEskerrik asko! - Egutegia hilabetea - Egutegia gertaera-zerrenda - Egutegia gaurko eguna + Egutegia (hilabetea) + Egutegia (gertaera-zerrenda) + Egutegia (gaurko eguna) Gertaera @@ -30,7 +30,7 @@ Gertaera ondo eguneratu da Iragazi gertaerak motaren arabera Bete kokalekua mapan erakusteko - An event is upcoming + Gertaera bat dator Errepikapena @@ -42,7 +42,7 @@ asteak hilabeteak urteak - Errepikapenen amaiera + Noiz arte errepikatu Betiko Gertaera errepikagarria da Hautaketak errepikatzen diren gertaerak ditu @@ -65,7 +65,7 @@ Errepikatu hilabeteko azken egunean Errepikatu urtero egun berean Errepikatze-maiztasuna - Maiztasuna + Maiztasuna: lehenengo bigarren hirugarren @@ -74,8 +74,8 @@ - Erepikatze-maiztasuna - Maiztasuna + Erepikatze-maiztasuna: + Maiztasuna: lehenengo bigarren hirugarren @@ -141,8 +141,8 @@ Gertaera arrunta Lehenetsitako gertaera mota ezin da ezabatu Hautatu gertaera mota - Move affected events into the default event type - Permanently remove affected events + Mugitu eragindako gertaerak lehenetsitako gertaera motara + Eragindako gertaerak betiko kendu CalDAV egutegia ezabatzeko desinkronizatu behar duzu @@ -155,7 +155,7 @@ Jaiegunak inportatzeak huts egin du - Manage event types + Kudeatu gertaera motak Eguna noiz hasi Eguna noiz bukatu Erakutsi asteen zenbakiak @@ -183,70 +183,70 @@ Lehenetsitako abisua 1 Lehenetsitako abisua 2 Lehenetsitako abisua 3 - View to open from the event list widget + Gertaera-zerrendaren widgetatik irekitzeko ikuspegia Erabilitako azken ikuspegia Gertaera berriak Lehenetsitako hasiera-ordua Hurrengo ordu osoa Lehenetsitako iraupena Erabilitako azkena - Other time - Highlight weekends on some views - Allow changing event time zones + Bestelako denbora + Nabarmendu asteburuak ikuspegi batzuetan + Baimendu gertaeren ordu-zonak aldatzea CalDAV - Select calendars to sync - Manage synced calendars - Store locally only - Refresh CalDAV calendars - Refreshing… - Refreshing complete - Editing calendar failed - Syncing… - Sync completed - Select a different color (might be applied locally only) - You are not allowed to write in the selected calendar - Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings. - No synchronizable calendars have been found + Hautatu sinkronizatu nahi dituzun egutegiak + Kudeatu sinkronizatutako egutegiak + Gorde lokalki soilik + Freskatu CalDAV egutegiak + Freskatzen… + Freskatu da + Egutegia editatzeak huts egin du + Sinkronizatzen… + sinkronizatu da + Hautatu kolore ezberdina (lokalki soilik aplikatu daiteke) + Ez duzu hautatutako egutegian idazteko baimenik + Gertaera ez da aurkitu. Gaitu egutegi aproposerako CalDAV sinkronizazioa aplikazioaren ezarpenetan. + Sinkronizatu daitekeen egutegirik ez da aurkitu - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday + astelehenean + asteartean + asteazkenean + ostegunean + ostiralean + larunbatean + igandean - Workout - Leg day - Meeting with John - In Rockstone garden - Library - Lunch with Mary - In the Plaza - Coffee time + Entrenamendua + Hankak + Bilera Itziarrekin + Katakraken + Liburutegia + Bazkaria Arkaitzekin + Garraxin + Kafea hartu - How can I remove the holidays imported via the \"Add holidays\" button? - Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types, - long press the given event type and delete it by selecting the trashbin. - Can I sync my events via Google Calendar, or other service supporting CalDAV? - Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers. - In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVx5. - I see the visual reminders, but hear no audio. What can I do? - Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings, - pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted. - Does the app support time zones? - Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, - you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + Nola kendu ditzaket \"Gehitu jaiegunak\" botoiarekin inportatutako jaiegunak? + Modu horretan sortutako jaiegunak \"Jaiegunak\" deituriko gertaera mota berrian sartzen dira. Joan Ezarpenak -> Kudeatu gertaera motak atalera, + sakatu luze gertaera mota hori eta ezabatu zakarrontzia hautatuz. + Gertaerak Google Calendar bidez sinkronizatu ditzaket, edo CalDAV onartzen duen bestelako zerbitzurik? + Bai, aldatu \"CalDAVekin sinkronizatu\" aplikazioaren ezarpenetan eta hautatu sinkronizatu nahi dituzun egutegiak. Hala ere, gailuaren eta zerbitzarien arteko sinkronizazioa maneiatzen duen hirugarrenen aplikazioren bat beharko duzu. + Googlen egutegiren bat sinkronizatu nahi izanez gero, beren egutegiaren aplikazio ofizialak egingo du lana. Bestelako egutegientzat sinkronizazio-moldagailua duen hirugarrenen aplikazio bat beharko duzu, DAVx5, esate baterako. + Abisu bisualak ikusten ditut, baina audiorik ez dut entzuten. Zer egin dezaket? + Abisua bistaratzeari eta audioa erreproduzitzeari sistemak eragiten dio. Soinurik ez baduzu entzuten, saiatu aplikazioaren ezarpenetara joaten, + \"Abisuek erabilitako audio-transmisioa\" aukera sakatu eta balio ezberdina jarri. Oraindik ez badabil, egiaztatu soinu-ezarpenak, transmisio jakina mututua ez badago. + Aplikazioak ordu-zonak onartzen ditu? + Bai, onartzen ditu. Gertaera guztiak zure ordu-zonaren arabera sortzen dira modu lehenetsian. Gertaera baten ordu-zona aldatu nahi baduzu, + lehenengo ordu-zonaren hautatzailea gaitu behar duzu aplikazioaren ezarpenetan eta, ondoren, Gartaeraren xehetasunen pantailan aldatu. Modu lehenetsian desgaituta dago, jende gehienak ez duelako behar. - Simple Calendar Pro - Events & Reminders + Simple Calendar Pro - Gertaerak & Abisuak Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day From 0afea3ac3901d06a9b19a445339cae7c2eee7fa1 Mon Sep 17 00:00:00 2001 From: Varsha-29 Date: Fri, 31 Jul 2020 08:02:41 +0530 Subject: [PATCH 079/144] Fixes #1170 Contact birthday not correct on changing timezone The birthday was captured in DB with current time zone. While retrieving the date was parsed based on the current time zone. Modified that logic to parse date based on the timezone at which it was originally captured --- .../com/simplemobiletools/calendar/pro/helpers/Formatter.kt | 2 ++ .../calendar/pro/helpers/MonthlyCalendarImpl.kt | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt index e24ffcf82..543cf9b96 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt @@ -85,6 +85,8 @@ object Formatter { fun getDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.getDefault()) + fun getDateTimeFromTSForATimeZone(ts: Long, timeZoneId: String) = DateTime(ts * 1000L, DateTimeZone.forID(timeZoneId)) + fun getUTCDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.UTC) // use manually translated month names, as DateFormat and Joda have issues with a lot of languages diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt index bb5f68c7f..0a358be61 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt @@ -84,8 +84,8 @@ class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) { private fun markDaysWithEvents(days: ArrayList) { val dayEvents = HashMap>() mEvents.forEach { - val startDateTime = Formatter.getDateTimeFromTS(it.startTS) - val endDateTime = Formatter.getDateTimeFromTS(it.endTS) + val startDateTime = Formatter.getDateTimeFromTSForATimeZone(it.startTS, it.timeZone) + val endDateTime = Formatter.getDateTimeFromTSForATimeZone(it.endTS, it.timeZone) val endCode = Formatter.getDayCodeFromDateTime(endDateTime) var currDay = startDateTime From 5af9a9a76d4c1df577e16e41f093a6e2d8ec7bd6 Mon Sep 17 00:00:00 2001 From: Enara Larraitz Date: Sat, 1 Aug 2020 08:06:42 +0200 Subject: [PATCH 080/144] left just strings.xml in values-eu --- app/src/main/res/values-eu/array.xml | 22 ------- app/src/main/res/values-eu/attrs.xml | 6 -- app/src/main/res/values-eu/colors.xml | 7 -- app/src/main/res/values-eu/dimens.xml | 34 ---------- app/src/main/res/values-eu/donottranslate.xml | 65 ------------------- app/src/main/res/values-eu/styles.xml | 32 --------- 6 files changed, 166 deletions(-) delete mode 100644 app/src/main/res/values-eu/array.xml delete mode 100644 app/src/main/res/values-eu/attrs.xml delete mode 100644 app/src/main/res/values-eu/colors.xml delete mode 100644 app/src/main/res/values-eu/dimens.xml delete mode 100644 app/src/main/res/values-eu/donottranslate.xml delete mode 100644 app/src/main/res/values-eu/styles.xml diff --git a/app/src/main/res/values-eu/array.xml b/app/src/main/res/values-eu/array.xml deleted file mode 100644 index d6f7b475b..000000000 --- a/app/src/main/res/values-eu/array.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - @string/no_reminder - @string/at_start - @string/custom - - - - @string/minutes_raw - @string/hours_raw - @string/days_raw - - - - @string/no_repetition - @string/daily - @string/weekly - @string/monthly - @string/yearly - - diff --git a/app/src/main/res/values-eu/attrs.xml b/app/src/main/res/values-eu/attrs.xml deleted file mode 100644 index 44af24af0..000000000 --- a/app/src/main/res/values-eu/attrs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/src/main/res/values-eu/colors.xml b/app/src/main/res/values-eu/colors.xml deleted file mode 100644 index d7dccb434..000000000 --- a/app/src/main/res/values-eu/colors.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - @color/md_red_400_dark - @color/md_blue_800 - @color/md_green_700 - @color/md_red_400_dark - diff --git a/app/src/main/res/values-eu/dimens.xml b/app/src/main/res/values-eu/dimens.xml deleted file mode 100644 index 221830c09..000000000 --- a/app/src/main/res/values-eu/dimens.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 10dp - 3dp - 6dp - - 40dp - - 60dp - 10dp - 10dp - 60dp - - 250dp - 250dp - - 40dp - - 0dp - 24dp - - 11sp - 14sp - 17sp - 22sp - - 8sp - - 4dp - 100dp - - 40dp - 16dp - diff --git a/app/src/main/res/values-eu/donottranslate.xml b/app/src/main/res/values-eu/donottranslate.xml deleted file mode 100644 index da0c3e0c0..000000000 --- a/app/src/main/res/values-eu/donottranslate.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - com.simplemobiletools.calendar.pro - - - Added time zone support (customization has to be enabled in the app settings) - Allow customizing the bottom navigation bar color - Added email reminders and attendees in CalDAV synced events - - Allow setting default start time/duration/event type for new events\n - Allow exporting/importing settings - - Allow setting default event reminders, not always reuse the last events\' ones - - Allow changing the app launcher icon color\n - Added support for more advanced yearly repetition rules\n - Allow setting reminder looping till dismissed\n - Added a button in Settings for changing widget colors without recreating them\n - Added optional dimming of past events - - Reworked custom notification sound picking, should be more reliable - - Added a Location field\n - Allow adding Contact birthdays - - Replaced Google Sync with CalDAV sync, please check Settings for enabling it - Added an initial implementation of Google sync, use with caution (will always be optional) - Added a setting for changing the widget font size - Allow editing specific instances of repeating events - Allow displaying some events from the past in the Simple Event List view - - Added an easy way to import Holidays in some countries\n - Allow filtering events to export by event type\n - Added Snooze - - Add more advanced monthly repetition options, like \"Last day of the month\" or \"Every second Tuesday\" - Add a new event repetition type \"Repeat x times\" - - Added more advanced weekly repetition by week days\n - Added sharing individual events by creating temporary .ics files - - - Replaced raw database exporting with proper .ics file exporting\n - Added color themes - - Allow deleting individual occurrences of repeatable events - Allow toggling 24-hour format in settings - - Added customizable event repeat intervals\n - Multiple improvements to importing events from .ics files - - Added event types with customizable colors - Allow setting up to 3 reminders per event - Added all-day long event support - Allow importing events from .ics files - Allow picking colors by hex codes - Added a weekly view - Event reminder types have been tweaked, please update them - - Added more color customization options\n - Your settings have been cleared, please reset them - Allow changing the reminder notification sound - Added a new view, a list of upcoming events - Added the option to vibrate at notifications - diff --git a/app/src/main/res/values-eu/styles.xml b/app/src/main/res/values-eu/styles.xml deleted file mode 100644 index 3f41654af..000000000 --- a/app/src/main/res/values-eu/styles.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - From 3ff61c7206a45faf4716e0de7561c58e298754f4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 18:07:45 +0200 Subject: [PATCH 081/144] updating commons, gradle and a missed changelog file --- app/build.gradle | 2 +- build.gradle | 2 +- fastlane/metadata/android/en-US/changelogs/180.txt | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/180.txt diff --git a/app/build.gradle b/app/build.gradle index 8ca4cd209..592bea61a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.29.7' + implementation 'com.simplemobiletools:commons:5.29.20' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta6' diff --git a/build.gradle b/build.gradle index f8d8b6768..f46f027b9 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" diff --git a/fastlane/metadata/android/en-US/changelogs/180.txt b/fastlane/metadata/android/en-US/changelogs/180.txt new file mode 100644 index 000000000..8b561cae2 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/180.txt @@ -0,0 +1,2 @@ + * Fixed some weekly view related glitches + * Added some stability and translation improvements From 7ceb9dc46340f4d18cac85523d58b919ebd72640 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 20:22:50 +0200 Subject: [PATCH 082/144] show the Save/Discard dialog properly at repeating events --- .../calendar/pro/activities/EventActivity.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index 43ab9c5f4..050228825 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -88,6 +88,8 @@ class EventActivity : SimpleActivity() { private var mSelectedContacts = ArrayList() private var mStoredEventTypes = ArrayList() private var mOriginalTimeZone = DateTimeZone.getDefault().id + private var mOriginalStartTS = 0L + private var mOriginalEndTS = 0L private lateinit var mEventStartDateTime: DateTime private lateinit var mEventEndDateTime: DateTime @@ -278,17 +280,22 @@ class EventActivity : SimpleActivity() { newEndTS = second } + val hasTimeChanged = if (mOriginalStartTS == 0L) { + mEvent.startTS != newStartTS || mEvent.endTS != newEndTS + } else { + mOriginalStartTS != newStartTS || mOriginalEndTS != newEndTS + } + val reminders = getReminders() if (event_title.value != mEvent.title || event_location.value != mEvent.location || event_description.value != mEvent.description || - newStartTS != mEvent.startTS || - newEndTS != mEvent.endTS || event_time_zone.text != mEvent.getTimeZoneString() || reminders != mEvent.getReminders() || mRepeatInterval != mEvent.repeatInterval || mRepeatRule != mEvent.repeatRule || - mEventTypeId != mEvent.eventType) { + mEventTypeId != mEvent.eventType || + hasTimeChanged) { return true } @@ -401,6 +408,9 @@ class EventActivity : SimpleActivity() { private fun setupEditEvent() { val realStart = if (mEventOccurrenceTS == 0L) mEvent.startTS else mEventOccurrenceTS val duration = mEvent.endTS - mEvent.startTS + mOriginalStartTS = realStart + mOriginalEndTS = realStart + duration + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) updateActionBarTitle(getString(R.string.edit_event)) mOriginalTimeZone = mEvent.timeZone From 0544bc9227739e34ff0e7298d6ff5c1f6d0f95c7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 20:35:28 +0200 Subject: [PATCH 083/144] fix #1182, open the daily view from the monthly widget, if clicked on day --- .../calendar/pro/helpers/MyWidgetMonthlyProvider.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetMonthlyProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetMonthlyProvider.kt index d1a5138ba..ebda2b729 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetMonthlyProvider.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetMonthlyProvider.kt @@ -60,6 +60,7 @@ class MyWidgetMonthlyProvider : AppWidgetProvider() { private fun setupDayOpenIntent(context: Context, views: RemoteViews, id: Int, dayCode: String) { (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply { putExtra(DAY_CODE, dayCode) + putExtra(VIEW_TO_OPEN, DAILY_VIEW) val pendingIntent = PendingIntent.getActivity(context, Integer.parseInt(dayCode), this, 0) views.setOnClickPendingIntent(id, pendingIntent) } From a12fd75a1eea673d88cf55790e42117a7d51694b Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 21:16:44 +0200 Subject: [PATCH 084/144] fix #1176, always measure top height at the weekly view --- .../simplemobiletools/calendar/pro/fragments/WeekFragment.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 880bd8299..3443ec758 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -482,10 +482,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } - if (!hadAllDayEvent) { - checkTopHolderHeight() - } - + checkTopHolderHeight() addCurrentTimeIndicator(minuteHeight) } From 67e8abb1f714b0d5185882dbb503cb7a136d2fd4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 21:28:38 +0200 Subject: [PATCH 085/144] fix #1175, go back to search results at pressing Back --- .../calendar/pro/activities/MainActivity.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index a1e5d2c3f..991223ecf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -146,7 +146,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { search_holder.background = ColorDrawable(config.backgroundColor) checkSwipeRefreshAvailability() checkShortcuts() - invalidateOptionsMenu() + + if (!mIsSearchOpen) { + invalidateOptionsMenu() + } } override fun onPause() { @@ -154,11 +157,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { storeStateVariables() } - override fun onStop() { - super.onStop() - closeSearch() - } - override fun onDestroy() { super.onDestroy() if (!isChangingConfigurations) { From e5e83a5a4d011b8c60f8f7de75d4350d7c53275a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 22:25:34 +0200 Subject: [PATCH 086/144] update version to 6.10.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 592bea61a..fc60d8548 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 180 - versionName "6.9.7" + versionCode 181 + versionName "6.10.0" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From f61335439f633f541fb0e786e4faf609a8c01a94 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 8 Aug 2020 22:25:42 +0200 Subject: [PATCH 087/144] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/181.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/181.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a2af96f9..f67ee99c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.10.0 *(2020-08-08)* +---------------------------- + + * Open the daily view at clicking on a day at the monthly widget + * Go back to the search results at opening an event and using Back + * Added some translation, stability and UX improvements + Version 6.9.7 *(2020-07-06)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/181.txt b/fastlane/metadata/android/en-US/changelogs/181.txt new file mode 100644 index 000000000..2f0d00c0d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/181.txt @@ -0,0 +1,3 @@ + * Open the daily view at clicking on a day at the monthly widget + * Go back to the search results at opening an event and using Back + * Added some translation, stability and UX improvements From c36cfeb8177906ea1e6bb8b94e1a3d529c4d4464 Mon Sep 17 00:00:00 2001 From: Enara Larraitz Date: Fri, 21 Aug 2020 20:20:05 +0200 Subject: [PATCH 088/144] Description translated --- app/src/main/res/values-eu/strings.xml | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 3f23f59ab..5ade51616 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -246,45 +246,45 @@ - Simple Calendar Pro - Gertaerak & Abisuak + Simple Calendar Pro - Gertaerak eta abisuak - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Egutegi sinplea. Agenda antolatzailea eta hitzorduetarako abisuak edozein egunetarako - Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads! + Simple Calendar Pro guztiz pertsonalizatu daitekeen lineaz kanpoko egutegia da, egutegi batek egin beharko lukeena egiteko diseinatua. Eginbide korapilatsurik, beharrezkoa ez den baimenik eta iragarkirik ez! - Whether you’re organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it easy to stay organized. With an incredible variety of customization options you can customize event reminders, notification sounds, calendar widgets and how the app looks. + Gertaerak, urtebetetzeak, urteurrenak, negozio-bilerak, hitzorduak edo dena delakoa antolatu behar baduzu ere, Simple Calendar Pro-rekin erraza da antolatzea. Eskaintzen dituen pertsonalizazio-aukera guztiekin gertaera-abisuak, jakinarazpen soinuak, egutegi-widgetak eta aplikazioaren estiloa pertsonalizatu dezakezu. - Daily, weekly and monthly views make checking your upcoming events & appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you know exactly what’s coming up in your life and when. + Eguneko, asteko eta hilabeteko ikuspegiek erraz egiten dute hurrengo gertaerak eta hitzorduak begiratzea. Gertaeren zerrenda sinplean ere bistaratu dezakezu guztia, egutegi-ikuspegian bistaratu ordez, zure bizitzan zer eta noiz gertatuko den jakin dezazun. ---------------------------------------------------------- - Simple Calendar Pro – Features & Benefits + Simple Calendar Pro – Eginbideak eta abantailak ---------------------------------------------------------- - ✔️ No ads or annoying popups - ✔️ No internet access needed, giving you more privacy & security - ✔️ Only the bare minimum permissions required - ✔️ Emphasis on simplicity – does what a calendar needs to do! - ✔️ Open source - ✔️ Fully customizable themes & calendar / event widgets - ✔️ Translated into 29 languages - ✔️ Export settings to .txt files to import to another device - ✔️ CalDAV calendar sync supported to sync events across devices - ✔️ Daily, weekly, monthly, yearly & event views on the calendar - ✔️ Supports exporting & importing events via .ics files - ✔️ Set multiple event reminders, customize event reminder sound and vibration - ✔️ Snooze option for reminders - ✔️ Easily add holidays, birthdays, anniversaries & appointments - ✔️ Customize events – start time, duration, reminders etc - ✔️ Add event attendees to each event - ✔️ Use as a personal calendar or a business calendar - ✔️ Choose between reminders & email notifications to alert you about an event + ✔️ Iragarkirik edo laster-leiho nekagarririk ez + ✔️ Internet sarbiderik ez da behar, pribatutasun eta segurtasun handiagoa emanez + ✔️ Gutxieneko baimenak soilik eskatzen ditu + ✔️ Enfasia sinplizitatean: egutegi batek egin behar duena egiten du! + ✔️ Kode irekia + ✔️ Guztiz pertsonalizatu daitezkeen gaiak eta egutegi- edota gertaera-widgetak + ✔️ 29 hizkuntzatara itzulita + ✔️ Esportatu ezarpenak .txt fitxategietara beste gailu batean inportatzeko + ✔️ CalDAV egutegi-sinkronizazioa onartzen du, gertaerak gailu artean sinkronizatzeko + ✔️ Eguneko, asteko, hilabeteko, urteko eta gertaera-ikuspegiak egutegian + ✔️ Gertaerak .ics fitxategien bidez esportatzea eta inportatzea onartzen du + ✔️ Ezarri hainbat gertaera-abisu, pertsonalizatu gertaera-abisuaren soinua eta dardara + ✔️ Atzeratzeko aukera abisuetan + ✔️ Gehitu oporrak, urtebetetzeak, urteurrenak eta hitzortuak errazki + ✔️ Pertsonalizatu gertaerak: hasiera-ordua, iraupena, abisuak eta abar + ✔️ Gehitu parte-hartzaileak gertaera bakoitzean + ✔️ Egutegi pertsonala edo lanerako egutegi gisa erabili dezakezu + ✔️ Hautatu abisu eta eposta jakinarazpenen artean gertaera baten berri izateko - DOWNLOAD SIMPLE CALENDAR PRO – THE SIMPLE OFFLINE CALENDAR WITH NO ADS! + DESKARGATU SIMPLE CALENDAR PRO – LINEAZ KANPO ERABILI DAITEKEEN IRAGARKIRIK GABEKO EGUTEGI SINPLEA! - Check out the full suite of Simple Tools here: + Ikusi Simple Tools-en sorta osoa hemen: https://www.simplemobiletools.com - Standalone website of Simple Calendar Pro: + Simple Calendar Pro-ren webgune autonomoa: https://www.simplemobiletools.com/calendar Facebook: From 995128989b241fc52ba61100380c63120e0239cb Mon Sep 17 00:00:00 2001 From: Enara Larraitz Date: Fri, 21 Aug 2020 21:38:51 +0200 Subject: [PATCH 089/144] Short description updated --- app/src/main/res/values-eu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5ade51616..bc8c9933f 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -248,7 +248,7 @@ Simple Calendar Pro - Gertaerak eta abisuak - Egutegi sinplea. Agenda antolatzailea eta hitzorduetarako abisuak edozein egunetarako + Egutegi sinplea. Edozein egunetarako agenda antolatzailea eta hitzordu-abisuak Simple Calendar Pro guztiz pertsonalizatu daitekeen lineaz kanpoko egutegia da, egutegi batek egin beharko lukeena egiteko diseinatua. Eginbide korapilatsurik, beharrezkoa ez den baimenik eta iragarkirik ez! From 7eaa9f35ea6a397c8d7a4d9031cb260feba5ec72 Mon Sep 17 00:00:00 2001 From: mfap-aravinth <55803552+mfap-aravinth@users.noreply.github.com> Date: Sun, 23 Aug 2020 17:48:53 +0530 Subject: [PATCH 090/144] Added a new event & updated the summary for an existing one --- app/src/main/assets/india.ics | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/india.ics b/app/src/main/assets/india.ics index 806cbe8d0..1726323e9 100755 --- a/app/src/main/assets/india.ics +++ b/app/src/main/assets/india.ics @@ -156,7 +156,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Puthandu +SUMMARY:Tamil Puthandu/Ugadi/Vishu UID:2002-04-14-1 DTSTART;VALUE=DATE:20160414 DTEND;VALUE=DATE:20160415 @@ -197,6 +197,14 @@ RRULE:FREQ=YEARLY;INTERVAL=1 EXDATE:20180420} END:VEVENT BEGIN:VEVENT +SUMMARY:May Day/Labour Day +UID:1889-05-01-1 +DTSTART;VALUE=DATE:20160501 +DTEND;VALUE=DATE:20160502 +STATUS:CONFIRMED +RRULE:FREQ=YEARLY;INTERVAL=1 +END:VEVENT +BEGIN:VEVENT SUMMARY:Idu'l Fitr UID:2002-12-06-1 DTSTART;VALUE=DATE:20160507 From 31e9f5b48c568b3d3de4a0051ab31c49f1075815 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 11:35:48 +0200 Subject: [PATCH 091/144] updating some libraries --- app/build.gradle | 5 +++-- build.gradle | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fc60d8548..386b063fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,10 +64,11 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.29.20' + implementation 'com.simplemobiletools:commons:5.30.11' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta6' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' kapt 'androidx.room:room-compiler:2.2.5' implementation 'androidx.room:room-runtime:2.2.5' diff --git a/build.gradle b/build.gradle index f46f027b9..be05af570 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.72' + ext.kotlin_version = '1.4.10' repositories { google() From 128f6e52fd0dc3a2d3af57b5ac50dc5434150ebe Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 11:47:57 +0200 Subject: [PATCH 092/144] adding some RTL layout improvements --- app/build.gradle | 2 +- app/src/main/res/layout/activity_event.xml | 97 +++++++++++----------- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 386b063fc..1454a71d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.30.11' + implementation 'com.simplemobiletools:commons:5.30.12' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' diff --git a/app/src/main/res/layout/activity_event.xml b/app/src/main/res/layout/activity_event.xml index 7d34c0e94..f254dbeee 100644 --- a/app/src/main/res/layout/activity_event.xml +++ b/app/src/main/res/layout/activity_event.xml @@ -1,6 +1,5 @@ - + android:textSize="@dimen/day_text_size" /> + android:textSize="@dimen/day_text_size" /> + android:src="@drawable/ic_place_vector" /> + android:textSize="@dimen/day_text_size" /> + android:importantForAccessibility="no" /> + android:src="@drawable/ic_clock_vector" /> + app:switchPadding="@dimen/small_margin" /> + tools:text="January 1 1970" /> + tools:text="00:00" /> + tools:text="January 1 1970" /> + tools:text="00:00" /> + android:src="@drawable/ic_globe_vector" /> + tools:text="Europe/Bratislava" /> + android:importantForAccessibility="no" /> + android:src="@drawable/ic_bell_vector" /> + tools:text="@string/add_another_reminder" /> + android:src="@drawable/ic_bell_vector" /> + tools:text="@string/add_another_reminder" /> + android:src="@drawable/ic_bell_vector" /> + tools:text="@string/add_another_reminder" /> + android:src="@drawable/ic_bell_vector" /> + android:importantForAccessibility="no" /> + android:src="@drawable/ic_repeat_vector" /> + tools:text="@string/no_repetition" /> + android:textSize="@dimen/day_text_size" /> + android:textSize="@dimen/day_text_size" /> + android:textSize="@dimen/day_text_size" /> + android:textSize="@dimen/day_text_size" /> + android:importantForAccessibility="no" /> + android:src="@drawable/ic_people_vector" /> + android:orientation="vertical" /> + android:importantForAccessibility="no" /> + android:visibility="gone" /> + tools:text="My calendar" /> + tools:text="hello@simplemobiletools.com" /> + android:clickable="false" /> @@ -496,7 +499,7 @@ android:layout_below="@+id/event_caldav_calendar_holder" android:background="@color/divider_grey" android:importantForAccessibility="no" - android:visibility="gone"/> + android:visibility="gone" /> + android:src="@drawable/ic_color_vector" /> + android:textSize="@dimen/day_text_size" /> + android:clickable="false" /> @@ -547,6 +550,6 @@ android:layout_height="1px" android:layout_below="@+id/event_type_holder" android:background="@color/divider_grey" - android:importantForAccessibility="no"/> + android:importantForAccessibility="no" /> From fcdaa00e62997af73178add0bf8bae598dbe7b55 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 15:06:44 +0200 Subject: [PATCH 093/144] update version to 6.10.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1454a71d6..21ad0a92e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 181 - versionName "6.10.0" + versionCode 182 + versionName "6.10.1" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From afd4fcff1edbc162ed7443fd001afe6e18f4d613 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 15:06:52 +0200 Subject: [PATCH 094/144] updating changelog --- CHANGELOG.md | 5 +++++ fastlane/metadata/android/en-US/changelogs/182.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/182.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index f67ee99c2..48d5b8583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 6.10.1 *(2020-09-19)* +---------------------------- + + * Adding some translation and UX improvements + Version 6.10.0 *(2020-08-08)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/182.txt b/fastlane/metadata/android/en-US/changelogs/182.txt new file mode 100644 index 000000000..e5fc25e04 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/182.txt @@ -0,0 +1 @@ + * Adding some translation and UX improvements From 267e2e2e2b60ef83ac69a2604728a26befe0b7f0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 16:48:53 +0200 Subject: [PATCH 095/144] reverting the birthdays related fix --- .../com/simplemobiletools/calendar/pro/helpers/Formatter.kt | 2 -- .../calendar/pro/helpers/MonthlyCalendarImpl.kt | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt index 543cf9b96..e24ffcf82 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt @@ -85,8 +85,6 @@ object Formatter { fun getDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.getDefault()) - fun getDateTimeFromTSForATimeZone(ts: Long, timeZoneId: String) = DateTime(ts * 1000L, DateTimeZone.forID(timeZoneId)) - fun getUTCDateTimeFromTS(ts: Long) = DateTime(ts * 1000L, DateTimeZone.UTC) // use manually translated month names, as DateFormat and Joda have issues with a lot of languages diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt index 0a358be61..bb5f68c7f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MonthlyCalendarImpl.kt @@ -84,8 +84,8 @@ class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) { private fun markDaysWithEvents(days: ArrayList) { val dayEvents = HashMap>() mEvents.forEach { - val startDateTime = Formatter.getDateTimeFromTSForATimeZone(it.startTS, it.timeZone) - val endDateTime = Formatter.getDateTimeFromTSForATimeZone(it.endTS, it.timeZone) + val startDateTime = Formatter.getDateTimeFromTS(it.startTS) + val endDateTime = Formatter.getDateTimeFromTS(it.endTS) val endCode = Formatter.getDayCodeFromDateTime(endDateTime) var currDay = startDateTime From bfff2255b4f03bb146fb58f40c482eb150faa336 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 16:55:29 +0200 Subject: [PATCH 096/144] update version to 6.10.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 21ad0a92e..5b77d2cdf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 182 - versionName "6.10.1" + versionCode 183 + versionName "6.10.2" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 3181ff7f07afa7492b13138018020ecf33b83a50 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 19 Sep 2020 16:55:37 +0200 Subject: [PATCH 097/144] updating changelog --- CHANGELOG.md | 5 +++++ fastlane/metadata/android/en-US/changelogs/183.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/183.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 48d5b8583..e9250841f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 6.10.2 *(2020-09-19)* +---------------------------- + + * Adding a crashfix + Version 6.10.1 *(2020-09-19)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/183.txt b/fastlane/metadata/android/en-US/changelogs/183.txt new file mode 100644 index 000000000..e5fc25e04 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/183.txt @@ -0,0 +1 @@ + * Adding some translation and UX improvements From 3360edea1a2f178bc7738851991ebe335663dbc4 Mon Sep 17 00:00:00 2001 From: Luis Alfredo Figueroa Bracamontes Date: Sun, 20 Sep 2020 08:49:58 -0500 Subject: [PATCH 098/144] =?UTF-8?q?Update=20strings.xml=20Espa=C3=B1ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some corrections in the spelling and the way the words join --- app/src/main/res/values-es/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f9c1a22e6..bd49157f7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -10,7 +10,7 @@ Lista de eventos sencilla Parece que no tienes ningún evento próximo. Ir al día de hoy - Ir a la fecha + Ir a la fecha… Hola,\n\nparece que te actualizaste a partir de la antigua aplicación gratuita. Debes migrar los eventos almacenados localmente de manera manual, exportando un fichero .ics y a continuación importándolo. Puedes encontrar las opciones de importar/exportar en el menú de la pantalla principal.\n\nDespués ya podrás desinstalar la versión antigua de la app. Finalmente solo tendrás que reestablecer la configuración de la aplicación.\n\n¡Gracias! @@ -56,7 +56,7 @@ Repetir por siempre veces Repetir - Repertir los + Repertir en Cada día En los días seleccionados El mismo día @@ -76,9 +76,9 @@ Repetir cada Cada - primero + primer segundo - tercero + tercer cuarto último @@ -174,7 +174,7 @@ Repetir recordatorios hasta ser descartados Sombrear eventos pasados Eventos - Sonido usado en recordatorios + Tipo de sonido usado en recordatorios Sistema Alarma Notificación @@ -212,13 +212,13 @@ - Lunes - Martes - Miércoles - Jueves - Viernes - Sábado - Domingo + lunes + martes + miércoles + jueves + viernes + sábado + domingo Ejercicio From 3ac3370326bb9378b4036ae0d7ab8c8507192608 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 20 Sep 2020 18:13:23 +0200 Subject: [PATCH 099/144] Update strings.xml --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bd49157f7..ba7f2e777 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -10,7 +10,7 @@ Lista de eventos sencilla Parece que no tienes ningún evento próximo. Ir al día de hoy - Ir a la fecha… + Ir a la fecha Hola,\n\nparece que te actualizaste a partir de la antigua aplicación gratuita. Debes migrar los eventos almacenados localmente de manera manual, exportando un fichero .ics y a continuación importándolo. Puedes encontrar las opciones de importar/exportar en el menú de la pantalla principal.\n\nDespués ya podrás desinstalar la versión antigua de la app. Finalmente solo tendrás que reestablecer la configuración de la aplicación.\n\n¡Gracias! From 439988a4043a1752276b1dc8439497585596603c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Thu, 24 Sep 2020 22:16:19 +0100 Subject: [PATCH 100/144] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 00c99a1f1..90c93fa3b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -125,7 +125,7 @@ Substituir tipo de eventos no ficheiro - Location + Localização Descrição Todo o dia From 60bdf3140cd893c080140f02bcf19f00a157b2e2 Mon Sep 17 00:00:00 2001 From: Michele Stefanelli Date: Fri, 25 Sep 2020 20:51:44 +0100 Subject: [PATCH 101/144] Added missing italian translations for the app --- app/src/main/res/values-it/strings.xml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 20cbe73e9..a8d205cda 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -86,14 +86,14 @@ Compleanni Aggiungi compleanni dai contatti Nessun compleanno trovato - No new birthdays have been found + Nessun nuovo compleanno trovato Compleanni aggiunti con successo Anniversari Aggiungi anniversari dai contatti Nessun anniversario trovato - No new anniversaries have been found + Nessun nuovo anniversario trovato Anniversari aggiunti con successo @@ -111,7 +111,7 @@ Invitato - Enter a country or time zone + Inserisci un paese o un fuso orario Importa eventi @@ -191,8 +191,8 @@ Durata predefinita L\'ultimo utilizzato Altro periodo - Highlight weekends on some views - Allow changing event time zones + Evidenzia il fine-settimana in alcune viste + Abilita il cambio del fuso orario negli eventi CalDAV @@ -207,9 +207,9 @@ Sincronizzazione completata Seleziona un colore differente (potrebbe essere applicato solamente in locale) Non si hanno i permessi per scrivere nel calendario selezionato - Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings. - No synchronizable calendars have been found - + Evento non trovato. Abilita la sincronizzazione CalDAV per il relativo calendario nelle impostazioni dell\'app. + Non é stato trovato nessun calendario sincronizzabile + Lunedì @@ -240,9 +240,8 @@ Visualizzo i promemoria, ma non sento l\'audio. Cosa posso fare? Non solo visualizzare l\'attuale promemoria, ma anche riprodurre l\'audio è un lavoro prettamente del sistema. Se non si sente alcun suono, provare ad andare nelle impostazioni dell\'applicazione, premere l\'opzione \"Canale audio utilizzato per il promemoria\" e cambia il canale. Se ancora non funziona, controllare le impostazioni dell\'audio, in particolare se il canale è stato mutato. - Does the app support time zones? - Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone, - you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it. + L\'app supporta diversi fusi orari? + Si. Solitamente tutti gli eventi vengono create nel tuo fuso orario. Se vuoi cambiare il fuso orario di un specifico evento, devi abilitare la funzionalitá nelle impostazioni dell\'app, successivamente potrai cambiare il fuso nella schermata di dettaglio dell\'evento. La funzionalitá é disabilitata inizialmente siccome la maggior parte degli utenti non ne hanno bisogno. From 3a720a2eae1ca0c9eb7e01013d196418aaa3fc6d Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 13:54:55 +0200 Subject: [PATCH 102/144] update commons to 5.30.24 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5b77d2cdf..f5f64314e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.30.12' + implementation 'com.simplemobiletools:commons:5.30.24' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' From e8ed75d82b3070f32ba550d5fe84bdef42da3319 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 15:36:57 +0200 Subject: [PATCH 103/144] fix #1205, change the day when appropriate at default event start time --- .../calendar/pro/extensions/Context.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt index 2b49865db..cd0d20413 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt @@ -344,15 +344,17 @@ fun Context.getNewEventTimestampFromCode(dayCode: String): Long { var dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(currHour) var newDateTime = dateTime.plusHours(1).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0) - if (defaultStartTime != -1) { + return if (defaultStartTime == -1) { + newDateTime.seconds() + } else { val hours = defaultStartTime / 60 val minutes = defaultStartTime % 60 dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(hours).withMinuteOfHour(minutes) newDateTime = dateTime - } - // make sure the date doesn't change - return newDateTime.withDate(dateTime.year, dateTime.monthOfYear, dateTime.dayOfMonth).seconds() + // make sure the date doesn't change + newDateTime.withDate(dateTime.year, dateTime.monthOfYear, dateTime.dayOfMonth).seconds() + } } fun Context.getSyncedCalDAVCalendars() = calDAVHelper.getCalDAVCalendars(config.caldavSyncedCalendarIds, false) From f5a602863fe0b93f274cca7ec349d49ff1aa875c Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 15:47:42 +0200 Subject: [PATCH 104/144] show a different message at failing to import events --- .../calendar/pro/dialogs/ImportEventsDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ImportEventsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ImportEventsDialog.kt index ce8811dc9..12fa27f61 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ImportEventsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ImportEventsDialog.kt @@ -96,7 +96,7 @@ class ImportEventsDialog(val activity: SimpleActivity, val path: String, val cal IMPORT_NOTHING_NEW -> R.string.no_new_items IMPORT_OK -> R.string.importing_successful IMPORT_PARTIAL -> R.string.importing_some_entries_failed - else -> R.string.importing_failed + else -> R.string.no_items_found }) callback(result != IMPORT_FAIL) } From 35d60d802759dc02ade310851077198fcf8bc779 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 15:53:52 +0200 Subject: [PATCH 105/144] allow exiting the Event screen with unsaved changes by spamming Back --- .../calendar/pro/activities/EventActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index 050228825..12a71fe2d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -79,6 +79,7 @@ class EventActivity : SimpleActivity() { private var mEventTypeId = REGULAR_EVENT_TYPE_ID private var mDialogTheme = 0 private var mEventOccurrenceTS = 0L + private var mLastSavePromptTS = 0L private var mEventCalendarId = STORED_LOCALLY_ONLY private var mWasActivityInitialized = false private var mWasContactsPermissionChecked = false @@ -303,7 +304,8 @@ class EventActivity : SimpleActivity() { } override fun onBackPressed() { - if (isEventChanged()) { + if (isEventChanged() && System.currentTimeMillis() - mLastSavePromptTS > SAVE_DISCARD_PROMPT_INTERVAL) { + mLastSavePromptTS = System.currentTimeMillis() ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) { if (it) { saveCurrentEvent() From 3458ed34533f9c58b4498d05b542da26ab308023 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 16:07:54 +0200 Subject: [PATCH 106/144] fix some glitches with importing event description and location newlines --- .../simplemobiletools/calendar/pro/helpers/IcsImporter.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt index d2fe2bdde..c7cea97a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsImporter.kt @@ -104,6 +104,9 @@ class IcsImporter(val activity: SimpleActivity) { curTitle = getTitle(curTitle).replace("\\n", "\n").replace("\\,", ",") } else if (line.startsWith(DESCRIPTION) && !isNotificationDescription) { curDescription = line.substring(DESCRIPTION.length).replace("\\n", "\n").replace("\\,", ",") + if (curDescription.trim().isEmpty()) { + curDescription = "" + } isDescription = true } else if (line.startsWith(UID)) { curImportId = line.substring(UID.length).trim() @@ -141,6 +144,9 @@ class IcsImporter(val activity: SimpleActivity) { curRepeatExceptions.add(Formatter.getDayCodeFromTS(getTimestamp(value))) } else if (line.startsWith(LOCATION)) { curLocation = getLocation(line.substring(LOCATION.length).replace("\\,", ",")) + if (curLocation.trim().isEmpty()) { + curLocation = "" + } } else if (line.startsWith(RECURRENCE_ID)) { val timestamp = getTimestamp(line.substring(RECURRENCE_ID.length)) curRecurrenceDayCode = Formatter.getDayCodeFromTS(timestamp) From 158e9bcd713f68f6b557acf20f2e9c16aa9aba13 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 16:49:16 +0200 Subject: [PATCH 107/144] update version to 6.10.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f5f64314e..72e4454e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 183 - versionName "6.10.2" + versionCode 184 + versionName "6.10.3" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 68d83854df43e94e1ea7f82cb8b231bec3d0ca9f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 28 Sep 2020 16:49:23 +0200 Subject: [PATCH 108/144] updating changelog --- CHANGELOG.md | 6 ++++++ fastlane/metadata/android/en-US/changelogs/184.txt | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/184.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index e9250841f..4228b50e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 6.10.3 *(2020-09-28)* +---------------------------- + + * Fixed some glitches at importing events from .ics files + * Added a few UX improvements here and there + Version 6.10.2 *(2020-09-19)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/184.txt b/fastlane/metadata/android/en-US/changelogs/184.txt new file mode 100644 index 000000000..0f13f3978 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/184.txt @@ -0,0 +1,2 @@ + * Fixed some glitches at importing events from .ics files + * Added a few UX improvements here and there From dc7da4f681ffa4e00032fca596234590ba9ef616 Mon Sep 17 00:00:00 2001 From: davidre345 <69015841+davidre345@users.noreply.github.com> Date: Fri, 2 Oct 2020 18:45:18 +0200 Subject: [PATCH 109/144] Update galician strings --- app/src/main/res/values-gl/strings.xml | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 96e8479ed..5ba1ce4cc 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -11,7 +11,7 @@ Semella que non tes ningún evento próximo. Ir ao día de hoxe Ir a unha data - Hey,\n\nsemella que actualizaches desde a antiga versión gratuíta. Tes que migrar os eventos gardados localmente exportándoos manualmente a un ficheiro .ics e despois importandoos. Podes atopar o botón exportar/importar no menú da pantalla principal.\n\nApós podes desinstalar a versión antiga, que ten o botón \'Mellorar a Pro\' arriba nos axustes da app. Finalmente só terás que restablecer os axustes da app.\n\nGrazas! + Ola,\n\nsemella que actualizaches desde a antiga versión gratuíta. Tes que migrar os eventos gardados localmente exportándoos manualmente a un ficheiro .ics e despois importándoos. Podes atopar o botón exportar/importar no menú da pantalla principal.\n\nDespois, podes desinstalar a versión antiga, que ten o botón \'Mellorar a Pro\' arriba nos axustes do app. Finalmente só terás que restablecer os axustes do app.\n\nGrazas! Calendario mensual @@ -84,7 +84,7 @@ Aniversario - Engadir aniversario de contactos + Engadir aniversario dos contactos Non se atoparon aniversarios Non se atoparon novos aniversarios Engadíronse correctamente os aniversarios @@ -111,7 +111,7 @@ Convidado - Escribir zona horaria do país + Inserir franxa horaria Importar eventos @@ -141,7 +141,7 @@ Evento regular Non se pode eliminar o tipo de evento predeterminado Selecciona un tipo de evento - Mover os eventos afectados ao tipo de evento por omisión + Mover os eventos afectados ao tipo de evento por defecto Eliminar permanentemente os eventos afectados Para eliminar un calendario CalDAV antes debes deixar de sincronizalo @@ -151,7 +151,7 @@ Festivo nacional Festas relixiosas Os festivos importáronse correctamente no tipo de evento \"Festivo\" - Fallou a importación de algúns eventos + Fallou a importación dalgúns eventos Fallou a importación de días festivos @@ -161,14 +161,14 @@ Mostrar os números da semana Vibrar coa notificación de recordatorio Son de recordatorio - Non se atopou ningunha aplicación capaz de establecer o ton de aviso + Non se atopou ningún aplicativo capaz de establecer o ton de aviso Ningún O día non pode rematar antes de que comece CalDAV sincr. Listaxes de eventos Mostrar eventos do pasado Substituír a descrición coa localización - Borrar tódolos eventos + Borrar todos os eventos Tes a certeza de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes. Mostrar unha cuadrícula Repetir recordatorios ata que se descarten @@ -207,8 +207,8 @@ Sincronización completa Escolle unha cor diferente (pode que só se aplique localmente) Non tes permiso para escribir no calendario seleccionado - Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes da aplicación. - Non se atoparon calendarios sincronizables + Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes do aplicativo. + Non se atoparon calendarios sincronizados @@ -233,15 +233,15 @@ Como podo eliminar os días festivos engadidos vía o botón \"Engadir días festivos\"? Os días festivos creados dese xeito insértanse nun tipo de evento chamado \"Festivo\". Podes ir a Axustes -> Xestionar tipo de eventos, - manter preso o tipo de evento desexado e eliminalo escollendo o caldeiro do lixo. + manter preso o tipo de evento desexado e eliminalo escollendo a Papeleira do lixo. Podo sincronizar os meus eventos vía Google Calendar, ou outro servizo que use CalDAV? Si, activa \"CalDAV sincr.\" nos axustes da app e escolle os calendarios que queres sincronizar. Porén, precisas unha app de terceiros para xestionar a sincronización entre dispositivos e servidores. - Se desexas sincronizar un calendario de Google, a súa app oficial Calendar fará o traballo. Para outros calendario precisas unha app de sincronización, como DAVx5. + Se desexas sincronizar un calendario de Google, o seu app oficial Calendar fará o traballo. Para outros calendario precisas un app de sincronización, como DAVx5. Vexo os recordatorios visualmente, pero non escoito audio. Que podo facer? - Non só mostrar o recordatorio propiamente dito, se non que a reprodución do son depende en gran medida do sistema tamén. Se non podes escoitar ningún son, intenta ir aos axustes da app e premer en \"Canle de audio usado polos recordatorios\" e cambialo a un valor diferente. Se aínda así non funciona, comproba os axustes de son, que o fluxo en particular non esté acalado. - A app soporta zonas horarias? - Si. Por omisión todos os eventos créanse na túa zona horaria actual. Se desexas cambiar a zona horaria dos eventos, - primeiro tes que activar o selector de zona horaria nos axustes da app, e despois cambialo na pantalla de Detalles do Evento. Está desactivado de inicio porque a maioría da xente non o necesita. + Non só mostrar o recordatorio propiamente dito, se non que a reprodución do son depende en gran medida do sistema tamén. Se non podes escoitar ningún son, intenta ir aos axustes do app e premer en \"Canle de audio usado polos recordatorios\" e cambialo a un valor diferente. Se aínda así non funciona, comproba os axustes de son, que o fluxo en particular non estea acalado. + O app soporta zonas horarias? + Si. Por defecto todos os eventos créanse na túa zona horaria actual. Se desexas cambiar a zona horaria dos eventos, + primeiro tes que activar o selector de zona horaria nos axustes do app, e despois cambialo na pantalla de Detalles do Evento. Está desactivado de inicio porque a maioría da xente non o necesita. @@ -249,9 +249,9 @@ Calendadario simple, con eventos, widget personalizable e sen publicidade. - Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e se publicidade! + Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. Sen funcións complicadas, permisos innecesarios e sen publicidade! - Tanto se organizas eventos puntuais ou recurrentes, aniversarios, cabodanos, xuntanzas de negocios, citas ou calquera outro evento, Simple Calendar Pro poncho doado para estar organizado. Cunha abraiante multitude de opcións de personalización podes personalizar os recordatorios de eventos, sons de notificación, widgets de calendario e o aspecto da app. + Tanto se organizas eventos puntuais ou recurrentes, aniversarios, cabodanos, xuntanzas de negocios, citas ou calquera outro evento, Simple Calendar Pro poncho doado para estar organizado. Cunha abraiante multitude de opcións de personalización podes personalizar os recordatorios de eventos, sons de notificación, widgets de calendario e o aspecto do app. A vista Diaria, Semanal e Mensual facilítanche comprobar as próximas citas & eventos. Podes incluso visualizalos como unha simple listaxe de eventos en lugar de nunha vista de calendario, así sabes exactamente o que está por vir e cando. @@ -266,7 +266,7 @@ ✔️ Código aberto ✔️ Aspecto personalizable & widget de calendario / eventos ✔️ Traducido a 29 idiomas - ✔️ Exporta os axustes a un ficheiro .txt e importao noutro dispositivo + ✔️ Exporta os axustes a un ficheiro .txt e impórtao noutro dispositivo ✔️ Sincronización CalDAV de calendario entre varios dispositivos ✔️ Vista de eventos no calendario Diario, Semanal, Mensual ou Anual ✔️ Soporta a exportación & importación de eventos via ficheiros .ics From b9666a58fa66aa3c36b26b7423a63eb99dede857 Mon Sep 17 00:00:00 2001 From: maverick74 Date: Mon, 12 Oct 2020 10:15:57 +0100 Subject: [PATCH 110/144] updating portuguese strings updating portuguese strings --- app/src/main/assets/portugal.ics | 122 +++++++++++++++---------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/app/src/main/assets/portugal.ics b/app/src/main/assets/portugal.ics index 5a14f06af..c739fd33b 100755 --- a/app/src/main/assets/portugal.ics +++ b/app/src/main/assets/portugal.ics @@ -1,363 +1,363 @@ BEGIN:VCALENDAR BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:8ea296fc-d77c-4daa-bb35-7ef0f31bbd35 DTSTART;VALUE=DATE:20170615 DTEND;VALUE=DATE:20170616 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:efec0135-5fb2-4fc3-b7df-9ee7253150b6 DTSTART;VALUE=DATE:20180213 DTEND;VALUE=DATE:20180214 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:5ac77215-3c32-4ea6-94d8-c17e39d123cb DTSTART;VALUE=DATE:20180330 DTEND;VALUE=DATE:20180331 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:4ef32d8f-eb43-4225-a035-4cc727056a5e DTSTART;VALUE=DATE:20180401 DTEND;VALUE=DATE:20180402 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:b6eb9c00-5d32-46ad-af25-1e4ceb7e24d4 DTSTART;VALUE=DATE:20180531 DTEND;VALUE=DATE:20180601 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:ebd07183-101a-4e8a-b630-084010395c75 DTSTART;VALUE=DATE:20190305 DTEND;VALUE=DATE:20190306 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:9319a404-2caa-4860-ab8e-7250c4b26c70 DTSTART;VALUE=DATE:20190419 DTEND;VALUE=DATE:20190420 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:c8abc003-8656-4c03-b463-281757c9d6c7 DTSTART;VALUE=DATE:20190421 DTEND;VALUE=DATE:20190422 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:5adec9d3-8289-4590-a7d7-15d3beb199e7 DTSTART;VALUE=DATE:20190620 DTEND;VALUE=DATE:20190621 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:9134149e-787b-4841-802e-6a1b68914bff DTSTART;VALUE=DATE:20200225 DTEND;VALUE=DATE:20200226 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:07d98915-7fa6-4591-9257-311a35109bf9 DTSTART;VALUE=DATE:20200410 DTEND;VALUE=DATE:20200411 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:4bf48b56-7499-4d00-9ee7-6047a2ca8e36 DTSTART;VALUE=DATE:20200412 DTEND;VALUE=DATE:20200413 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:f8e5c7e1-8355-4681-ade1-d403e0b6ca23 DTSTART;VALUE=DATE:20200611 DTEND;VALUE=DATE:20200612 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:c1bcf217-b07e-471b-bf98-a8eaa253b4fb DTSTART;VALUE=DATE:20210216 DTEND;VALUE=DATE:20210217 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:baa729bb-7145-4cbc-bbd7-00e752ee5b5f DTSTART;VALUE=DATE:20210402 DTEND;VALUE=DATE:20210403 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:0ef18ed2-0318-4619-a08f-9bace518ea6b DTSTART;VALUE=DATE:20210404 DTEND;VALUE=DATE:20210405 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:b71bfbee-dba7-4c79-bf07-a2fc4643885e DTSTART;VALUE=DATE:20210603 DTEND;VALUE=DATE:20210604 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:34393672-a43f-4d16-85ec-e2783be1a05c DTSTART;VALUE=DATE:20220301 DTEND;VALUE=DATE:20220302 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:aea2a84a-da17-4f91-b160-15a89afa52cc DTSTART;VALUE=DATE:20220415 DTEND;VALUE=DATE:20220416 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:e435c5bd-f5a2-487a-ac4e-b56745b89d14 DTSTART;VALUE=DATE:20220417 DTEND;VALUE=DATE:20220418 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:023a861a-d37e-45f9-b595-6ee750333b3e DTSTART;VALUE=DATE:20220616 DTEND;VALUE=DATE:20220617 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:6ae751a9-75b9-4c40-a6a2-d7dcff275d90 DTSTART;VALUE=DATE:20230221 DTEND;VALUE=DATE:20230222 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:a97015e0-4479-48fa-9720-d2d64b5121fa DTSTART;VALUE=DATE:20230407 DTEND;VALUE=DATE:20230408 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:2c78c1b0-9167-4aa3-b9ab-6a904c3968ee DTSTART;VALUE=DATE:20230409 DTEND;VALUE=DATE:20230410 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:fd053ba5-e0fa-431a-ac48-86bea8657167 DTSTART;VALUE=DATE:20230608 DTEND;VALUE=DATE:20230609 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:4d992236-76a1-4764-b551-25059527350c DTSTART;VALUE=DATE:20240213 DTEND;VALUE=DATE:20240214 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:cbd961b8-ce49-4e59-9d1c-998e1c6fd3ee DTSTART;VALUE=DATE:20240329 DTEND;VALUE=DATE:20240330 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:1824da6f-f0a0-4faa-a028-8ac59914439b DTSTART;VALUE=DATE:20240530 DTEND;VALUE=DATE:20240531 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:0839a8fe-67ef-49b3-8ca9-985a31792d4d DTSTART;VALUE=DATE:20250304 DTEND;VALUE=DATE:20250305 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:2fb6f244-6722-4d55-b7f7-eb03d8bac186 DTSTART;VALUE=DATE:20250418 DTEND;VALUE=DATE:20250419 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:1c93fa44-78ad-48b6-8c9a-f78b14997c8e DTSTART;VALUE=DATE:20250420 DTEND;VALUE=DATE:20250421 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:58b16e20-1093-40ab-87d6-063ef28a9cbf DTSTART;VALUE=DATE:20250619 DTEND;VALUE=DATE:20250620 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:138c5a65-4df9-4d17-9410-5b53e9ff8b0a DTSTART;VALUE=DATE:20260217 DTEND;VALUE=DATE:20260218 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:4e96f4cf-185a-411d-bee6-21eb5eb56b06 DTSTART;VALUE=DATE:20260403 DTEND;VALUE=DATE:20260404 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:2ddbd9f0-02aa-4b55-a30d-8b1a14ccedb3 DTSTART;VALUE=DATE:20260405 DTEND;VALUE=DATE:20260406 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:04e53c14-c9a6-4ae1-9169-47c81231e4f5 DTSTART;VALUE=DATE:20260604 DTEND;VALUE=DATE:20260605 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:2617081c-c96d-4cf9-88fd-72688fb4910b DTSTART;VALUE=DATE:20270209 DTEND;VALUE=DATE:20270210 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:aba7a9f2-a8bc-4b31-b6ec-86b0a92f11c0 DTSTART;VALUE=DATE:20270326 DTEND;VALUE=DATE:20270327 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:7f9c3fe9-06f5-45b0-ba55-2c8da8055b38 DTSTART;VALUE=DATE:20270527 DTEND;VALUE=DATE:20270528 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:918f486a-f745-4bb7-ab1b-3e4ae771845f DTSTART;VALUE=DATE:20280229 DTEND;VALUE=DATE:20280301 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:516e9453-13ba-46f0-bd0a-e0996cf85dd7 DTSTART;VALUE=DATE:20280414 DTEND;VALUE=DATE:20280415 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:bf203169-cc8c-4329-9559-c89dc96c6695 DTSTART;VALUE=DATE:20280416 DTEND;VALUE=DATE:20280417 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:329fd131-869e-4855-805a-94b58c66241e DTSTART;VALUE=DATE:20280615 DTEND;VALUE=DATE:20280616 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:bd294fef-c437-4351-ad44-986917cc79dd DTSTART;VALUE=DATE:20290213 DTEND;VALUE=DATE:20290214 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:06104d63-a31c-419a-95b4-a03d4bb40cb1 DTSTART;VALUE=DATE:20290330 DTEND;VALUE=DATE:20290331 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:ae8f5a91-1d01-49b7-b22b-4ca562a25a02 DTSTART;VALUE=DATE:20290401 DTEND;VALUE=DATE:20290402 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:f33509dc-e9fc-4fb0-9c93-e3671e498f12 DTSTART;VALUE=DATE:20290531 DTEND;VALUE=DATE:20290601 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Carnival +SUMMARY:Carnaval UID:faa77196-c452-4f05-a146-01048d362c23 DTSTART;VALUE=DATE:20300305 DTEND;VALUE=DATE:20300306 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Good Friday +SUMMARY:Sexta-Feira Santa UID:23bb3359-d3a8-4b1d-b45e-625c6aa9d7ab DTSTART;VALUE=DATE:20300419 DTEND;VALUE=DATE:20300420 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Easter +SUMMARY:Páscoa UID:c38cda82-92dc-49ce-b49f-a581213fef38 DTSTART;VALUE=DATE:20300421 DTEND;VALUE=DATE:20300422 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:Corpus Christi +SUMMARY:Corpo de Deus UID:a3a2a74a-7c19-4ffb-9f19-519743bffd1d DTSTART;VALUE=DATE:20300620 DTEND;VALUE=DATE:20300621 STATUS:CONFIRMED END:VEVENT BEGIN:VEVENT -SUMMARY:New Year +SUMMARY:Ano Novo UID:d0c7af02-7a6b-41e3-8421-cfd6895e1223 DTSTART;VALUE=DATE:20010101 DTEND;VALUE=DATE:20010102 @@ -365,7 +365,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Liberty Day +SUMMARY:Dia da Liberdade UID:8b096e79-da0d-45f3-905d-80cdaddcb07c DTSTART;VALUE=DATE:20010425 DTEND;VALUE=DATE:20010426 @@ -373,7 +373,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Labour Day +SUMMARY:Dia do Trabalhador UID:26e3ea80-ba4b-4208-bd73-c07483cb87b5 DTSTART;VALUE=DATE:20010501 DTEND;VALUE=DATE:20010502 @@ -381,7 +381,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Day of Portugal +SUMMARY:Dia de Portugal UID:0317f4ef-6bb6-49db-a8f7-36957676e05f DTSTART;VALUE=DATE:20010610 DTEND;VALUE=DATE:20010611 @@ -389,7 +389,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Our Lady Assumption Day +SUMMARY:Assunção de Nossa Senhora UID:66c355ac-f86b-4b62-9b88-bfab5da28dd9 DTSTART;VALUE=DATE:20010815 DTEND;VALUE=DATE:20010816 @@ -397,7 +397,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Republic Day +SUMMARY:Implantação da República UID:0a1bf4e7-50f8-4d3f-b449-e0f792b7fc9c DTSTART;VALUE=DATE:20011005 DTEND;VALUE=DATE:20011006 @@ -405,7 +405,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Day of All Saints +SUMMARY:Dia de Todos os Santos UID:79b44222-18ac-47a6-9361-0f69c28c1038 DTSTART;VALUE=DATE:20011101 DTEND;VALUE=DATE:20011102 @@ -413,7 +413,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Independence Day +SUMMARY:Restauração da Independência UID:e5ab7efe-c4ce-4bb1-a8a4-e63e46de2d74 DTSTART;VALUE=DATE:20011201 DTEND;VALUE=DATE:20011202 @@ -421,7 +421,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Imaculate Conception Day +SUMMARY:Dia da Imaculada Conceição UID:44cf05dd-d95d-4759-be8e-d177e943189f DTSTART;VALUE=DATE:20011208 DTEND;VALUE=DATE:20011209 @@ -429,7 +429,7 @@ STATUS:CONFIRMED RRULE:FREQ=YEARLY;INTERVAL=1 END:VEVENT BEGIN:VEVENT -SUMMARY:Christmas +SUMMARY:Natal UID:c6312a02-e749-42e4-855b-51af541b5fcd DTSTART;VALUE=DATE:20011225 DTEND;VALUE=DATE:20011226 From 32c5c9ca8b6463841536d337092762bdcee0230b Mon Sep 17 00:00:00 2001 From: Tommy He Date: Sat, 17 Oct 2020 20:10:53 +0800 Subject: [PATCH 111/144] Small fixes for zh_CN translation. --- app/src/main/res/values-zh-rCN/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 99ae03308..9b0c5212c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,7 +1,7 @@     简易日历 -    简易日历 +    日历     改变视图     日历视图     周历视图 @@ -235,14 +235,14 @@     以这方式建立的节日,会被加进一个叫做「节日」的新活动类型。         您可以到[设定] -> [管理活动类型],长按特定的活动类型,然后选择垃圾桶来删除。     我可以透过 Google 日历或其它支援 CalDAV 的服务来同步我的活动吗? -    行的,只要打开程序设定内的[CalDAV同步],然后选择您要同步的日历。然而您需要一些第三方应用程序来处理装置和伺服器之间的同步。 +    行的,只要打开程序设定内的[CalDAV同步],然后选择您要同步的日历。然而您需要一些第三方应用程序来处理装置和服务器之间的同步。         如果您要同步 Google 日历,他们官方的日历程序就能做到了。而其它日历,您需要有第三方同步工具才行,像是 DAVx5。     我看到了视觉的提醒,但没听到音效。我能怎么办? -    不只是显示实际的提醒,播放音效也受到系统极大的影响。如果您听不到任何声音,试着到应用程序设定, -        按\"用于提醒的音频流\"选项,然后更改成不同数值。如果还是没有用,检查您的音量设定,指定串流是不是静音的。 +    不仅是显示效果的提醒,播放音效也受到系统极大的影响。如果您听不到任何声音,试着到应用程序设定, +        按\"用于提醒的音频流\"选项,然后更改成不同数值。如果还是没有用,请检查您的音量设定,指定串流是不是静音的。 该应用程序支持时区吗? 是的,它支持。默认所有的活动会在您当前的时区下创建。如果您想要改变活动的时区, - 您首先需要在应用程序设定中启用时区选择器,然后在活动详情界面中更改它。这个默认是禁用的因为大多数不会用到它。 + 您首先需要在应用程序设定中启用时区选择器,然后在活动详情界面中更改它。这个默认是禁用的因为大多数人都不会用到它。           From d676f87c409f248df614e11de6812052aee82e0c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 18:21:29 +0100 Subject: [PATCH 112/144] adding a Print menu button --- app/build.gradle | 3 ++- .../calendar/pro/activities/MainActivity.kt | 5 +++++ .../calendar/pro/extensions/Context.kt | 10 ++++++++++ .../calendar/pro/fragments/DayFragmentsHolder.kt | 2 ++ .../calendar/pro/fragments/EventListFragment.kt | 2 ++ .../calendar/pro/fragments/MonthFragment.kt | 14 ++++++++++++++ .../calendar/pro/fragments/MonthFragmentsHolder.kt | 12 +++++++----- .../calendar/pro/fragments/MyFragmentHolder.kt | 2 ++ .../calendar/pro/fragments/WeekFragmentsHolder.kt | 2 ++ .../calendar/pro/fragments/YearFragmentsHolder.kt | 2 ++ app/src/main/res/menu/menu_main.xml | 4 ++++ build.gradle | 2 +- 12 files changed, 53 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 72e4454e1..8b94ce5a4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,11 +64,12 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.30.24' + implementation 'com.simplemobiletools:commons:5.31.8' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation "androidx.print:print:1.0.0" kapt 'androidx.room:room-compiler:2.2.5' implementation 'androidx.room:room-runtime:2.2.5' diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 991223ecf..bfe24d4ea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -192,6 +192,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { R.id.change_view -> showViewDialog() R.id.go_to_today -> goToToday() R.id.go_to_date -> showGoToDateDialog() + R.id.print -> printView() R.id.filter -> showFilterDialog() R.id.refresh_caldav_calendars -> refreshCalDAVCalendars(true) R.id.add_holidays -> addHolidays() @@ -424,6 +425,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { currentFragments.last().showGoToDateDialog() } + fun printView() { + currentFragments.last().printView() + } + private fun resetActionBarTitle() { updateActionBarTitle(getString(R.string.app_launcher_name)) updateActionBarSubtitle("") diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt index cd0d20413..566b3ca86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt @@ -8,7 +8,9 @@ import android.content.ComponentName import android.content.ContentResolver import android.content.Context import android.content.Intent +import android.content.pm.ActivityInfo import android.content.res.Resources +import android.graphics.Bitmap import android.media.AudioAttributes import android.net.Uri import android.os.Bundle @@ -20,6 +22,7 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.core.app.AlarmManagerCompat import androidx.core.app.NotificationCompat +import androidx.print.PrintHelper import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.EventActivity import com.simplemobiletools.calendar.pro.activities.SnoozeReminderActivity @@ -544,3 +547,10 @@ fun Context.getWeeklyViewItemHeight(): Float { val multiplier = config.weeklyViewItemHeightMultiplier return defaultHeight * multiplier } + +fun Context.printBitmap(bitmap: Bitmap) { + val printHelper = PrintHelper(this) + printHelper.scaleMode = PrintHelper.SCALE_MODE_FIT + printHelper.orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + printHelper.printBitmap(getString(R.string.app_name), bitmap) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt index 17c9d508a..5fd2a744c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt @@ -138,4 +138,6 @@ class DayFragmentsHolder : MyFragmentHolder(), NavigationListener { } override fun getNewEventDayCode() = currentDayCode + + override fun printView() {} } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt index da553b923..fdf849aea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt @@ -210,4 +210,6 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { } override fun getNewEventDayCode() = Formatter.getTodayCode() + + override fun printView() {} } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt index 718dc0da8..57f40ddc8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt @@ -1,13 +1,17 @@ package com.simplemobiletools.calendar.pro.fragments import android.content.Context +import android.content.pm.ActivityInfo import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Canvas import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.RelativeLayout import androidx.fragment.app.Fragment +import androidx.print.PrintHelper import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.MainActivity import com.simplemobiletools.calendar.pro.extensions.config @@ -19,6 +23,7 @@ import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.pro.interfaces.NavigationListener import com.simplemobiletools.calendar.pro.models.DayMonthly import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.helpers.mydebug import kotlinx.android.synthetic.main.fragment_month.view.* import kotlinx.android.synthetic.main.top_navigation.view.* import org.joda.time.DateTime @@ -102,6 +107,14 @@ class MonthFragment : Fragment(), MonthlyCalendar { } } + fun loadBitmapFromView(v: View): Bitmap? { + val b = Bitmap.createBitmap(v.width, v.height, Bitmap.Config.ARGB_8888) + val c = Canvas(b) + v.layout(v.left, v.top, v.right, v.bottom) + v.draw(c) + return b + } + private fun setupButtons() { mTextColor = mConfig.textColor @@ -109,6 +122,7 @@ class MonthFragment : Fragment(), MonthlyCalendar { applyColorFilter(mTextColor) background = null setOnClickListener { + val bitmap = loadBitmapFromView(mHolder.month_calendar_holder) listener?.goLeft() } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt index e9eebd787..c504809ea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt @@ -115,11 +115,11 @@ class MonthFragmentsHolder : MyFragmentHolder(), NavigationListener { datePicker.init(dateTime.year, dateTime.monthOfYear - 1, 1, null) AlertDialog.Builder(context!!) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.ok) { dialog, which -> datePicked(dateTime, datePicker) } - .create().apply { - activity?.setupDialogStuff(view, this) - } + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.ok) { dialog, which -> datePicked(dateTime, datePicker) } + .create().apply { + activity?.setupDialogStuff(view, this) + } } private fun datePicked(dateTime: DateTime, datePicker: DatePicker) { @@ -140,4 +140,6 @@ class MonthFragmentsHolder : MyFragmentHolder(), NavigationListener { } override fun getNewEventDayCode() = if (shouldGoToTodayBeVisible()) currentDayCode else todayDayCode + + override fun printView() {} } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MyFragmentHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MyFragmentHolder.kt index a7708e98e..faf2008b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MyFragmentHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MyFragmentHolder.kt @@ -14,4 +14,6 @@ abstract class MyFragmentHolder : Fragment() { abstract fun updateActionBarTitle() abstract fun getNewEventDayCode(): String + + abstract fun printView() } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt index a0cd07745..91a725c3b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt @@ -258,4 +258,6 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { } override fun getFullFragmentHeight() = weekHolder!!.week_view_holder.height - weekHolder!!.week_view_seekbar.height - weekHolder!!.week_view_days_count_divider.height + + override fun printView() {} } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt index ff3221d8f..347d4cce3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt @@ -126,4 +126,6 @@ class YearFragmentsHolder : MyFragmentHolder() { } override fun getNewEventDayCode() = Formatter.getTodayCode() + + override fun printView() {} } diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index cdfb2ca48..db4216148 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -31,6 +31,10 @@ android:id="@+id/go_to_date" android:title="@string/go_to_date" app:showAsAction="never"/> + Date: Sun, 25 Oct 2020 18:32:03 +0100 Subject: [PATCH 113/144] adding an initial monthly view Print implementation --- .../pro/adapters/MyMonthPagerAdapter.kt | 4 ++++ .../calendar/pro/extensions/View.kt | 13 ++++++++++++ .../calendar/pro/fragments/MonthFragment.kt | 20 ++++++------------- .../pro/fragments/MonthFragmentsHolder.kt | 4 +++- 4 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/View.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyMonthPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyMonthPagerAdapter.kt index 744d576a2..08dceb263 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyMonthPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyMonthPagerAdapter.kt @@ -32,4 +32,8 @@ class MyMonthPagerAdapter(fm: FragmentManager, private val mCodes: List, mFragments[pos + i]?.updateCalendar() } } + + fun printCurrentView(pos: Int) { + mFragments[pos].printCurrentView() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/View.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/View.kt new file mode 100644 index 000000000..db49da71e --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/View.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.calendar.pro.extensions + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.view.View + +fun View.getViewBitmap(): Bitmap { + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + layout(left, top, right, bottom) + draw(canvas) + return bitmap +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt index 57f40ddc8..fbe604846 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt @@ -1,20 +1,18 @@ package com.simplemobiletools.calendar.pro.fragments import android.content.Context -import android.content.pm.ActivityInfo import android.content.res.Resources -import android.graphics.Bitmap -import android.graphics.Canvas import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.RelativeLayout import androidx.fragment.app.Fragment -import androidx.print.PrintHelper import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.MainActivity import com.simplemobiletools.calendar.pro.extensions.config +import com.simplemobiletools.calendar.pro.extensions.getViewBitmap +import com.simplemobiletools.calendar.pro.extensions.printBitmap import com.simplemobiletools.calendar.pro.helpers.Config import com.simplemobiletools.calendar.pro.helpers.DAY_CODE import com.simplemobiletools.calendar.pro.helpers.Formatter @@ -23,7 +21,6 @@ import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.pro.interfaces.NavigationListener import com.simplemobiletools.calendar.pro.models.DayMonthly import com.simplemobiletools.commons.extensions.applyColorFilter -import com.simplemobiletools.commons.helpers.mydebug import kotlinx.android.synthetic.main.fragment_month.view.* import kotlinx.android.synthetic.main.top_navigation.view.* import org.joda.time.DateTime @@ -107,14 +104,6 @@ class MonthFragment : Fragment(), MonthlyCalendar { } } - fun loadBitmapFromView(v: View): Bitmap? { - val b = Bitmap.createBitmap(v.width, v.height, Bitmap.Config.ARGB_8888) - val c = Canvas(b) - v.layout(v.left, v.top, v.right, v.bottom) - v.draw(c) - return b - } - private fun setupButtons() { mTextColor = mConfig.textColor @@ -122,7 +111,6 @@ class MonthFragment : Fragment(), MonthlyCalendar { applyColorFilter(mTextColor) background = null setOnClickListener { - val bitmap = loadBitmapFromView(mHolder.month_calendar_holder) listener?.goLeft() } @@ -156,4 +144,8 @@ class MonthFragment : Fragment(), MonthlyCalendar { (activity as MainActivity).openDayFromMonthly(Formatter.getDateTimeFromCode(it.code)) } } + + fun printCurrentView() { + context!!.printBitmap(mHolder.month_calendar_holder.getViewBitmap()) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt index c504809ea..474b985ea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt @@ -141,5 +141,7 @@ class MonthFragmentsHolder : MyFragmentHolder(), NavigationListener { override fun getNewEventDayCode() = if (shouldGoToTodayBeVisible()) currentDayCode else todayDayCode - override fun printView() {} + override fun printView() { + (viewPager?.adapter as? MyMonthPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } From 0cb88a1405c97e8c92e241a4ba75a51f7e6858aa Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 19:38:30 +0100 Subject: [PATCH 114/144] properly adjust the colors before printing the month view --- .../calendar/pro/fragments/MonthFragment.kt | 18 ++++++++++- .../calendar/pro/views/MonthView.kt | 31 ++++++++++++++----- .../calendar/pro/views/MonthViewWrapper.kt | 4 +++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt index fbe604846..1361e058a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt @@ -21,6 +21,8 @@ import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.pro.interfaces.NavigationListener import com.simplemobiletools.calendar.pro.models.DayMonthly import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.beGone +import com.simplemobiletools.commons.extensions.beVisible import kotlinx.android.synthetic.main.fragment_month.view.* import kotlinx.android.synthetic.main.top_navigation.view.* import org.joda.time.DateTime @@ -146,6 +148,20 @@ class MonthFragment : Fragment(), MonthlyCalendar { } fun printCurrentView() { - context!!.printBitmap(mHolder.month_calendar_holder.getViewBitmap()) + val darkColor = resources.getColor(R.color.theme_light_text_color) + + mHolder.apply { + top_left_arrow.beGone() + top_right_arrow.beGone() + top_value.setTextColor(darkColor) + month_view_wrapper.togglePrintMode() + + context!!.printBitmap(month_calendar_holder.getViewBitmap()) + + top_left_arrow.beVisible() + top_right_arrow.beVisible() + top_value.setTextColor(mConfig.textColor) + month_view_wrapper.togglePrintMode() + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthView.kt index 9a1d52c60..b548247a8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthView.kt @@ -46,6 +46,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con private var horizontalOffset = 0 private var showWeekNumbers = false private var dimPastEvents = true + private var isPrintVersion = false private var allEvents = ArrayList() private var bgRectF = RectF() private var dayLetters = ArrayList() @@ -108,14 +109,14 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con val validDayEvent = isDayValid(event, day.code) if ((lastEvent == null || lastEvent.startDayIndex + daysCnt <= day.indexOnMonthView) && !validDayEvent) { val monthViewEvent = MonthViewEvent(event.id!!, event.title, event.startTS, event.color, day.indexOnMonthView, - daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent) + daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent) allEvents.add(monthViewEvent) } } } allEvents = allEvents.asSequence().sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.startDayIndex }, { it.title })) - .toMutableList() as ArrayList + .toMutableList() as ArrayList } override fun onDraw(canvas: Canvas) { @@ -142,7 +143,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con val xPos = x * dayWidth + horizontalOffset val yPos = y * dayHeight + verticalOffset val xPosCenter = xPos + dayWidth / 2 - if (day.isToday) { + if (day.isToday && !isPrintVersion) { canvas.drawCircle(xPosCenter, yPos + paint.textSize * 0.7f, paint.textSize * 0.75f, getCirclePaint(day)) } @@ -179,7 +180,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con for (i in 0..6) { val xPos = horizontalOffset + (i + 1) * dayWidth - dayWidth / 2 var weekDayLetterPaint = paint - if (i == currDayOfWeek) { + if (i == currDayOfWeek && !isPrintVersion) { weekDayLetterPaint = getColoredPaint(primaryColor) } canvas.drawText(dayLetters[i], xPos, weekDaysLetterHeight * 0.7f, weekDayLetterPaint) @@ -192,7 +193,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con for (i in 0 until ROW_COUNT) { val weekDays = days.subList(i * 7, i * 7 + 7) - weekNumberPaint.color = if (weekDays.any { it.isToday }) primaryColor else textColor + weekNumberPaint.color = if (weekDays.any { it.isToday && !isPrintVersion }) primaryColor else textColor // fourth day of the week determines the week of the year number val weekOfYear = days.getOrNull(i * 7 + 3)?.weekOfYear ?: 1 @@ -257,7 +258,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con private fun getTextPaint(startDay: DayMonthly): Paint { var paintColor = textColor - if (startDay.isToday) { + if (startDay.isToday && !isPrintVersion) { paintColor = primaryColor.getContrastColor() } @@ -276,7 +277,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con private fun getEventBackgroundColor(event: MonthViewEvent, startDay: DayMonthly, endDay: DayMonthly): Paint { var paintColor = event.color - if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent)) { + if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent && !isPrintVersion)) { paintColor = paintColor.adjustAlpha(MEDIUM_ALPHA) } @@ -285,7 +286,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con private fun getEventTitlePaint(event: MonthViewEvent, startDay: DayMonthly, endDay: DayMonthly): Paint { var paintColor = event.color.getContrastColor() - if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent)) { + if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent && !isPrintVersion)) { paintColor = paintColor.adjustAlpha(MEDIUM_ALPHA) } @@ -348,4 +349,18 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con val date = Formatter.getDateTimeFromCode(code) return event.startTS != event.endTS && Formatter.getDateTimeFromTS(event.endTS) == Formatter.getDateTimeFromTS(date.seconds()).withTimeAtStartOfDay() } + + fun togglePrintMode() { + isPrintVersion = !isPrintVersion + textColor = if (isPrintVersion) { + resources.getColor(R.color.theme_light_text_color) + } else { + config.textColor + } + + paint.color = textColor + gridPaint.color = textColor.adjustAlpha(LOW_ALPHA) + invalidate() + initWeekDayLetters() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthViewWrapper.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthViewWrapper.kt index de291cb25..4d430d025 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthViewWrapper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MonthViewWrapper.kt @@ -96,4 +96,8 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F addView(this) } } + + fun togglePrintMode() { + monthView.togglePrintMode() + } } From bc8c9fd1f6bdabd84904f8f0ccf3aa0fc4451d2a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 20:05:23 +0100 Subject: [PATCH 115/144] add Print support at the daily view --- .../calendar/pro/adapters/DayEventsAdapter.kt | 13 ++++++++- .../pro/adapters/MyDayPagerAdapter.kt | 4 +++ .../calendar/pro/fragments/DayFragment.kt | 27 ++++++++++++++++++- .../pro/fragments/DayFragmentsHolder.kt | 4 ++- .../calendar/pro/fragments/MonthFragment.kt | 4 +-- 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/DayEventsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/DayEventsAdapter.kt index 0fbab41de..36cdfd449 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/DayEventsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/DayEventsAdapter.kt @@ -30,6 +30,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList, r private val allDayString = resources.getString(R.string.all_day) private val replaceDescriptionWithLocation = activity.config.replaceDescription private val dimPastEvents = activity.config.dimPastEvents + private var isPrintVersion = false init { setupDragListener(true) @@ -96,6 +97,16 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList, r } } + fun togglePrintMode() { + isPrintVersion = !isPrintVersion + textColor = if (isPrintVersion) { + resources.getColor(R.color.theme_light_text_color) + } else { + baseConfig.textColor + } + notifyDataSetChanged() + } + private fun setupView(view: View, event: Event) { view.apply { event_item_frame.isSelected = selectedKeys.contains(event.id?.toInt()) @@ -124,7 +135,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList, r } var newTextColor = textColor - if (dimPastEvents && event.isPastEvent) { + if (dimPastEvents && event.isPastEvent && !isPrintVersion) { newTextColor = newTextColor.adjustAlpha(LOW_ALPHA) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyDayPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyDayPagerAdapter.kt index 0982c5ef4..812683121 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyDayPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyDayPagerAdapter.kt @@ -33,4 +33,8 @@ class MyDayPagerAdapter(fm: FragmentManager, private val mCodes: List, p mFragments[pos + i]?.updateCalendar() } } + + fun printCurrentView(pos: Int) { + mFragments[pos].printCurrentView() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt index 78493ebc9..b4710297a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt @@ -14,6 +14,8 @@ import com.simplemobiletools.calendar.pro.activities.SimpleActivity import com.simplemobiletools.calendar.pro.adapters.DayEventsAdapter import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.eventsHelper +import com.simplemobiletools.calendar.pro.extensions.getViewBitmap +import com.simplemobiletools.calendar.pro.extensions.printBitmap import com.simplemobiletools.calendar.pro.helpers.DAY_CODE import com.simplemobiletools.calendar.pro.helpers.EVENT_ID import com.simplemobiletools.calendar.pro.helpers.EVENT_OCCURRENCE_TS @@ -21,6 +23,9 @@ import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.interfaces.NavigationListener import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.beGone +import com.simplemobiletools.commons.extensions.beVisible +import com.simplemobiletools.commons.extensions.onGlobalLayout import kotlinx.android.synthetic.main.fragment_day.view.* import kotlinx.android.synthetic.main.top_navigation.view.* import java.util.* @@ -101,7 +106,7 @@ class DayFragment : Fragment() { lastHash = newHash val replaceDescription = context!!.config.replaceDescription - val sorted = ArrayList(events.sortedWith(compareBy({ !it.getIsAllDay() }, { it.startTS }, { it.endTS }, { it.title }, { + val sorted = ArrayList(events.sortedWith(compareBy({ !it.getIsAllDay() }, { it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))) @@ -128,4 +133,24 @@ class DayFragment : Fragment() { startActivity(this) } } + + fun printCurrentView() { + mHolder.apply { + top_left_arrow.beGone() + top_right_arrow.beGone() + top_value.setTextColor(resources.getColor(R.color.theme_light_text_color)) + (day_events.adapter as? DayEventsAdapter)?.togglePrintMode() + + day_events.onGlobalLayout { + context!!.printBitmap(day_holder.getViewBitmap()) + + day_events.onGlobalLayout { + top_left_arrow.beVisible() + top_right_arrow.beVisible() + top_value.setTextColor(context!!.config.textColor) + (day_events.adapter as? DayEventsAdapter)?.togglePrintMode() + } + } + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt index 5fd2a744c..03f9343b7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragmentsHolder.kt @@ -139,5 +139,7 @@ class DayFragmentsHolder : MyFragmentHolder(), NavigationListener { override fun getNewEventDayCode() = currentDayCode - override fun printView() {} + override fun printView() { + (viewPager?.adapter as? MyDayPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt index 1361e058a..d2110465f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragment.kt @@ -148,12 +148,10 @@ class MonthFragment : Fragment(), MonthlyCalendar { } fun printCurrentView() { - val darkColor = resources.getColor(R.color.theme_light_text_color) - mHolder.apply { top_left_arrow.beGone() top_right_arrow.beGone() - top_value.setTextColor(darkColor) + top_value.setTextColor(resources.getColor(R.color.theme_light_text_color)) month_view_wrapper.togglePrintMode() context!!.printBitmap(month_calendar_holder.getViewBitmap()) From 71f207551c189bff6212ef77816dcbf7e853fde3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 20:37:02 +0100 Subject: [PATCH 116/144] adding Print mode at the weekly view --- .../pro/adapters/MyWeekPagerAdapter.kt | 4 ++ .../calendar/pro/fragments/WeekFragment.kt | 20 +++++-- .../pro/fragments/WeekFragmentsHolder.kt | 60 +++++++++++++------ 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt index f7703405f..e0dd43833 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt @@ -52,4 +52,8 @@ class MyWeekPagerAdapter(fm: FragmentManager, private val mWeekTimestamps: List< mFragments[pos + i]?.updateVisibleDaysCount(count) } } + + fun togglePrintMode(pos: Int) { + mFragments[pos].togglePrintMode() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 3443ec758..af6b1a6c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -58,6 +58,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private var wasExtraHeightAdded = false private var dimPastEvents = true private var wasScaled = false + private var isPrintVersion = false private var selectedGrid: View? = null private var currentTimeView: ImageView? = null private var fadeOutHandler = Handler() @@ -204,7 +205,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private fun setupDayLabels() { var curDay = Formatter.getDateTimeFromTS(weekTimestamp) - val textColor = config.textColor + val textColor = if (isPrintVersion) resources.getColor(R.color.theme_light_text_color) else config.textColor val todayCode = Formatter.getDayCodeFromDateTime(DateTime()) val screenWidth = context?.usableScreenSize?.x ?: return val dayWidth = screenWidth / config.weeklyViewDays @@ -224,7 +225,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { val label = inflater.inflate(R.layout.weekly_view_day_letter, mView.week_letters_holder, false) as MyTextView label.text = "$dayLetter\n${curDay.dayOfMonth}" - label.setTextColor(if (todayCode == dayCode) primaryColor else textColor) + label.setTextColor(if (todayCode == dayCode && !isPrintVersion) primaryColor else textColor) if (todayCode == dayCode) { todayColumnIndex = i } @@ -437,7 +438,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { (inflater.inflate(R.layout.week_event_marker, null, false) as TextView).apply { var backgroundColor = eventTypeColors.get(event.eventType, primaryColor) var textColor = backgroundColor.getContrastColor() - if (dimPastEvents && event.isPastEvent) { + if (dimPastEvents && event.isPastEvent && !isPrintVersion) { backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA) textColor = textColor.adjustAlpha(LOW_ALPHA) } @@ -504,6 +505,10 @@ class WeekFragment : Fragment(), WeeklyCalendar { mView.week_events_holder.removeView(currentTimeView) } + if (isPrintVersion) { + return + } + val weeklyViewDays = config.weeklyViewDays currentTimeView = (inflater.inflate(R.layout.week_now_marker, null, false) as ImageView).apply { applyColorFilter(primaryColor) @@ -538,7 +543,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { (inflater.inflate(R.layout.week_all_day_event_marker, null, false) as TextView).apply { var backgroundColor = eventTypeColors.get(event.eventType, primaryColor) var textColor = backgroundColor.getContrastColor() - if (dimPastEvents && event.isPastEvent) { + if (dimPastEvents && event.isPastEvent && !isPrintVersion) { backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA) textColor = textColor.adjustAlpha(LOW_ALPHA) } @@ -651,4 +656,11 @@ class WeekFragment : Fragment(), WeeklyCalendar { updateViewScale() } } + + fun togglePrintMode() { + isPrintVersion = !isPrintVersion + updateCalendar() + setupDayLabels() + addEvents(currEvents) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt index 91a725c3b..24f76eb18 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt @@ -1,7 +1,9 @@ package com.simplemobiletools.calendar.pro.fragments +import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -14,9 +16,7 @@ import androidx.viewpager.widget.ViewPager import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.MainActivity import com.simplemobiletools.calendar.pro.adapters.MyWeekPagerAdapter -import com.simplemobiletools.calendar.pro.extensions.config -import com.simplemobiletools.calendar.pro.extensions.getWeeklyViewItemHeight -import com.simplemobiletools.calendar.pro.extensions.seconds +import com.simplemobiletools.calendar.pro.extensions.* import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.helpers.WEEK_START_DATE_TIME import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener @@ -62,20 +62,7 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { private fun setupFragment() { val weekTSs = getWeekTimestamps(currentWeekTS) val weeklyAdapter = MyWeekPagerAdapter(activity!!.supportFragmentManager, weekTSs, this) - val itemHeight = context!!.getWeeklyViewItemHeight().toInt() - - val textColor = context!!.config.textColor - weekHolder!!.week_view_hours_holder.removeAllViews() - val hourDateTime = DateTime().withDate(2000, 1, 1).withTime(0, 0, 0, 0) - for (i in 1..23) { - val formattedHours = Formatter.getHours(context!!, hourDateTime.withHourOfDay(i)) - (layoutInflater.inflate(R.layout.weekly_view_hour_textview, null, false) as TextView).apply { - text = formattedHours - setTextColor(textColor) - height = itemHeight - weekHolder!!.week_view_hours_holder.addView(this) - } - } + addHours() defaultWeeklyPage = weekTSs.size / 2 viewPager!!.apply { @@ -130,6 +117,21 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { updateActionBarTitle() } + private fun addHours(textColor: Int = context!!.config.textColor) { + val itemHeight = context!!.getWeeklyViewItemHeight().toInt() + weekHolder!!.week_view_hours_holder.removeAllViews() + val hourDateTime = DateTime().withDate(2000, 1, 1).withTime(0, 0, 0, 0) + for (i in 1..23) { + val formattedHours = Formatter.getHours(context!!, hourDateTime.withHourOfDay(i)) + (layoutInflater.inflate(R.layout.weekly_view_hour_textview, null, false) as TextView).apply { + text = formattedHours + setTextColor(textColor) + height = itemHeight + weekHolder!!.week_view_hours_holder.addView(this) + } + } + } + private fun getWeekTimestamps(targetSeconds: Long): List { val weekTSs = ArrayList(PREFILLED_WEEKS) val dateTime = Formatter.getDateTimeFromTS(targetSeconds) @@ -259,5 +261,27 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { override fun getFullFragmentHeight() = weekHolder!!.week_view_holder.height - weekHolder!!.week_view_seekbar.height - weekHolder!!.week_view_days_count_divider.height - override fun printView() {} + override fun printView() { + weekHolder!!.apply { + week_view_days_count_divider.beGone() + week_view_seekbar.beGone() + week_view_days_count.beGone() + addHours(resources.getColor(R.color.theme_light_text_color)) + background = ColorDrawable(Color.WHITE) + (viewPager?.adapter as? MyWeekPagerAdapter)?.togglePrintMode(viewPager?.currentItem ?: 0) + + Handler().postDelayed({ + context!!.printBitmap(weekHolder!!.week_view_holder.getViewBitmap()) + + Handler().postDelayed({ + week_view_days_count_divider.beVisible() + week_view_seekbar.beVisible() + week_view_days_count.beVisible() + addHours() + background = ColorDrawable(context!!.config.backgroundColor) + (viewPager?.adapter as? MyWeekPagerAdapter)?.togglePrintMode(viewPager?.currentItem ?: 0) + }, 1000) + }, 1000) + } + } } From abf8998d5bdf9eaab2d2fff0d942e1a11d1af76c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 20:40:47 +0100 Subject: [PATCH 117/144] use hardcoded seconds at printing day view, do not rely on redraws --- .../calendar/pro/fragments/DayFragment.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt index b4710297a..75545a929 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.calendar.pro.fragments import android.content.Intent import android.os.Bundle +import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -25,7 +26,6 @@ import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.beVisible -import com.simplemobiletools.commons.extensions.onGlobalLayout import kotlinx.android.synthetic.main.fragment_day.view.* import kotlinx.android.synthetic.main.top_navigation.view.* import java.util.* @@ -141,16 +141,16 @@ class DayFragment : Fragment() { top_value.setTextColor(resources.getColor(R.color.theme_light_text_color)) (day_events.adapter as? DayEventsAdapter)?.togglePrintMode() - day_events.onGlobalLayout { + Handler().postDelayed({ context!!.printBitmap(day_holder.getViewBitmap()) - day_events.onGlobalLayout { + Handler().postDelayed({ top_left_arrow.beVisible() top_right_arrow.beVisible() top_value.setTextColor(context!!.config.textColor) (day_events.adapter as? DayEventsAdapter)?.togglePrintMode() - } - } + }, 1000) + }, 1000) } } } From eed880c195254abbea68ef4eda27c67b7fd95f55 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 21:48:27 +0100 Subject: [PATCH 118/144] allow printing the yearly view --- .../pro/adapters/MyYearPagerAdapter.kt | 4 ++ .../calendar/pro/fragments/YearFragment.kt | 51 +++++++++++++++---- .../pro/fragments/YearFragmentsHolder.kt | 5 +- .../calendar/pro/views/SmallMonthView.kt | 15 +++++- app/src/main/res/layout/fragment_year.xml | 24 ++++----- 5 files changed, 74 insertions(+), 25 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyYearPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyYearPagerAdapter.kt index ed8528cb5..f57fc7d9f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyYearPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyYearPagerAdapter.kt @@ -30,4 +30,8 @@ class MyYearPagerAdapter(fm: FragmentManager, val mYears: List) : FragmentS mFragments[pos + i]?.updateCalendar() } } + + fun printCurrentView(pos: Int) { + mFragments[pos].printCurrentView() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragment.kt index 14ec7ad2b..a8fc89edc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragment.kt @@ -1,6 +1,5 @@ package com.simplemobiletools.calendar.pro.fragments -import android.content.res.Resources import android.os.Bundle import android.util.SparseArray import android.view.LayoutInflater @@ -11,6 +10,8 @@ import androidx.fragment.app.Fragment import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.MainActivity import com.simplemobiletools.calendar.pro.extensions.config +import com.simplemobiletools.calendar.pro.extensions.getViewBitmap +import com.simplemobiletools.calendar.pro.extensions.printBitmap import com.simplemobiletools.calendar.pro.helpers.YEAR_LABEL import com.simplemobiletools.calendar.pro.helpers.YearlyCalendarImpl import com.simplemobiletools.calendar.pro.interfaces.YearlyCalendar @@ -25,6 +26,7 @@ import java.util.* class YearFragment : Fragment(), YearlyCalendar { private var mYear = 0 private var mSundayFirst = false + private var isPrintVersion = false private var lastHash = 0 private var mCalendar: YearlyCalendarImpl? = null @@ -37,7 +39,6 @@ class YearFragment : Fragment(), YearlyCalendar { setupMonths() mCalendar = YearlyCalendarImpl(this, context!!, mYear) - return mView } @@ -65,30 +66,40 @@ class YearFragment : Fragment(), YearlyCalendar { val days = dateTime.dayOfMonth().maximumValue mView.month_2.setDays(days) - val res = resources - markCurrentMonth(res) + val now = DateTime() for (i in 1..12) { - val monthView = mView.findViewById(res.getIdentifier("month_" + i, "id", context!!.packageName)) + val monthView = mView.findViewById(resources.getIdentifier("month_$i", "id", context!!.packageName)) var dayOfWeek = dateTime.withMonthOfYear(i).dayOfWeek().get() if (!mSundayFirst) { dayOfWeek-- } + val monthLabel = mView.findViewById(resources.getIdentifier("month_${i}_label", "id", context!!.packageName)) + val curTextColor = when { + isPrintVersion -> resources.getColor(R.color.theme_light_text_color) + else -> context!!.config.textColor + } + + monthLabel.setTextColor(curTextColor) + monthView.firstDay = dayOfWeek monthView.setOnClickListener { (activity as MainActivity).openMonthFromYearly(DateTime().withDate(mYear, i, 1)) } } + + if (!isPrintVersion) { + markCurrentMonth(now) + } } - private fun markCurrentMonth(res: Resources) { - val now = DateTime() + private fun markCurrentMonth(now: DateTime) { if (now.year == mYear) { - val monthLabel = mView.findViewById(res.getIdentifier("month_${now.monthOfYear}_label", "id", context!!.packageName)) + val monthLabel = mView.findViewById(resources.getIdentifier("month_${now.monthOfYear}_label", "id", context!!.packageName)) monthLabel.setTextColor(context!!.getAdjustedPrimaryColor()) - val monthView = mView.findViewById(res.getIdentifier("month_${now.monthOfYear}", "id", context!!.packageName)) + val monthView = mView.findViewById(resources.getIdentifier("month_${now.monthOfYear}", "id", context!!.packageName)) monthView.todaysId = now.dayOfMonth } } @@ -102,10 +113,28 @@ class YearFragment : Fragment(), YearlyCalendar { } lastHash = hashCode - val res = resources for (i in 1..12) { - val monthView = mView.findViewById(res.getIdentifier("month_$i", "id", context!!.packageName)) + val monthView = mView.findViewById(resources.getIdentifier("month_$i", "id", context!!.packageName)) monthView.setEvents(events.get(i)) } } + + fun printCurrentView() { + isPrintVersion = true + setupMonths() + toggleSmallMonthPrintModes() + + context!!.printBitmap(mView.calendar_holder.getViewBitmap()) + + isPrintVersion = false + setupMonths() + toggleSmallMonthPrintModes() + } + + private fun toggleSmallMonthPrintModes() { + for (i in 1..12) { + val monthView = mView.findViewById(resources.getIdentifier("month_$i", "id", context!!.packageName)) + monthView.togglePrintMode() + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt index 347d4cce3..e0e5175c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/YearFragmentsHolder.kt @@ -11,6 +11,7 @@ import androidx.appcompat.app.AlertDialog import androidx.viewpager.widget.ViewPager import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.MainActivity +import com.simplemobiletools.calendar.pro.adapters.MyMonthPagerAdapter import com.simplemobiletools.calendar.pro.adapters.MyYearPagerAdapter import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.helpers.Formatter @@ -127,5 +128,7 @@ class YearFragmentsHolder : MyFragmentHolder() { override fun getNewEventDayCode() = Formatter.getTodayCode() - override fun printView() {} + override fun printView() { + (viewPager?.adapter as? MyYearPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt index 117563411..19eec545d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/SmallMonthView.kt @@ -22,6 +22,7 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie private var textColor = 0 private var days = 31 private var isLandscape = false + private var isPrintVersion = false private var mEvents: ArrayList? = null var firstDay = 0 @@ -81,7 +82,7 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie if (curId in 1..days) { canvas.drawText(curId.toString(), x * dayWidth - (dayWidth / 4), y * dayWidth, getPaint(curId)) - if (curId == todaysId) { + if (curId == todaysId && !isPrintVersion) { val dividerConstant = if (isLandscape) 6 else 4 canvas.drawCircle(x * dayWidth - dayWidth / 2, y * dayWidth - dayWidth / dividerConstant, dayWidth * 0.41f, todayCirclePaint) } @@ -101,4 +102,16 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie return paint } + + fun togglePrintMode() { + isPrintVersion = !isPrintVersion + textColor = if (isPrintVersion) { + resources.getColor(R.color.theme_light_text_color) + } else { + context.config.textColor.adjustAlpha(MEDIUM_ALPHA) + } + + paint.color = textColor + invalidate() + } } diff --git a/app/src/main/res/layout/fragment_year.xml b/app/src/main/res/layout/fragment_year.xml index c193376b0..731dff3ba 100644 --- a/app/src/main/res/layout/fragment_year.xml +++ b/app/src/main/res/layout/fragment_year.xml @@ -15,7 +15,7 @@ android:layout_marginEnd="@dimen/yearly_padding_full" android:layout_weight="1"> - - - - - - - - - - - - Date: Sun, 25 Oct 2020 22:35:14 +0100 Subject: [PATCH 119/144] adding Printing to the event list view --- .../calendar/pro/adapters/EventListAdapter.kt | 21 ++++++++++++++----- .../pro/fragments/EventListFragment.kt | 14 ++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt index f75132b73..c17d110b1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt @@ -37,6 +37,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList= now) { + } else if (listEvent.startTS <= now && listEvent.endTS >= now && !isPrintVersion) { startTextColor = primaryColor } @@ -184,8 +195,8 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList Date: Sun, 25 Oct 2020 22:51:32 +0100 Subject: [PATCH 120/144] update version to 6.11.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8b94ce5a4..5873f095e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 184 - versionName "6.10.3" + versionCode 185 + versionName "6.11.0" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 937779f7b3a96c85e40a91e107663b47cc2836d7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 25 Oct 2020 22:51:39 +0100 Subject: [PATCH 121/144] updating changelog --- CHANGELOG.md | 6 ++++++ fastlane/metadata/android/en-US/changelogs/185.txt | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/185.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 4228b50e4..589ba8b61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 6.11.0 *(2020-10-25)* +---------------------------- + + * Added Print support + * Added some stability and translation improvements + Version 6.10.3 *(2020-09-28)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/185.txt b/fastlane/metadata/android/en-US/changelogs/185.txt new file mode 100644 index 000000000..39386308d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/185.txt @@ -0,0 +1,2 @@ + * Added Print support + * Added some stability and translation improvements From 919c84cb119e28120143b0f873316673e9d93eaa Mon Sep 17 00:00:00 2001 From: Aur36 Date: Tue, 27 Oct 2020 12:10:13 +0100 Subject: [PATCH 122/144] Improve French translation --- app/src/main/res/values-fr/strings.xml | 58 +++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e6f5d6de4..387f8a79c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -176,7 +176,7 @@ Diminuer l\’affichage des événements passés Evénements Flux audio utilisé par les rappels - System + Système Alarme Notification Sonnerie @@ -197,7 +197,7 @@ CalDAV - Seléctionner les agendas à synchroniser + Selectionner les agendas à synchroniser Gérer les agendas synchronisés Stocker uniquement localement Rafraîchir les agendas CalDAV @@ -209,7 +209,7 @@ Sélectionnez une couleur différente (peut être appliqué localement uniquement) Vous n\’êtes pas autorisé à écrire dans l\’agenda sélectionné Événement introuvable. Veuillez activer la synchronisation CalDAV pour le calendrier approprié dans les paramètres de l’application. - No synchronizable calendars have been found + Aucun calendrier synchronisable n\'a été trouvé @@ -250,47 +250,47 @@ Calendrier mobile 2020. Planificat. d\'horaire; rappel de RDV n\'importe quel jour - Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads! + Simple Calendar Pro est un calendrier entièrement personnalisable et hors-ligne désigné pour faire exactement ce qu\'un calendrier devrait faire. Aucune fonctionnalité compliquée, permissions inutiles et sans pubs ! - Whether you’re organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it easy to stay organized. With an incredible variety of customization options you can customize event reminders, notification sounds, calendar widgets and how the app looks. + Que vous souhaitiez organiser un évènement ponctuel ou récurrent, un anniversaire, un rendez-vous d'affaires ou quoi que ce soit d\'autre, Simple Calendar Pro rend simple votre organisation. Avec une grande variété d\'options de personnalisation, vous pouvez personnaliser les rappels d\'évènements, les sons de notifications, les widgets du calendrier et à quoi l\'application ressemble. - Daily, weekly and monthly views make checking your upcoming events & appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you know exactly what’s coming up in your life and when. + La vue journalière, semainière et mensuelle rend la vérification des évènements et rendez-vous à venir aisée. Vous pouvez même voir tous les évènements dans une simple liste plutôt que dans une vue calendrier, afin de savoir exactement ce qui va arriver dans votre vie et quand. ---------------------------------------------------------- - Simple Calendar Pro – Features & Benefits + Simple Calendar Pro – Fonctionnalités & avantages ---------------------------------------------------------- - ✔️ No ads or annoying popups - ✔️ No internet access needed, giving you more privacy & security - ✔️ Only the bare minimum permissions required - ✔️ Emphasis on simplicity – does what a calendar needs to do! + ✔️ Aucune publicité ou popup ennuyante + ✔️ Aucun accès à internet n\'est nécessaire, vous donnant un meilleur respect de la vie privée et de la sécurité + ✔️ Seul le strict minimum en permissions est requis + ✔️ Emphase sur la simplicité - fait ce qu'un calendrier doit faire ! ✔️ Open source - ✔️ Fully customizable themes & calendar / event widgets - ✔️ Translated into 29 languages - ✔️ Export settings to .txt files to import to another device - ✔️ CalDAV calendar sync supported to sync events across devices - ✔️ Daily, weekly, monthly, yearly & event views on the calendar - ✔️ Supports exporting & importing events via .ics files - ✔️ Set multiple event reminders, customize event reminder sound and vibration - ✔️ Snooze option for reminders - ✔️ Easily add holidays, birthdays, anniversaries & appointments - ✔️ Customize events – start time, duration, reminders etc - ✔️ Add event attendees to each event - ✔️ Use as a personal calendar or a business calendar - ✔️ Choose between reminders & email notifications to alert you about an event + ✔️ Thèmes et widgets entièrement personnalisables + ✔️ Traduit en 29 langues + ✔️ Export des paramètres en fichier .txt pour les importer sur un autre appareil + ✔️ Synchronisation du calendrier CalDAV supportée pour synchroniser entre les appareils + ✔️ Vue journalière, semainière, mensuelle et annuelle des évènements sur le calendrier + ✔️ Supporte l\'export et l\'import des évènements via des fichiers .ics + ✔️ Paramètre de multiples rappels d\'évènements, personnalise les effets sonores et la vibration des évènements + ✔️ Option snooze pour les rappels + ✔️ Ajoute facilement des évènements d\'anniversaire et de vacances + ✔️ Personnalise les évènements - début, durée, rappels, etc. + ✔️ Note les présences sur chaque évènement + ✔️ Utilisable en tant que calendrier personnel ou professionnel + ✔️ Choisissez entre rappels et notifications par email pour vous alerter à propos d'un évènement - DOWNLOAD SIMPLE CALENDAR PRO – THE SIMPLE OFFLINE CALENDAR WITH NO ADS! + TÉLÉCHARGEZ SIMPLE CALENDAR PRO – LE CALENDRIER HORS-LIGNE SIMPLE ET SANS PUBS ! - Check out the full suite of Simple Tools here: + Découvrez la suite complète des applications Simple Mobile Tools ici : https://www.simplemobiletools.com - Standalone website of Simple Calendar Pro: + Site internet de Simple Calendar Pro : https://www.simplemobiletools.com/calendar - Facebook: + Facebook : https://www.facebook.com/simplemobiletools - Reddit: + Reddit : https://www.reddit.com/r/SimpleMobileTools From c4f3bd6587e3767b84441ebe9637dda3dbf17b3d Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Oct 2020 10:35:20 +0100 Subject: [PATCH 123/144] fix #1213, properly handle the weekly view if the week starts on sunday --- app/build.gradle | 2 +- .../calendar/pro/activities/MainActivity.kt | 2 +- app/src/main/res/values-fr/strings.xml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5873f095e..ee9060967 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.31.8' + implementation 'com.simplemobiletools:commons:5.31.12' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index bfe24d4ea..1e0308b45 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -707,7 +707,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun getThisWeekDateTime(): String { - var thisweek = DateTime().withDayOfWeek(1).withTimeAtStartOfDay().minusDays(if (config.isSundayFirst) 1 else 0) + var thisweek = DateTime().withZone(DateTimeZone.UTC).withDayOfWeek(1).withTimeAtStartOfDay().minusDays(if (config.isSundayFirst) 1 else 0) if (DateTime().minusDays(7).seconds() > thisweek.seconds()) { thisweek = thisweek.plusDays(7) } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 387f8a79c..463323b69 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -252,7 +252,7 @@ Simple Calendar Pro est un calendrier entièrement personnalisable et hors-ligne désigné pour faire exactement ce qu\'un calendrier devrait faire. Aucune fonctionnalité compliquée, permissions inutiles et sans pubs ! - Que vous souhaitiez organiser un évènement ponctuel ou récurrent, un anniversaire, un rendez-vous d'affaires ou quoi que ce soit d\'autre, Simple Calendar Pro rend simple votre organisation. Avec une grande variété d\'options de personnalisation, vous pouvez personnaliser les rappels d\'évènements, les sons de notifications, les widgets du calendrier et à quoi l\'application ressemble. + Que vous souhaitiez organiser un évènement ponctuel ou récurrent, un anniversaire, un rendez-vous d\'affaires ou quoi que ce soit d\'autre, Simple Calendar Pro rend simple votre organisation. Avec une grande variété d\'options de personnalisation, vous pouvez personnaliser les rappels d\'évènements, les sons de notifications, les widgets du calendrier et à quoi l\'application ressemble. La vue journalière, semainière et mensuelle rend la vérification des évènements et rendez-vous à venir aisée. Vous pouvez même voir tous les évènements dans une simple liste plutôt que dans une vue calendrier, afin de savoir exactement ce qui va arriver dans votre vie et quand. @@ -263,7 +263,7 @@ ✔️ Aucune publicité ou popup ennuyante ✔️ Aucun accès à internet n\'est nécessaire, vous donnant un meilleur respect de la vie privée et de la sécurité ✔️ Seul le strict minimum en permissions est requis - ✔️ Emphase sur la simplicité - fait ce qu'un calendrier doit faire ! + ✔️ Emphase sur la simplicité - fait ce qu\'un calendrier doit faire ! ✔️ Open source ✔️ Thèmes et widgets entièrement personnalisables ✔️ Traduit en 29 langues @@ -277,7 +277,7 @@ ✔️ Personnalise les évènements - début, durée, rappels, etc. ✔️ Note les présences sur chaque évènement ✔️ Utilisable en tant que calendrier personnel ou professionnel - ✔️ Choisissez entre rappels et notifications par email pour vous alerter à propos d'un évènement + ✔️ Choisissez entre rappels et notifications par email pour vous alerter à propos d\'un évènement TÉLÉCHARGEZ SIMPLE CALENDAR PRO – LE CALENDRIER HORS-LIGNE SIMPLE ET SANS PUBS ! From 99bce79f3e54084faaca0e3e00a5a67c6e217672 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Oct 2020 12:13:10 +0100 Subject: [PATCH 124/144] fetch birthdays/anniversaries of private contacts in Simple Contacts Pro too --- .../calendar/pro/activities/MainActivity.kt | 116 +++++++++++++++--- 1 file changed, 98 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 1e0308b45..40567fdc0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -45,6 +45,7 @@ import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.commons.models.FAQItem import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.Release +import com.simplemobiletools.commons.models.SimpleContact import kotlinx.android.synthetic.main.activity_main.* import org.joda.time.DateTime import org.joda.time.DateTimeZone @@ -499,15 +500,20 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { if (it) { SetRemindersDialog(this) { val reminders = it + val privateCursor = getMyContactsCursor().loadInBackground() + ensureBackgroundThread { - addContactEvents(true, reminders) { - when { - it > 0 -> { - toast(R.string.birthdays_added) - updateViewPager() + val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + addPrivateEvents(true, privateContacts, reminders) { eventsFound, eventsAdded -> + addContactEvents(true, reminders, eventsFound, eventsAdded) { + when { + it > 0 -> { + toast(R.string.birthdays_added) + updateViewPager() + } + it == -1 -> toast(R.string.no_new_birthdays) + else -> toast(R.string.no_birthdays) } - it == -1 -> toast(R.string.no_new_birthdays) - else -> toast(R.string.no_birthdays) } } } @@ -523,15 +529,20 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { if (it) { SetRemindersDialog(this) { val reminders = it + val privateCursor = getMyContactsCursor().loadInBackground() + ensureBackgroundThread { - addContactEvents(false, reminders) { - when { - it > 0 -> { - toast(R.string.anniversaries_added) - updateViewPager() + val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + addPrivateEvents(false, privateContacts, reminders) { eventsFound, eventsAdded -> + addContactEvents(false, reminders, eventsFound, eventsAdded) { + when { + it > 0 -> { + toast(R.string.anniversaries_added) + updateViewPager() + } + it == -1 -> toast(R.string.no_new_anniversaries) + else -> toast(R.string.no_anniversaries) } - it == -1 -> toast(R.string.no_new_anniversaries) - else -> toast(R.string.no_anniversaries) } } } @@ -551,9 +562,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { }, Toast.LENGTH_LONG) } - private fun addContactEvents(birthdays: Boolean, reminders: ArrayList, callback: (Int) -> Unit) { - var eventsAdded = 0 - var eventsFound = 0 + private fun addContactEvents(birthdays: Boolean, reminders: ArrayList, initEventsFound: Int, initEventsAdded: Int, callback: (Int) -> Unit) { + var eventsFound = initEventsFound + var eventsAdded = initEventsAdded val uri = Data.CONTENT_URI val projection = arrayOf(Contacts.DISPLAY_NAME, CommonDataKinds.Event.CONTACT_ID, @@ -572,6 +583,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } val eventTypeId = if (birthdays) getBirthdaysEventTypeId() else getAnniversariesEventTypeId() + val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> val contactId = cursor.getIntValue(CommonDataKinds.Event.CONTACT_ID).toString() @@ -587,7 +599,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } val timestamp = date.time / 1000L - val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY val lastUpdated = cursor.getLongValue(CommonDataKinds.Event.CONTACT_LAST_UPDATED_TIMESTAMP) val event = Event(null, timestamp, timestamp, name, reminder1Minutes = reminders[0], reminder2Minutes = reminders[1], reminder3Minutes = reminders[2], importId = contactId, timeZone = DateTimeZone.getDefault().id, flags = FLAG_ALL_DAY, @@ -624,6 +635,75 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } } + private fun addPrivateEvents(birthdays: Boolean, contacts: ArrayList, reminders: ArrayList, callback: (eventsFound: Int, eventsAdded: Int) -> Unit) { + var eventsAdded = 0 + var eventsFound = 0 + if (contacts.isEmpty()) { + callback(0, 0) + return + } + + try { + val eventTypeId = if (birthdays) getBirthdaysEventTypeId() else getAnniversariesEventTypeId() + val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY + + val existingEvents = if (birthdays) eventsDB.getBirthdays() else eventsDB.getAnniversaries() + val importIDs = HashMap() + existingEvents.forEach { + importIDs[it.importId] = it.startTS + } + + contacts.forEach { contact -> + val events = if (birthdays) contact.birthdays else contact.anniversaries + events.forEach { birthdayAnniversary -> + // private contacts are created in Simple Contacts Pro, so we can guarantee that they exist only in these 2 formats + val format = if (birthdayAnniversary.startsWith("--")) { + "--MM-dd" + } else { + "yyyy-MM-dd" + } + + val formatter = SimpleDateFormat(format, Locale.getDefault()) + val date = formatter.parse(birthdayAnniversary) + if (date.year < 70) { + date.year = 70 + } + + val timestamp = date.time / 1000L + val lastUpdated = System.currentTimeMillis() + val event = Event(null, timestamp, timestamp, contact.name, reminder1Minutes = reminders[0], reminder2Minutes = reminders[1], + reminder3Minutes = reminders[2], importId = contact.contactId.toString(), timeZone = DateTimeZone.getDefault().id, flags = FLAG_ALL_DAY, + repeatInterval = YEAR, repeatRule = REPEAT_SAME_DAY, eventType = eventTypeId, source = source, lastUpdated = lastUpdated) + + val importIDsToDelete = ArrayList() + for ((key, value) in importIDs) { + if (key == contact.contactId.toString() && value != timestamp) { + val deleted = eventsDB.deleteBirthdayAnniversary(source, key) + if (deleted == 1) { + importIDsToDelete.add(key) + } + } + } + + importIDsToDelete.forEach { + importIDs.remove(it) + } + + eventsFound++ + if (!importIDs.containsKey(contact.contactId.toString())) { + eventsHelper.insertEvent(event, false, false) { + eventsAdded++ + } + } + } + } + } catch (e: Exception) { + showErrorToast(e) + } + + callback(eventsFound, eventsAdded) + } + private fun getBirthdaysEventTypeId(): Long { val birthdays = getString(R.string.birthdays) var eventTypeId = eventsHelper.getEventTypeIdWithTitle(birthdays) From 8fe6b537af90ce3c11532c39e013b22f400916fb Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Oct 2020 14:59:58 +0100 Subject: [PATCH 125/144] update version to 6.11.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ee9060967..d15a60b21 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 185 - versionName "6.11.0" + versionCode 186 + versionName "6.11.1" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 3b1187154c72e26a2a51ce340d9b970970ad4f8b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Oct 2020 15:00:05 +0100 Subject: [PATCH 126/144] updating changelog --- CHANGELOG.md | 6 ++++++ fastlane/metadata/android/en-US/changelogs/186.txt | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/186.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 589ba8b61..ffa3d1142 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 6.11.1 *(2020-10-28)* +---------------------------- + + * Fixed a glitch with some misplaced events on the weekly view + * Allow importing birthdays and anniversaries of contacts privately stored in Simple Contacts Pro + Version 6.11.0 *(2020-10-25)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/186.txt b/fastlane/metadata/android/en-US/changelogs/186.txt new file mode 100644 index 000000000..af6bce256 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/186.txt @@ -0,0 +1,2 @@ + * Fixed a glitch with some misplaced events on the weekly view + * Allow importing birthdays and anniversaries of contacts privately stored in Simple Contacts Pro From 0c04f8ddc6b766456a2189501bbf506e8d5d1a72 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 20:02:33 +0100 Subject: [PATCH 127/144] updating commons and gradle --- app/build.gradle | 2 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d15a60b21..8610609f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.31.12' + implementation 'com.simplemobiletools:commons:5.31.18' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' diff --git a/build.gradle b/build.gradle index 1677b79db..a1fa23748 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.2' + classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 87e513270..4a0ca69c0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jun 20 12:39:19 CEST 2020 +#Mon Nov 02 19:09:05 CET 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip From 098b945b5501dd6578745364b6a9d0ac9f6df13f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 20:10:25 +0100 Subject: [PATCH 128/144] lets fetch more events at the weekly view, rather than less --- .../calendar/pro/helpers/WeeklyCalendarImpl.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/WeeklyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/WeeklyCalendarImpl.kt index 467354a77..8e9d0b8f1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/WeeklyCalendarImpl.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/WeeklyCalendarImpl.kt @@ -4,6 +4,7 @@ import android.content.Context import com.simplemobiletools.calendar.pro.extensions.eventsHelper import com.simplemobiletools.calendar.pro.interfaces.WeeklyCalendar import com.simplemobiletools.calendar.pro.models.Event +import com.simplemobiletools.commons.helpers.DAY_SECONDS import com.simplemobiletools.commons.helpers.WEEK_SECONDS import java.util.* @@ -12,7 +13,7 @@ class WeeklyCalendarImpl(val callback: WeeklyCalendar, val context: Context) { fun updateWeeklyCalendar(weekStartTS: Long) { val endTS = weekStartTS + 2 * WEEK_SECONDS - context.eventsHelper.getEvents(weekStartTS, endTS) { + context.eventsHelper.getEvents(weekStartTS - DAY_SECONDS, endTS) { mEvents = it callback.updateWeeklyCalendar(it) } From 34139e40787b26d95f8bffb00ea1300040d2ba02 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 20:28:46 +0100 Subject: [PATCH 129/144] fixing some weekly view related glitches, rely on UTC dates --- .../simplemobiletools/calendar/pro/fragments/WeekFragment.kt | 4 ++-- .../com/simplemobiletools/calendar/pro/helpers/Formatter.kt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index af6b1a6c1..ae44730ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -197,14 +197,14 @@ class WeekFragment : Fragment(), WeeklyCalendar { mView.week_events_columns_holder.removeAllViews() (0 until config.weeklyViewDays).forEach { val column = inflater.inflate(R.layout.weekly_view_day_column, mView.week_events_columns_holder, false) as RelativeLayout - column.tag = Formatter.getDayCodeFromTS(weekTimestamp + it * DAY_SECONDS) + column.tag = Formatter.getUTCDayCodeFromTS(weekTimestamp + it * DAY_SECONDS) mView.week_events_columns_holder.addView(column) dayColumns.add(column) } } private fun setupDayLabels() { - var curDay = Formatter.getDateTimeFromTS(weekTimestamp) + var curDay = Formatter.getUTCDateTimeFromTS(weekTimestamp) val textColor = if (isPrintVersion) resources.getColor(R.color.theme_light_text_color) else config.textColor val todayCode = Formatter.getDayCodeFromDateTime(DateTime()) val screenWidth = context?.usableScreenSize?.x ?: return diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt index e24ffcf82..23cdef3de 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt @@ -108,5 +108,7 @@ object Formatter { } } + fun getUTCDayCodeFromTS(ts: Long) = getUTCDateTimeFromTS(ts).toString(DAYCODE_PATTERN) + fun getShiftedImportTimestamp(ts: Long) = getUTCDateTimeFromTS(ts).withTime(13, 0, 0, 0).withZoneRetainFields(DateTimeZone.getDefault()).seconds() } From 2f1eb1ddf5b5c8f34be3d4adfe529feb409eb6ad Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 20:41:40 +0100 Subject: [PATCH 130/144] fixing a glitch at creating new events at the weekly view --- .../simplemobiletools/calendar/pro/fragments/WeekFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index ae44730ba..9f88aced6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -30,6 +30,7 @@ import com.simplemobiletools.commons.views.MyTextView import kotlinx.android.synthetic.main.fragment_week.* import kotlinx.android.synthetic.main.fragment_week.view.* import org.joda.time.DateTime +import org.joda.time.DateTimeZone import org.joda.time.Days import java.util.* @@ -270,7 +271,8 @@ class WeekFragment : Fragment(), WeeklyCalendar { applyColorFilter(primaryColor.getContrastColor()) setOnClickListener { - val timestamp = weekTimestamp + index * DAY_SECONDS + hour * 60 * 60 + val offset = DateTimeZone.getDefault().getOffsetFromLocal(System.currentTimeMillis()) / 1000 + val timestamp = weekTimestamp - offset + index * DAY_SECONDS + hour * 60 * 60 Intent(context, EventActivity::class.java).apply { putExtra(NEW_EVENT_START_TS, timestamp) putExtra(NEW_EVENT_SET_HOUR_DURATION, true) From a87aec0eb61f061a768ea46be9b50b3b5401d1af Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 21:09:08 +0100 Subject: [PATCH 131/144] fix a couple more weekly view related offsets --- .../calendar/pro/activities/MainActivity.kt | 2 +- .../calendar/pro/fragments/WeekFragment.kt | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 40567fdc0..526aa497a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -787,7 +787,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { } private fun getThisWeekDateTime(): String { - var thisweek = DateTime().withZone(DateTimeZone.UTC).withDayOfWeek(1).withTimeAtStartOfDay().minusDays(if (config.isSundayFirst) 1 else 0) + var thisweek = DateTime().withZone(DateTimeZone.UTC).withDayOfWeek(1).withHourOfDay(12).minusDays(if (config.isSundayFirst) 1 else 0) if (DateTime().minusDays(7).seconds() > thisweek.seconds()) { thisweek = thisweek.plusDays(7) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 9f88aced6..2259c0682 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -30,7 +30,6 @@ import com.simplemobiletools.commons.views.MyTextView import kotlinx.android.synthetic.main.fragment_week.* import kotlinx.android.synthetic.main.fragment_week.view.* import org.joda.time.DateTime -import org.joda.time.DateTimeZone import org.joda.time.Days import java.util.* @@ -271,8 +270,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { applyColorFilter(primaryColor.getContrastColor()) setOnClickListener { - val offset = DateTimeZone.getDefault().getOffsetFromLocal(System.currentTimeMillis()) / 1000 - val timestamp = weekTimestamp - offset + index * DAY_SECONDS + hour * 60 * 60 + val timestamp = Formatter.getDateTimeFromTS(weekTimestamp + index * DAY_SECONDS).withTime(hour, 0, 0, 0).seconds() Intent(context, EventActivity::class.java).apply { putExtra(NEW_EVENT_START_TS, timestamp) putExtra(NEW_EVENT_SET_HOUR_DURATION, true) @@ -497,7 +495,8 @@ class WeekFragment : Fragment(), WeeklyCalendar { private fun addCurrentTimeIndicator(minuteHeight: Float) { if (todayColumnIndex != -1) { - val minutes = DateTime().minuteOfDay + val calendar = Calendar.getInstance() + val minutes = calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE) if (todayColumnIndex >= dayColumns.size) { currentTimeView?.alpha = 0f return From 4a2502fda71c2645b794e1c8c3b4066a28fff92b Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 21:51:43 +0100 Subject: [PATCH 132/144] update the current time indicator at weekly view more often --- .../calendar/pro/fragments/WeekFragment.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 2259c0682..a859c3b7d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt @@ -140,6 +140,10 @@ class WeekFragment : Fragment(), WeeklyCalendar { setupDayLabels() updateCalendar() + + if (rowHeight != 0f && mView.width != 0) { + addCurrentTimeIndicator() + } } override fun onPause() { @@ -379,8 +383,6 @@ class WeekFragment : Fragment(), WeeklyCalendar { val minimalHeight = res.getDimension(R.dimen.weekly_view_minimal_event_height).toInt() val density = Math.round(res.displayMetrics.density) - var hadAllDayEvent = false - for (event in events) { val startDateTime = Formatter.getDateTimeFromTS(event.startTS) val endDateTime = Formatter.getDateTimeFromTS(event.endTS) @@ -403,7 +405,6 @@ class WeekFragment : Fragment(), WeeklyCalendar { val startDateTime = Formatter.getDateTimeFromTS(event.startTS) val endDateTime = Formatter.getDateTimeFromTS(event.endTS) if (event.getIsAllDay() || Formatter.getDayCodeFromDateTime(startDateTime) != Formatter.getDayCodeFromDateTime(endDateTime)) { - hadAllDayEvent = true addAllDayEvent(event) } else { val dayCode = Formatter.getDayCodeFromDateTime(startDateTime) @@ -484,7 +485,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { } checkTopHolderHeight() - addCurrentTimeIndicator(minuteHeight) + addCurrentTimeIndicator() } private fun addNewLine() { @@ -493,7 +494,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { allDayHolders.add(allDaysLine) } - private fun addCurrentTimeIndicator(minuteHeight: Float) { + private fun addCurrentTimeIndicator() { if (todayColumnIndex != -1) { val calendar = Calendar.getInstance() val minutes = calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE) @@ -516,6 +517,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { mView.week_events_holder.addView(this, 0) val extraWidth = res.getDimension(R.dimen.activity_margin).toInt() val markerHeight = res.getDimension(R.dimen.weekly_view_now_height).toInt() + val minuteHeight = rowHeight / 60 (layoutParams as RelativeLayout.LayoutParams).apply { width = (mView.width / weeklyViewDays) + extraWidth height = markerHeight From 53b78ec0a959502f18e2b6d91dcf0ee19e50ff24 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 2 Nov 2020 22:05:36 +0100 Subject: [PATCH 133/144] use a bigger icon at Show Event On Map --- app/src/main/res/layout/activity_event.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_event.xml b/app/src/main/res/layout/activity_event.xml index f254dbeee..32f40d01b 100644 --- a/app/src/main/res/layout/activity_event.xml +++ b/app/src/main/res/layout/activity_event.xml @@ -44,15 +44,14 @@ Date: Mon, 2 Nov 2020 23:05:05 +0100 Subject: [PATCH 134/144] avoid always showing "Go to today" menu item at the list view --- .../calendar/pro/activities/MainActivity.kt | 3 ++- .../pro/fragments/EventListFragment.kt | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 526aa497a..a67a20a61 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -168,10 +168,11 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) + shouldGoToTodayBeVisible = currentFragments.last().shouldGoToTodayBeVisible() menu.apply { goToTodayButton = findItem(R.id.go_to_today) findItem(R.id.filter).isVisible = mShouldFilterBeVisible - findItem(R.id.go_to_today).isVisible = (shouldGoToTodayBeVisible || config.storedView == EVENTS_LIST_VIEW) && !mIsSearchOpen + findItem(R.id.go_to_today).isVisible = shouldGoToTodayBeVisible && !mIsSearchOpen findItem(R.id.go_to_date).isVisible = config.storedView != EVENTS_LIST_VIEW } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt index 3b409e8bc..bc5a614b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt @@ -8,6 +8,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.activities.EventActivity import com.simplemobiletools.calendar.pro.activities.MainActivity @@ -42,6 +43,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { private var minFetchedTS = 0L private var maxFetchedTS = 0L private var wereInitialEventsAdded = false + private var hasBeenScrolled = false private var bottomItemAtRefresh: ListItem? = null private var use24HourFormat = false @@ -134,6 +136,16 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { fetchNextPeriod() } } + + mView.calendar_events_list.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (!hasBeenScrolled) { + hasBeenScrolled = true + activity?.invalidateOptionsMenu() + } + } + }) } else { (currAdapter as EventListAdapter).updateListItems(listItems) if (updateStatus == UPDATE_TOP) { @@ -195,6 +207,10 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { val firstNonPastSectionIndex = listItems.indexOfFirst { it is ListSection && !it.isPastSection } if (firstNonPastSectionIndex != -1) { (mView.calendar_events_list.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(firstNonPastSectionIndex, 0) + mView.calendar_events_list.onGlobalLayout { + hasBeenScrolled = false + activity?.invalidateOptionsMenu() + } } } @@ -204,7 +220,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { checkEvents() } - override fun shouldGoToTodayBeVisible() = false + override fun shouldGoToTodayBeVisible() = hasBeenScrolled override fun updateActionBarTitle() { (activity as? MainActivity)?.updateActionBarTitle(getString(R.string.app_launcher_name)) From 199399bf293039f33bcf83da79dd2110d61973c8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 16:16:43 +0100 Subject: [PATCH 135/144] adding a new string for customizing the day count at weekly view --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-br/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-he/strings.xml | 1 + app/src/main/res/values-hi-rIN/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 1 + app/src/main/res/values-id/strings.xml | 1 + app/src/main/res/values-in/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-iw/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-lv/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-no/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ro/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 40 files changed, 40 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 6d5b7130c..e7fabe8c7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -158,6 +158,7 @@ إدارة أنواع الأحداث ابدأ اليوم عند نهاية الحدث + Allow customizing day count عرض أرقام الأسبوع إهتزاز عند الإشعار صوت التذكير diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a2e84f127..a04ac3846 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -158,6 +158,7 @@ Hadisə tiplərini idarə et Günə başla Günü bitir + Allow customizing day count Həftə günlərini göstər Xatırladıcı bildirişində vibrasiya et Xatırladıcı səsi diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 980c99082..7fc1655fa 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -162,6 +162,7 @@ ইভেন্ট টাইপ ম্যানেজ করুন দিনের শুরু দিনের শেষ + Allow customizing day count সপ্তাহের সংখ্যাগুলি দেখান রিমাইন্ডার নোটিফিকেশনে ভাইব্রেট করো রিমাইন্ডারের শব্দ diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 6028ea48a..ca938ae72 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -158,6 +158,7 @@ Merañ an doareoù darvoudoù Kregiñ an devezh da Echuiñ an devezh da + Allow customizing day count Diskouez niverennoù ar sizhun Froumal evit ar rebuzadurioù adc\'halv Soniri adc\'halv diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index eb13e8002..90f9aafce 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -158,6 +158,7 @@ Správa typů událostí Počátek dne Konec dne + Allow customizing day count Zobrazovat čísla týdnů Vibrovat při připomínce Zvuk připomínky diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index eec9d14bf..07f19a21c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -158,6 +158,7 @@ Håndter begivenhedstyper Start dagen kl. Slut dagen kl. + Allow customizing day count Vis ugenumre Vibrer under påmindelser Lyd til påmindelser diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d04efbe6e..fa9dcb240 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -158,6 +158,7 @@ Termintypen verwalten Wochenansicht beginnt um Wochenansicht endet um + Allow customizing day count Kalenderwoche anzeigen Vibration bei Erinnerung Erinnerungston diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c2cad7602..17aaf8595 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -158,6 +158,7 @@ Διαχείριση τύπων εκδηλώσεων Ημέρα έναρξης την Ημέρα λήξης την + Allow customizing day count Εμφάνιση αριθμών εβδομάδων Δόνηση στην ειδοποίηση υπενθύμισης Ήχος υπενθύμισης diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ba7f2e777..aaaa42af2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -158,6 +158,7 @@ Gestionar tipos de eventos El día en la vista semanal comienza a las El día en la vista semanal finaliza a las + Allow customizing day count Mostrar los números de la semana Vibración en notificación de recordatorio Sonido de recordatorio diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index bc8c9933f..4366c26c8 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -158,6 +158,7 @@ Kudeatu gertaera motak Eguna noiz hasi Eguna noiz bukatu + Allow customizing day count Erakutsi asteen zenbakiak Bibratu abisuen jakinarazpenetan Abisuen soinua diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 463323b69..d0acece1b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -159,6 +159,7 @@ Gestion des types d\’événements Jour de début de la vue hebdomadaire Jour de fin de la vue hebdomadaire + Allow customizing day count Afficher les numéros de semaine Vibrer à la notification de rappel Son de rappel diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 5ba1ce4cc..c8a0c209b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -158,6 +158,7 @@ Xestionar tipos de eventos Na vista xeral o día comeza as O día na vista semanal remata as + Allow customizing day count Mostrar os números da semana Vibrar coa notificación de recordatorio Son de recordatorio diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 34d791cac..256bf38dc 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -158,6 +158,7 @@ נהל סוגי אירועים שעת התחלה היום שעת סיום היום + Allow customizing day count הצגת מספרי שבועות רטט בהתרעת תזכורת צליל תזכורת diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index f2bfbfa43..b31266aa2 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -158,6 +158,7 @@ Manage event types Start day at End day at + Allow customizing day count सफ्ताह क्रमांक दिखाए Vibrate on reminder notification Reminder sound diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index b1ee79f74..f1f5da8e8 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -158,6 +158,7 @@ Upravljanje vrstama događaja Započni dan u Završi dan u + Allow customizing day count Pokaži tjedne brojeve Vibrirajte na obavijesti podsjetnika Zvuk podsjetnika diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6f73d50bb..5d72ff52f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -158,6 +158,7 @@ Manage event types Start day at End day at + Allow customizing day count Hetek sorszámának mutatása Emlékeztetőnél rezgés Reminder sound diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 407e705da..d662a9025 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -158,6 +158,7 @@ Kelola kategori acara Hari dimulai pada jam Hari berakhir pada jam + Allow customizing day count Tampilkan nomor minggu Getar pada notifikasi pengingat Suara pengingat diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 407e705da..d662a9025 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -158,6 +158,7 @@ Kelola kategori acara Hari dimulai pada jam Hari berakhir pada jam + Allow customizing day count Tampilkan nomor minggu Getar pada notifikasi pengingat Suara pengingat diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a8d205cda..3f41a909a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -158,6 +158,7 @@ Gestisci i tipi di evento Il giorno inizia alle Il giorno finisce alle + Allow customizing day count Mostra numero settimane Vibra per le notifiche di promemoria Suoneria promemoria diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 7f5a8b08f..e51e5ce42 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -158,6 +158,7 @@ נהל סוגי אירועים שעת התחלה היום שעת סיום היום + Allow customizing day count הצגת מספרי שבועות רטט בהתרעת תזכורת צליל תזכורת diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 53843a8c1..143d81750 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -158,6 +158,7 @@ 予定の種類を管理 Start day at End day at + Allow customizing day count 週番号を表示 リマインダー通知で振動 Reminder sound diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 18c83bbf2..4676d070d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -158,6 +158,7 @@ 일정 유형 관리 시작 시간 종료 시간 + Allow customizing day count 주 번호 표시 알림 시 진동 알림 소리 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6e2538110..f90c06360 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -158,6 +158,7 @@ Tvarkyti įvykių tipus Pradėti dieną nuo Užbaigti dieną nuo + Allow customizing day count Rodyti savaičių numerius Vibruoti per priminimo pranešimą Priminimo garsas diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index b96b73b82..b659506d2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -158,6 +158,7 @@ Notikumu tipu pārvaldība Sākt dienu plkst. Beigt dienu plkst. + Allow customizing day count Rādīt nedēļu kārtas skaitļus Atgādināt, vibrējot Atgādināt ar skaņu diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index fb19ceee4..12a40231f 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -158,6 +158,7 @@ Behandle hendelsestyper Start dag kl. Avslutt dag kl. + Allow customizing day count Vis ukenummer Vibrer ved påminnelsesvarsel Påminnelseslyd diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 39e73c688..3fce17c65 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -158,6 +158,7 @@ Afspraaktypes beheren Dag starten om Dag beëindigen om + Allow customizing day count Weeknummers tonen Trillen bij notificaties Geluid voor herinnering diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml index 77c2d96ae..f1cb3a5f9 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -158,6 +158,7 @@ Behandle hendelsestyper Start dag kl. Avslutt dag kl. + Allow customizing day count Vis ukenummer Vibrer ved påminnelsesvarsel Påminnelseslyd diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a1a91e2f3..4b1c7edf2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -158,6 +158,7 @@ Zarządzaj typami wydarzeń Początek dnia Koniec dnia + Allow customizing day count Pokazuj numery tygodnia Powiadamiaj wibracjami o wydarzeniu Dźwięk powiadomień diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e2d7afede..96cc76d29 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -158,6 +158,7 @@ Gerenciar tipos de eventos Iniciar vista semanal em Terminar vista semanal em + Allow customizing day count Mostrar número das semanas Vibrar ao notificar sobre o lembrete Som do lembrete diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 90c93fa3b..af5dbecf7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -158,6 +158,7 @@ Gerir tipos de eventos Iniciar vista semanal em Terminar vista semanal em + Allow customizing day count Mostrar número das semanas Vibrar ao notificar sobre o lembrete Som do lembrete diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 76847efa0..4025b8f56 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -158,6 +158,7 @@ Gestionează tipurile de evenimente Începe ziua la Ziua se termină la + Allow customizing day count Afișează numerele săptămânii Vibrați la notificarea de reamintire Sunetul reamintiri diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e1ee1a450..2ae7673df 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -158,6 +158,7 @@ Управление типами событий Начало дня (неделя) Окончание дня (неделя) + Allow customizing day count Показывать номера недель Вибрация при напоминании Звук напоминания diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1089a03fc..288c47cf2 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -158,6 +158,7 @@ Spravovať typy udalostí Začať deň o Ukončiť deň o + Povoliť zmenu počtu dní Zobraziť čísla týždňov Vibrovať pri pripomienke Zvučka pripomienky diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a425842c7..2381de577 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -158,6 +158,7 @@ Hantera händelsetyper Dagen börjar Dagen slutar + Allow customizing day count Visa veckonummer Vibrera vid påminnelseaviseringar Påminnelseljud diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6ea9409dc..2650bb4d6 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -158,6 +158,7 @@ Etkinlik türlerini yönet Gün başlangıcı Gün bitişi + Allow customizing day count Hafta sayılarını göster Hatırlatma bildiriminde titre Hatırlatma sesi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2614a9874..3d5a1011c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -158,6 +158,7 @@ Керувати типами подій Огляд тижня починати Огляд тижня завершувати + Allow customizing day count Нумерувати тижні Вібрувати при настанні події Мелодія нагадування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9b0c5212c..feab4fd63 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -158,6 +158,7 @@     管理活动类型     每日开始于     每日结束于 + Allow customizing day count     显示第几周     提醒通知时震动     ​​提醒音效 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index bf32f8ef1..e4cbaa6c4 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -158,6 +158,7 @@ 管理活動類型 每日開始於 每日結束於 + Allow customizing day count 顯示第幾週 提醒通知時震動 提醒音效 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 01aedd16d..b22bb56f9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -158,6 +158,7 @@ 管理活動類型 每日開始於 每日結束於 + Allow customizing day count 顯示第幾週 提醒通知時震動 提醒音效 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3699b4f9a..bc1021ea1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -158,6 +158,7 @@ Manage event types Start day at End day at + Allow customizing day count Show week numbers Vibrate on reminder notification Reminder sound From ac37c1998cd87240e1f692d0a2bf3cf4094a3ceb Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 16:35:09 +0100 Subject: [PATCH 136/144] properly fetch the current hour of the day, even with changed time zone --- .../com/simplemobiletools/calendar/pro/extensions/Context.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt index 566b3ca86..f123326bb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt @@ -37,8 +37,6 @@ import com.simplemobiletools.calendar.pro.receivers.NotificationReceiver import com.simplemobiletools.calendar.pro.services.SnoozeService import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* -import org.joda.time.DateTime -import org.joda.time.DateTimeZone import org.joda.time.LocalDate import java.util.* @@ -342,8 +340,9 @@ fun Context.launchNewEventIntent(dayCode: String = Formatter.getTodayCode()) { } fun Context.getNewEventTimestampFromCode(dayCode: String): Long { + val calendar = Calendar.getInstance() val defaultStartTime = config.defaultStartTime - val currHour = DateTime(System.currentTimeMillis(), DateTimeZone.getDefault()).hourOfDay + val currHour = calendar.get(Calendar.HOUR_OF_DAY) var dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(currHour) var newDateTime = dateTime.plusHours(1).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0) From 30844320dc6b4aa2bedb85c38d34c127ea71b5b6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 17:23:53 +0100 Subject: [PATCH 137/144] make sure the Event List placeholder text isnt colored wrong --- app/build.gradle | 2 +- app/src/main/res/layout/fragment_event_list.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8610609f9..e56facab7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.31.18' + implementation 'com.simplemobiletools:commons:5.31.20' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' diff --git a/app/src/main/res/layout/fragment_event_list.xml b/app/src/main/res/layout/fragment_event_list.xml index 12c629e6c..a580b5a78 100644 --- a/app/src/main/res/layout/fragment_event_list.xml +++ b/app/src/main/res/layout/fragment_event_list.xml @@ -31,7 +31,7 @@ android:textStyle="italic" android:visibility="gone" /> - Date: Tue, 3 Nov 2020 17:25:52 +0100 Subject: [PATCH 138/144] removin the title of "Filter events by type" dialog --- .../calendar/pro/dialogs/FilterEventTypesDialog.kt | 10 +++++----- app/src/main/res/layout/dialog_filter_event_types.xml | 7 +++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/FilterEventTypesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/FilterEventTypesDialog.kt index 63ba012fc..3ca3fd01e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/FilterEventTypesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/FilterEventTypesDialog.kt @@ -19,11 +19,11 @@ class FilterEventTypesDialog(val activity: SimpleActivity, val callback: () -> U view.filter_event_types_list.adapter = FilterEventTypeAdapter(activity, it, displayEventTypes) dialog = AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmEventTypes() } - .setNegativeButton(R.string.cancel, null) - .create().apply { - activity.setupDialogStuff(view, this, R.string.filter_events_by_type) - } + .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmEventTypes() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } } } diff --git a/app/src/main/res/layout/dialog_filter_event_types.xml b/app/src/main/res/layout/dialog_filter_event_types.xml index 5c55d9105..83d7090a7 100644 --- a/app/src/main/res/layout/dialog_filter_event_types.xml +++ b/app/src/main/res/layout/dialog_filter_event_types.xml @@ -1,11 +1,10 @@ - + android:paddingTop="@dimen/activity_margin" + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> From 499cf50c4c71255eb858351110cb323fdf95cc57 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 17:32:46 +0100 Subject: [PATCH 139/144] avoid crashing at attempting to print an empty event list view --- .../calendar/pro/fragments/EventListFragment.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt index bc5a614b6..0c018af26 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt @@ -230,6 +230,11 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { override fun printView() { mView.apply { + if (calendar_events_list.isGone()) { + context.toast(R.string.no_items_found) + return@apply + } + (calendar_events_list.adapter as? EventListAdapter)?.togglePrintMode() Handler().postDelayed({ context!!.printBitmap(calendar_events_list.getViewBitmap()) From 711a26dbfc43ef35022d7864e52abd0ccaab3d05 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 17:36:30 +0100 Subject: [PATCH 140/144] avoid fetching event attendees on the main thread --- .../calendar/pro/activities/EventActivity.kt | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt index 12a71fe2d..bf1e0e800 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt @@ -528,9 +528,7 @@ class EventActivity : SimpleActivity() { private fun checkAttendees() { ensureBackgroundThread { fillAvailableContacts() - runOnUiThread { - updateAttendees() - } + updateAttendees() } } @@ -1357,22 +1355,24 @@ class EventActivity : SimpleActivity() { { it.status }) mAttendees.reverse() - mAttendees.forEach { - val attendee = it - val deviceContact = mAvailableContacts.firstOrNull { it.email.isNotEmpty() && it.email == attendee.email && it.photoUri.isNotEmpty() } - if (deviceContact != null) { - attendee.photoUri = deviceContact.photoUri + runOnUiThread { + mAttendees.forEach { + val attendee = it + val deviceContact = mAvailableContacts.firstOrNull { it.email.isNotEmpty() && it.email == attendee.email && it.photoUri.isNotEmpty() } + if (deviceContact != null) { + attendee.photoUri = deviceContact.photoUri + } + addAttendee(attendee) } - addAttendee(attendee) - } - addAttendee() + addAttendee() - val imageHeight = event_repetition_image.height - if (imageHeight > 0) { - event_attendees_image.layoutParams.height = imageHeight - } else { - event_repetition_image.onGlobalLayout { - event_attendees_image.layoutParams.height = event_repetition_image.height + val imageHeight = event_repetition_image.height + if (imageHeight > 0) { + event_attendees_image.layoutParams.height = imageHeight + } else { + event_repetition_image.onGlobalLayout { + event_attendees_image.layoutParams.height = event_repetition_image.height + } } } } From 7b1e130d56a7fd6cad0aade67bf90760feeaedeb Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 23:11:48 +0100 Subject: [PATCH 141/144] making a function private --- .../simplemobiletools/calendar/pro/activities/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index a67a20a61..71ae939d2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt @@ -427,7 +427,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { currentFragments.last().showGoToDateDialog() } - fun printView() { + private fun printView() { currentFragments.last().printView() } From f9658bf7ac0bfb7525c699e4f062965df3ebcbb6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 23:15:48 +0100 Subject: [PATCH 142/144] updating commons to 5.31.23 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e56facab7..c50ed6ca6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.31.20' + implementation 'com.simplemobiletools:commons:5.31.23' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1' From 69300c7913394b03a3222bd3f2e6ac47c6eb5dca Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 23:20:43 +0100 Subject: [PATCH 143/144] update version to 6.11.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c50ed6ca6..808e9867f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.simplemobiletools.calendar.pro" minSdkVersion 21 targetSdkVersion 29 - versionCode 186 - versionName "6.11.1" + versionCode 187 + versionName "6.11.2" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true From 0cc4e9a532728a03b3a203fe8b5d468b4e9da42c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 3 Nov 2020 23:20:51 +0100 Subject: [PATCH 144/144] updating changelog --- CHANGELOG.md | 7 +++++++ fastlane/metadata/android/en-US/changelogs/187.txt | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/187.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index ffa3d1142..b52701e23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.11.2 *(2020-11-03)* +---------------------------- + + * Fixed some weekly view related glitches + * Do not always show "Go to today" at the Event list view + * Added some other UX, translation and stability improvements + Version 6.11.1 *(2020-10-28)* ---------------------------- diff --git a/fastlane/metadata/android/en-US/changelogs/187.txt b/fastlane/metadata/android/en-US/changelogs/187.txt new file mode 100644 index 000000000..6a459f57a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/187.txt @@ -0,0 +1,3 @@ + * Fixed some weekly view related glitches + * Do not always show "Go to today" at the Event list view + * Added some other UX, translation and stability improvements