diff --git a/CHANGELOG.md b/CHANGELOG.md index d1f23cd8b..b52701e23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,80 @@ 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)* +---------------------------- + + * 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)* +---------------------------- + + * Added Print support + * Added some stability and translation improvements + +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)* +---------------------------- + + * Adding a crashfix + +Version 6.10.1 *(2020-09-19)* +---------------------------- + + * Adding some translation and UX improvements + +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)* +---------------------------- + + * Fixed some weekly view related glitches + * Added some stability and translation improvements + +Version 6.9.6 *(2020-06-12)* +---------------------------- + + * Fixing a glitch with zoomed out weekly view + +Version 6.9.5 *(2020-06-10)* +---------------------------- + + * Allow changing the amount of days shown at the weekly view + * Show a Save / Discard prompt at leaving an edited event (by fnrngg) + * Some translation and stability improvements + +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)* +---------------------------- + + * 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/app/build.gradle b/app/build.gradle index e9bcb4f5e..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 175 - versionName "6.9.2" + versionCode 187 + versionName "6.11.2" multiDexEnabled true setProperty("archivesBaseName", "calendar") vectorDrawables.useSupportLibrary = true @@ -64,10 +64,12 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.27.5' + 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.0-beta4' + 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/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/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 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 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..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 @@ -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.* @@ -78,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 @@ -87,6 +89,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 @@ -230,6 +234,7 @@ class EventActivity : SimpleActivity() { menu.findItem(R.id.share).isVisible = mEvent.id != null menu.findItem(R.id.duplicate).isVisible = mEvent.id != null } + updateMenuItemColors(menu) return true } @@ -245,6 +250,74 @@ class EventActivity : SimpleActivity() { return true } + private fun getStartEndTimes(): Pair { + val offset = if (!config.allowChangingTimeZones || mEvent.getTimeZoneString().equals(mOriginalTimeZone, true)) { + 0 + } else { + val original = if (mOriginalTimeZone.isEmpty()) DateTimeZone.getDefault().id else mOriginalTimeZone + (DateTimeZone.forID(mEvent.getTimeZoneString()).getOffset(System.currentTimeMillis()) - DateTimeZone.forID(original).getOffset(System.currentTimeMillis())) / 1000L + } + + val newStartTS = mEventStartDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds() - offset + val newEndTS = mEventEndDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds() - offset + return Pair(newStartTS, newEndTS) + } + + private fun getReminders(): ArrayList { + var reminders = arrayListOf( + Reminder(mReminder1Minutes, mReminder1Type), + Reminder(mReminder2Minutes, mReminder2Type), + Reminder(mReminder3Minutes, mReminder3Type) + ) + reminders = reminders.filter { it.minutes != REMINDER_OFF }.sortedBy { it.minutes }.toMutableList() as ArrayList + return reminders + } + + private fun isEventChanged(): Boolean { + var newStartTS: Long + var newEndTS: Long + getStartEndTimes().apply { + newStartTS = first + 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 || + event_time_zone.text != mEvent.getTimeZoneString() || + reminders != mEvent.getReminders() || + mRepeatInterval != mEvent.repeatInterval || + mRepeatRule != mEvent.repeatRule || + mEventTypeId != mEvent.eventType || + hasTimeChanged) { + return true + } + + return false + } + + override fun onBackPressed() { + 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() + } else { + super.onBackPressed() + } + } + } else { + super.onBackPressed() + } + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) if (!mWasActivityInitialized) { @@ -301,8 +374,8 @@ class EventActivity : SimpleActivity() { mRepeatRule = getInt(REPEAT_RULE) mRepeatLimit = getLong(REPEAT_LIMIT) - mAttendees = Gson().fromJson>(getString(ATTENDEES), object : TypeToken>() {}.type) - ?: ArrayList() + val token = object : TypeToken>() {}.type + mAttendees = Gson().fromJson>(getString(ATTENDEES), token) ?: ArrayList() mEventTypeId = getLong(EVENT_TYPE_ID) mEventCalendarId = getInt(EVENT_CALENDAR_ID) @@ -337,6 +410,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 @@ -369,11 +445,35 @@ class EventActivity : SimpleActivity() { mRepeatRule = mEvent.repeatRule mEventTypeId = mEvent.eventType mEventCalendarId = mEvent.getCalDAVCalendarId() - mAttendees = Gson().fromJson>(mEvent.attendees, object : TypeToken>() {}.type) ?: ArrayList() + + val token = object : TypeToken>() {}.type + mAttendees = Gson().fromJson>(mEvent.attendees, token) ?: ArrayList() + checkRepeatTexts(mRepeatInterval) 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() @@ -421,16 +521,14 @@ class EventActivity : SimpleActivity() { } mEventEndDateTime = mEventStartDateTime.plusMinutes(addMinutes) } - + addDefValuesToNewEvent() checkAttendees() } private fun checkAttendees() { ensureBackgroundThread { fillAvailableContacts() - runOnUiThread { - updateAttendees() - } + updateAttendees() } } @@ -808,8 +906,7 @@ class EventActivity : SimpleActivity() { private fun getCalendarId() = if (mEvent.source == SOURCE_SIMPLE_CALENDAR) config.lastUsedCaldavCalendarId else mEvent.getCalDAVCalendarId() - private fun getCalendarWithId(calendars: List, calendarId: Int): CalDAVCalendar? = - calendars.firstOrNull { it.id == calendarId } + private fun getCalendarWithId(calendars: List, calendarId: Int) = calendars.firstOrNull { it.id == calendarId } private fun updateCurrentCalendarInfo(currentCalendar: CalDAVCalendar?) { event_type_image.beVisibleIf(currentCalendar == null) @@ -918,16 +1015,13 @@ class EventActivity : SimpleActivity() { return } - val offset = if (!config.allowChangingTimeZones || mEvent.getTimeZoneString().equals(mOriginalTimeZone, true)) { - 0 - } else { - val original = if (mOriginalTimeZone.isEmpty()) DateTimeZone.getDefault().id else mOriginalTimeZone - (DateTimeZone.forID(mEvent.getTimeZoneString()).getOffset(System.currentTimeMillis()) - DateTimeZone.forID(original).getOffset(System.currentTimeMillis())) / 1000L + var newStartTS: Long + var newEndTS: Long + getStartEndTimes().apply { + newStartTS = first + newEndTS = second } - val newStartTS = mEventStartDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds() - offset - val newEndTS = mEventEndDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds() - offset - if (newStartTS > newEndTS) { toast(R.string.end_before_start) return @@ -935,7 +1029,11 @@ class EventActivity : SimpleActivity() { val wasRepeatable = mEvent.repeatInterval > 0 val oldSource = mEvent.source - val newImportId = if (mEvent.id != null) mEvent.importId else UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis().toString() + val newImportId = if (mEvent.id != null) { + mEvent.importId + } else { + UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis().toString() + } val newEventType = if (!config.caldavSync || config.lastUsedCaldavCalendarId == 0 || mEventCalendarId == STORED_LOCALLY_ONLY) { mEventTypeId @@ -959,13 +1057,7 @@ class EventActivity : SimpleActivity() { "$CALDAV-$mEventCalendarId" } - var reminders = arrayListOf( - Reminder(mReminder1Minutes, mReminder1Type), - Reminder(mReminder2Minutes, mReminder2Type), - Reminder(mReminder3Minutes, mReminder3Type) - ) - reminders = reminders.filter { it.minutes != REMINDER_OFF }.sortedBy { it.minutes }.toMutableList() as ArrayList - + val reminders = getReminders() val reminder1 = reminders.getOrNull(0) ?: Reminder(REMINDER_OFF, REMINDER_NOTIFICATION) val reminder2 = reminders.getOrNull(1) ?: Reminder(REMINDER_OFF, REMINDER_NOTIFICATION) val reminder3 = reminders.getOrNull(2) ?: Reminder(REMINDER_OFF, REMINDER_NOTIFICATION) @@ -1011,7 +1103,6 @@ class EventActivity : SimpleActivity() { eventsHelper.deleteEvent(mEvent.id!!, true) mEvent.id = null } - storeEvent(wasRepeatable) } @@ -1264,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 + } } } } @@ -1351,7 +1444,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/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt index 93e076112..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 @@ -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 @@ -46,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 @@ -83,15 +83,12 @@ 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()) } 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 @@ -150,7 +147,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { search_holder.background = ColorDrawable(config.backgroundColor) checkSwipeRefreshAvailability() checkShortcuts() - invalidateOptionsMenu() + + if (!mIsSearchOpen) { + invalidateOptionsMenu() + } } override fun onPause() { @@ -158,11 +158,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { storeStateVariables() } - override fun onStop() { - super.onStop() - closeSearch() - } - override fun onDestroy() { super.onDestroy() if (!isChangingConfigurations) { @@ -173,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 } @@ -198,6 +194,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() @@ -283,7 +280,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 } @@ -414,10 +411,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() } @@ -431,6 +427,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { currentFragments.last().showGoToDateDialog() } + private fun printView() { + currentFragments.last().printView() + } + private fun resetActionBarTitle() { updateActionBarTitle(getString(R.string.app_launcher_name)) updateActionBarSubtitle("") @@ -501,15 +501,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) } } } @@ -525,15 +530,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) } } } @@ -553,9 +563,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, @@ -574,6 +584,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() @@ -589,7 +600,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, @@ -626,6 +636,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) @@ -647,7 +726,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() @@ -709,7 +788,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).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/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 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/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, p mFragments[pos + i]?.updateCalendar() } } + + fun printCurrentView(pos: Int) { + mFragments[pos].printCurrentView() + } } 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/adapters/MyWeekPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt index 1f5379cba..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 @@ -8,6 +8,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter import com.simplemobiletools.calendar.pro.fragments.WeekFragment import com.simplemobiletools.calendar.pro.helpers.WEEK_START_TIMESTAMP import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener +import com.simplemobiletools.commons.helpers.DAY_SECONDS class MyWeekPagerAdapter(fm: FragmentManager, private val mWeekTimestamps: List, private val mListener: WeekFragmentListener) : FragmentStatePagerAdapter(fm) { private val mFragments = SparseArray() @@ -42,4 +43,17 @@ class MyWeekPagerAdapter(fm: FragmentManager, private val mWeekTimestamps: List< mFragments[pos - 1]?.updateNotVisibleViewScaleLevel() mFragments[pos + 1]?.updateNotVisibleViewScaleLevel() } + + fun updateVisibleDaysCount(pos: Int, count: Int, currentWeekTimestamp: Long) { + mFragments[pos - 1]?.updateWeekStartTimestamp(currentWeekTimestamp - count * DAY_SECONDS) + mFragments[pos + 1]?.updateWeekStartTimestamp(currentWeekTimestamp + count * DAY_SECONDS) + + for (i in -1..1) { + mFragments[pos + i]?.updateVisibleDaysCount(count) + } + } + + fun togglePrintMode(pos: Int) { + mFragments[pos].togglePrintMode() + } } 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/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/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) } 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..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 @@ -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 @@ -34,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.* @@ -339,20 +340,23 @@ 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) - 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) @@ -542,3 +546,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/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/DayFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/DayFragment.kt index 78493ebc9..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 @@ -14,6 +15,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 +24,8 @@ 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 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() + + Handler().postDelayed({ + context!!.printBitmap(day_holder.getViewBitmap()) + + Handler().postDelayed({ + top_left_arrow.beVisible() + top_right_arrow.beVisible() + top_value.setTextColor(context!!.config.textColor) + (day_events.adapter as? DayEventsAdapter)?.togglePrintMode() + }, 1000) + }, 1000) + } + } } 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..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 @@ -138,4 +138,8 @@ class DayFragmentsHolder : MyFragmentHolder(), NavigationListener { } override fun getNewEventDayCode() = currentDayCode + + override fun printView() { + (viewPager?.adapter as? MyDayPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } 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..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 @@ -3,10 +3,12 @@ package com.simplemobiletools.calendar.pro.fragments import android.content.Intent 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 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 @@ -41,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 @@ -133,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) { @@ -194,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() + } } } @@ -203,11 +220,29 @@ 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)) } override fun getNewEventDayCode() = Formatter.getTodayCode() + + 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()) + + Handler().postDelayed({ + (calendar_events_list.adapter as? EventListAdapter)?.togglePrintMode() + }, 1000) + }, 1000) + } + } } 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..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 @@ -11,6 +11,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.Config import com.simplemobiletools.calendar.pro.helpers.DAY_CODE import com.simplemobiletools.calendar.pro.helpers.Formatter @@ -19,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 @@ -142,4 +146,20 @@ class MonthFragment : Fragment(), MonthlyCalendar { (activity as MainActivity).openDayFromMonthly(Formatter.getDateTimeFromCode(it.code)) } } + + fun printCurrentView() { + mHolder.apply { + top_left_arrow.beGone() + top_right_arrow.beGone() + top_value.setTextColor(resources.getColor(R.color.theme_light_text_color)) + 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/fragments/MonthFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/MonthFragmentsHolder.kt index e9eebd787..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 @@ -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,8 @@ class MonthFragmentsHolder : MyFragmentHolder(), NavigationListener { } override fun getNewEventDayCode() = if (shouldGoToTodayBeVisible()) currentDayCode else todayDayCode + + override fun printView() { + (viewPager?.adapter as? MyMonthPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } 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/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt index 01aa3237b..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 @@ -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 @@ -25,6 +26,7 @@ import com.simplemobiletools.calendar.pro.views.MyScrollView import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.DAY_SECONDS import com.simplemobiletools.commons.helpers.WEEK_SECONDS +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 @@ -56,11 +58,14 @@ 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() private var allDayHolders = ArrayList() private var allDayRows = ArrayList>() private var currEvents = ArrayList() + private var dayColumns = ArrayList() private var eventTypeColors = LongSparseArray() private var eventTimeRanges = LinkedHashMap>() @@ -105,6 +110,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } + addDayColumns() scrollView.setOnScrollviewListener(object : MyScrollView.ScrollViewListener { override fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int) { checkScrollLimits(y) @@ -113,7 +119,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { scrollView.onGlobalLayout { if (fullHeight < scrollView.height) { - scrollView.layoutParams.height = fullHeight - context!!.resources.getDimension(R.dimen.one_dp).toInt() + scrollView.layoutParams.height = fullHeight - res.getDimension(R.dimen.one_dp).toInt() } val initialScrollY = (rowHeight * config.startWeeklyAt).toInt() @@ -134,6 +140,10 @@ class WeekFragment : Fragment(), WeeklyCalendar { setupDayLabels() updateCalendar() + + if (rowHeight != 0f && mView.width != 0) { + addCurrentTimeIndicator() + } } override fun onPause() { @@ -153,7 +163,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { listener?.updateHoursTopMargin(mView.week_top_holder.height) checkScrollLimits(scrollView.scrollY) - // fix some glitches like at swiping from a fully scaled out fragment will all-day events to an empty one + // fix some glitches like at swiping from a fully scaled out fragment with all-day events to an empty one val fullFragmentHeight = (listener?.getFullFragmentHeight() ?: 0) - mView.week_top_holder.height if (scrollView.height < fullFragmentHeight) { config.weeklyViewItemHeightMultiplier = fullFragmentHeight / 24 / defaultRowHeight @@ -164,25 +174,67 @@ class WeekFragment : Fragment(), WeeklyCalendar { } fun updateCalendar() { - WeeklyCalendarImpl(this, context!!).updateWeeklyCalendar(weekTimestamp) + if (context != null) { + WeeklyCalendarImpl(this, context!!).updateWeeklyCalendar(weekTimestamp) + } + } + + fun updateVisibleDaysCount(count: Int) { + dayColumns.clear() + addDayColumns() + + mView.week_horizontal_grid_holder.apply { + daysCount = count + invalidate() + } + + addEvents(currEvents) + setupDayLabels() + } + + fun updateWeekStartTimestamp(newTimestamp: Long) { + weekTimestamp = newTimestamp + updateCalendar() + } + + private fun addDayColumns() { + 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.getUTCDayCodeFromTS(weekTimestamp + it * DAY_SECONDS) + mView.week_events_columns_holder.addView(column) + dayColumns.add(column) + } } private fun setupDayLabels() { - var curDay = Formatter.getDateTimeFromTS(weekTimestamp) - val textColor = config.textColor + 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()) - for (i in 0..6) { + val screenWidth = context?.usableScreenSize?.x ?: return + val dayWidth = screenWidth / config.weeklyViewDays + val useLongerDayLabels = dayWidth > res.getDimension(R.dimen.weekly_view_min_day_label) + + mView.week_letters_holder.removeAllViews() + for (i in 0 until config.weeklyViewDays) { val dayCode = Formatter.getDayCodeFromDateTime(curDay) - val dayLetters = res.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList + val labelIDs = if (useLongerDayLabels) { + R.array.week_days_short + } else { + R.array.week_day_letters + } + + val dayLetters = res.getStringArray(labelIDs).toMutableList() as ArrayList val dayLetter = dayLetters[curDay.dayOfWeek - 1] - mView.findViewById(res.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply { - text = "$dayLetter\n${curDay.dayOfMonth}" - setTextColor(if (todayCode == dayCode) primaryColor else textColor) - if (todayCode == dayCode) { - todayColumnIndex = i - } + 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 && !isPrintVersion) primaryColor else textColor) + if (todayCode == dayCode) { + todayColumnIndex = i } + + mView.week_letters_holder.addView(label) curDay = curDay.plusDays(1) } } @@ -194,16 +246,16 @@ class WeekFragment : Fragment(), WeeklyCalendar { } private fun initGrid() { - (0..6).map { getColumnWithId(it) } - .forEachIndexed { index, layout -> - layout.removeAllViews() - val gestureDetector = getViewGestureDetector(layout, index) + (0 until config.weeklyViewDays).mapNotNull { dayColumns.getOrNull(it) } + .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 { @@ -222,7 +274,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { applyColorFilter(primaryColor.getContrastColor()) setOnClickListener { - val timestamp = weekTimestamp + 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) @@ -230,9 +282,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) } @@ -294,7 +350,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 @@ -306,7 +362,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private fun updateViewScale() { rowHeight = context?.getWeeklyViewItemHeight() ?: return - val oneDp = context!!.resources.getDimension(R.dimen.one_dp).toInt() + val oneDp = res.getDimension(R.dimen.one_dp).toInt() val fullHeight = Math.max(rowHeight.toInt() * 24, scrollView.height + oneDp) scrollView.layoutParams.height = fullHeight - oneDp mView.week_horizontal_grid_holder.layoutParams.height = fullHeight @@ -321,15 +377,12 @@ class WeekFragment : Fragment(), WeeklyCalendar { eventTimeRanges.clear() allDayRows.add(HashSet()) week_all_day_holder?.removeAllViews() - addNewLine() val minuteHeight = rowHeight / 60 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) @@ -352,17 +405,18 @@ 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 dayOfWeek = startDateTime.plusDays(if (config.isSundayFirst) 1 else 0).dayOfWeek - 1 - val layout = getColumnWithId(dayOfWeek) + val dayCode = Formatter.getDayCodeFromDateTime(startDateTime) + val dayOfWeek = dayColumns.indexOfFirst { it.tag == dayCode } + if (dayOfWeek == -1 || dayOfWeek >= config.weeklyViewDays) { + continue + } val startMinutes = startDateTime.minuteOfDay val duration = endDateTime.minuteOfDay - startMinutes val range = Range(startMinutes, startMinutes + duration) - val dayCode = Formatter.getDayCodeFromDateTime(startDateTime) var overlappingEvents = 0 var currentEventOverlapIndex = 0 var foundCurrentEvent = false @@ -381,10 +435,11 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } + val dayColumn = dayColumns[dayOfWeek] (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) } @@ -393,10 +448,10 @@ class WeekFragment : Fragment(), WeeklyCalendar { setTextColor(textColor) text = event.title contentDescription = text - layout.addView(this) + dayColumn.addView(this) y = startMinutes * minuteHeight (layoutParams as RelativeLayout.LayoutParams).apply { - width = layout.width - 1 + width = dayColumn.width - 1 width /= Math.max(overlappingEvents, 1) if (overlappingEvents > 1) { x = width * currentEventOverlapIndex.toFloat() @@ -429,37 +484,51 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } - if (!hadAllDayEvent) { - checkTopHolderHeight() - } - - addCurrentTimeIndicator(minuteHeight) + checkTopHolderHeight() + addCurrentTimeIndicator() } private fun addNewLine() { val allDaysLine = inflater.inflate(R.layout.all_day_events_holder_line, null, false) as RelativeLayout - week_all_day_holder.addView(allDaysLine) + week_all_day_holder?.addView(allDaysLine) allDayHolders.add(allDaysLine) } - private fun addCurrentTimeIndicator(minuteHeight: Float) { + private fun addCurrentTimeIndicator() { if (todayColumnIndex != -1) { - val minutes = DateTime().minuteOfDay - val todayColumn = getColumnWithId(todayColumnIndex) + 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 + } + if (currentTimeView != null) { 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) mView.week_events_holder.addView(this, 0) - val extraWidth = (todayColumn.width * 0.3).toInt() + 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 = todayColumn.width + extraWidth + width = (mView.width / weeklyViewDays) + extraWidth height = markerHeight } - x = todayColumn.x - extraWidth / 2 + + x = if (weeklyViewDays == 1) { + 0f + } else { + (mView.width / weeklyViewDays * todayColumnIndex).toFloat() - extraWidth / 2f + } + y = minutes * minuteHeight - markerHeight / 2 } } @@ -477,7 +546,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) } @@ -491,7 +560,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { val endDateTime = Formatter.getDateTimeFromTS(event.endTS) val minTS = Math.max(startDateTime.seconds(), weekTimestamp) - val maxTS = Math.min(endDateTime.seconds(), weekTimestamp + WEEK_SECONDS) + val maxTS = Math.min(endDateTime.seconds(), weekTimestamp + 2 * WEEK_SECONDS) // fix a visual glitch with all-day events or events lasting multiple days starting at midnight on monday, being shown the previous week too if (minTS == maxTS && (minTS - weekTimestamp == WEEK_SECONDS.toLong())) { @@ -532,16 +601,25 @@ class WeekFragment : Fragment(), WeeklyCalendar { allDayRows.last().add(dayIndex) } } + if (wasEventHandled) { break } } + 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 + } + allDayHolders[drawAtLine].addView(this) + val dayWidth = mView.width / config.weeklyViewDays (layoutParams as RelativeLayout.LayoutParams).apply { - leftMargin = getColumnWithId(firstDayIndex).x.toInt() + leftMargin = dayOfWeek * dayWidth bottomMargin = 1 - width = getColumnWithId(Math.min(firstDayIndex + daysCnt, 6)).right - leftMargin - 1 + width = (dayWidth) * (daysCnt + 1) } calculateExtraHeight() @@ -570,8 +648,6 @@ class WeekFragment : Fragment(), WeeklyCalendar { } } - private fun getColumnWithId(id: Int) = mView.findViewById(res.getIdentifier("week_column_$id", "id", context!!.packageName)) - fun updateScrollY(y: Int) { if (wasFragmentInit) { scrollView.scrollY = y @@ -583,4 +659,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 8deba96df..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,11 +1,14 @@ 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 import android.widget.DatePicker +import android.widget.RelativeLayout import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -13,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 @@ -28,6 +29,7 @@ import org.joda.time.DateTime class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { private val PREFILLED_WEEKS = 151 + private val MAX_SEEKBAR_VALUE = 14 private var viewPager: MyViewPager? = null private var weekHolder: ViewGroup? = null @@ -60,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 { @@ -104,16 +93,53 @@ 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() } + 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) - var currentWeek = dateTime.minusWeeks(PREFILLED_WEEKS / 2) + val shownWeekDays = context!!.config.weeklyViewDays + var currentWeek = dateTime.minusDays(PREFILLED_WEEKS / 2 * shownWeekDays) for (i in 0 until PREFILLED_WEEKS) { weekTSs.add(currentWeek.seconds()) - currentWeek = currentWeek.plusWeeks(1) + currentWeek = currentWeek.plusDays(shownWeekDays) } return weekTSs } @@ -149,11 +175,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 +202,16 @@ 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) + (viewPager?.adapter as? MyWeekPagerAdapter)?.updateVisibleDaysCount(viewPager!!.currentItem, cnt, currentWeekTS) + } + override fun refreshEvents() { (viewPager?.adapter as? MyWeekPagerAdapter)?.updateCalendars(viewPager!!.currentItem) } @@ -223,5 +259,29 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener { (viewPager!!.adapter as? MyWeekPagerAdapter)?.updateNotVisibleScaleLevel(viewPager!!.currentItem) } - override fun getFullFragmentHeight() = weekHolder!!.week_view_holder.height + override fun getFullFragmentHeight() = weekHolder!!.week_view_holder.height - weekHolder!!.week_view_seekbar.height - weekHolder!!.week_view_days_count_divider.height + + 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) + } + } } 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 ff3221d8f..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 @@ -126,4 +127,8 @@ class YearFragmentsHolder : MyFragmentHolder() { } override fun getNewEventDayCode() = Formatter.getTodayCode() + + override fun printView() { + (viewPager?.adapter as? MyYearPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0) + } } 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/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() } 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..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) @@ -169,9 +175,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 +185,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/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()) 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) } 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..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 @@ -60,8 +60,10 @@ 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) { + if (value.split(",").any { it.toInt() == -1 }) { + repeatRule = REPEAT_LAST_DAY + } } } return EventRepetition(repeatInterval, repeatRule, repeatLimit) 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 7aedef406..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.* @@ -11,8 +12,8 @@ class WeeklyCalendarImpl(val callback: WeeklyCalendar, val context: Context) { var mEvents = ArrayList() fun updateWeeklyCalendar(weekStartTS: Long) { - val endTS = weekStartTS + WEEK_SECONDS - context.eventsHelper.getEvents(weekStartTS, endTS) { + val endTS = weekStartTS + 2 * WEEK_SECONDS + context.eventsHelper.getEvents(weekStartTS - DAY_SECONDS, endTS) { mEvents = it callback.updateWeeklyCalendar(it) } 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 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() + } } 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..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 @@ -41,9 +42,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 +80,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) { + if (curId == todaysId && !isPrintVersion) { 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++ @@ -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/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt index f4d1ee6a1..6146e02df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt @@ -6,12 +6,13 @@ import android.graphics.Paint import android.util.AttributeSet import android.view.View import com.simplemobiletools.calendar.pro.R +import com.simplemobiletools.calendar.pro.extensions.config import com.simplemobiletools.calendar.pro.extensions.getWeeklyViewItemHeight class WeeklyViewGrid(context: Context, attrs: AttributeSet, defStyle: Int) : View(context, attrs, defStyle) { private val ROWS_CNT = 24 - private val COLS_CNT = 7 private var paint = Paint(Paint.ANTI_ALIAS_FLAG) + var daysCount = context.config.weeklyViewDays constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) @@ -27,8 +28,8 @@ class WeeklyViewGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Vie canvas.drawLine(0f, y, width.toFloat(), y, paint) } - val rowWidth = width / COLS_CNT.toFloat() - for (i in 0 until COLS_CNT) { + val rowWidth = width / daysCount.toFloat() + for (i in 0 until daysCount) { val x = rowWidth * i.toFloat() canvas.drawLine(x, 0f, x, height.toFloat(), paint) } 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" /> diff --git a/app/src/main/res/layout/activity_event.xml b/app/src/main/res/layout/activity_event.xml index 7d34c0e94..32f40d01b 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:padding="@dimen/small_margin" + 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 +498,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 +549,6 @@ android:layout_height="1px" android:layout_below="@+id/event_type_holder" android:background="@color/divider_grey" - android:importantForAccessibility="no"/> + android:importantForAccessibility="no" /> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 93478b89c..54cc36913 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -186,22 +186,26 @@ + android:clickable="false" + android:gravity="end" + android:maxLines="3" + tools:text="None" /> 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" /> 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" /> - - @@ -22,7 +21,7 @@ + android:layout_height="wrap_content" /> - - - - - - - - - - - - - - @@ -91,72 +48,7 @@ android:background="@drawable/stroke_bottom" android:gravity="center_vertical" android:orientation="horizontal" - android:paddingBottom="@dimen/small_margin"> - - - - - - - - - - - - - - - - + android:paddingBottom="@dimen/small_margin" /> - + android:orientation="horizontal"> - + android:layout_alignEnd="@+id/week_view_hours_scrollview" + android:background="@drawable/stroke_bottom_right" + android:importantForAccessibility="no" /> - + - + android:orientation="vertical" /> - + - + - + - - + + + + + diff --git a/app/src/main/res/layout/fragment_year.xml b/app/src/main/res/layout/fragment_year.xml index f5e9dc3ec..731dff3ba 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" /> @@ -43,20 +41,20 @@ android:layout_marginEnd="@dimen/yearly_padding_half" android:layout_weight="1"> - + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_2_label" /> @@ -64,24 +62,23 @@ 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"> - + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_3_label" /> @@ -93,24 +90,23 @@ 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" /> @@ -122,20 +118,20 @@ android:layout_marginEnd="@dimen/yearly_padding_half" android:layout_weight="1"> - + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_5_label" /> @@ -143,25 +139,24 @@ 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"> - + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -172,23 +167,22 @@ 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,25 +214,24 @@ 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"> - + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> @@ -250,23 +243,22 @@ 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" /> @@ -278,47 +270,45 @@ android:layout_marginEnd="@dimen/yearly_padding_half" android:layout_weight="1"> - + android:textSize="@dimen/normal_text_size" /> + app:days="30" /> - + android:textSize="@dimen/normal_text_size" /> + android:layout_below="@+id/month_12_label" /> diff --git a/app/src/main/res/layout/weekly_view_day_column.xml b/app/src/main/res/layout/weekly_view_day_column.xml new file mode 100644 index 000000000..bcef7b2f0 --- /dev/null +++ b/app/src/main/res/layout/weekly_view_day_column.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/weekly_view_day_letter.xml b/app/src/main/res/layout/weekly_view_day_letter.xml new file mode 100644 index 000000000..7cd7abdf7 --- /dev/null +++ b/app/src/main/res/layout/weekly_view_day_letter.xml @@ -0,0 +1,10 @@ + + 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" /> 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" /> + إدارة أنواع الأحداث ابدأ اليوم عند نهاية الحدث + 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 1a8d1a9aa..07f19a21c 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 @@ -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 314311e3a..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 @@ -249,7 +250,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/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f4f4d0a94..17aaf8595 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 + Σημερινό ημερολόγιο Εκδηλώσεις @@ -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 3f3fdcfb5..aaaa42af2 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 @@ -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 @@ -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 @@ -174,7 +175,7 @@ Repetir recordatorios hasta ser descartados Sombrear eventos pasados Eventos - Sonido usado en recordatorios + Tipo de sonido usado en recordatorios Sistema Alarma Notificación @@ -208,17 +209,17 @@ 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 - Lunes - Martes - Miércoles - Jueves - Viernes - Sábado - Domingo + lunes + martes + miércoles + jueves + viernes + sábado + domingo Ejercicio @@ -248,9 +249,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. 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..4366c26c8 --- /dev/null +++ b/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,302 @@ + + + Simple Calendar + Egutegia + Aldatu ikuspegia + Eguneko ikuspegia + Asteko ikuspegia + Hilabeteko ikuspegia + Urteko ikuspegia + Gertaera-zerrenda sinplea + Hurrengo gertaerarik ez. + 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) + + + 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 + Gertaera bat dator + + + Errepikapena + Errepikapenik ez + Egunero + Astero + Hilabetero + Urtero + asteak + hilabeteak + urteak + Noiz arte errepikatu + 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 + Mugitu eragindako gertaerak lehenetsitako gertaera motara + Eragindako gertaerak betiko kendu + 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 + + + Kudeatu gertaera motak + Eguna noiz hasi + Eguna noiz bukatu + Allow customizing day count + 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 + Gertaera-zerrendaren widgetatik irekitzeko ikuspegia + Erabilitako azken ikuspegia + Gertaera berriak + Lehenetsitako hasiera-ordua + Hurrengo ordu osoa + Lehenetsitako iraupena + Erabilitako azkena + Bestelako denbora + Nabarmendu asteburuak ikuspegi batzuetan + Baimendu gertaeren ordu-zonak aldatzea + + + CalDAV + 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 + + + + astelehenean + asteartean + asteazkenean + ostegunean + ostiralean + larunbatean + igandean + + + Entrenamendua + Hankak + Bilera Itziarrekin + Katakraken + Liburutegia + Bazkaria Arkaitzekin + Garraxin + Kafea hartu + + + 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 - Gertaerak eta abisuak + + 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! + + 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. + + 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 – Eginbideak eta abantailak + ---------------------------------------------------------- + + ✔️ 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 + + DESKARGATU SIMPLE CALENDAR PRO – LINEAZ KANPO ERABILI DAITEKEEN IRAGARKIRIK GABEKO EGUTEGI SINPLEA! + + Ikusi Simple Tools-en sorta osoa hemen: + https://www.simplemobiletools.com + + Simple Calendar Pro-ren webgune autonomoa: + 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-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e6f5d6de4..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 @@ -176,7 +177,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 +198,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 +210,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 +251,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 diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index f8e55316c..c8a0c209b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -8,15 +8,15 @@ Vista mensual Vista anual Lista de eventos simple - Semella que non ten ningún evento próximo. + Semella que non tes ningún evento próximo. Ir ao día de hoxe Ir a unha data - Hey,\n\nseems like you upgraded from the old free app. You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu.\n\nYou can then uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings. You will then only have to reset your app settings.\n\nThanks! + 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 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 dos 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,26 +103,26 @@ 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 + Inserir franxa horaria 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 - 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 - Mover os eventos afectados ao tipo de evento por omisión + Selecciona un tipo de evento + Mover os eventos afectados ao tipo de evento por defecto 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 @@ -151,25 +151,26 @@ 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 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 - 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 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 - Borrar tódolos eventos - Está seguro de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes. + Substituír a descrición coa localización + 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 Atenuar eventos pasados @@ -178,12 +179,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 +193,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,20 +206,20 @@ 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 + Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes do aplicativo. + Non se atoparon calendarios sincronizados - Segunda - Terceira - Cuarta - Quinta - Sexta - Sábado - Domingo + luns + martes + mércores + xoves + venres + sábado + domingo Exercicio @@ -227,64 +228,63 @@ No paseo do León Biblioteca Xantar con Aira - Na plaza + Na praza 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 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 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, 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 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. - Simple Calendar Pro - Events & Reminders + Simple Calendar Pro - Eventos & Recordatorios - Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day + Calendadario simple, con eventos, widget personalizable e sen publicidade. - 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 sen 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 do 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 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 + ✔️ 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 - 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: 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 20cbe73e9..3f41a909a 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 @@ -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 @@ -191,8 +192,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 +208,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 +241,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. 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 2bf960c51..3fce17c65 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 @@ -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 d1de7ba10..af5dbecf7 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 @@ -125,7 +125,7 @@ Substituir tipo de eventos no ficheiro - Location + Localização Descrição Todo o dia @@ -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 @@ -208,7 +209,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 +249,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 +285,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: diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml new file mode 100644 index 000000000..4025b8f56 --- /dev/null +++ b/app/src/main/res/values-ro/strings.xml @@ -0,0 +1,302 @@ + + + Simple Calendar + Calendar + Schimbă vizualizarea + Vedeți ziua + Vedeți săptămâna + Vedeți luna + Vedeți anul + Listă de evenimente simple + Se pare că nu aveți evenimente viitoare. + Sari la ziua de azi + Sari la dată + Hei,\n\nse pare că a-ți actualizat din vechea aplicație gratuită. Trebuie să migrați manual evenimentele stocate local prin exportarea într-un fișier .ics, apoi importarea. Puteți găsi ambele butoane de export / import în meniul ecranului principal.\n\nPuteți apoi să dezinstalați versiunea veche, care are un buton \'Upgrade to Pro\' în partea de sus a setărilor aplicației. Atunci va trebui doar să resetați setările aplicației.\n\nMulțumesc! + + + Calendar lunar + Calendar listă evenimente + Calendar data de azi + + + Eveniment + Modifică evenimentul + Eveniment nou + Creează 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 succes + 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 + Fără 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ă + Repetă în + În fiecare zi + În zilele selectate + 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 + Reamintiri 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 desincronizaț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 + Allow customizing day count + 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. + Afiș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 în 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ă… + 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 care se pot sincroniza + + + + Luni + Marți + Miercuri + Joi + Vineri + Sâmbătă + Duminică + + + Antrenament + Zi antrenament pentru picioare + Î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\"? + 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. + Î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, 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. + + + + Simple Calendar Pro - Evenimente și Reamintiri + + Calendar simplu 2020. Planificare și reamintire întâlnire pentru orice zi + + 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/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-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-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 35d6db502..feab4fd63 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,22 +1,22 @@     简易日历 -    简易日历 -    改变检视模式 -    日历 -    周历 -    月历 -    年历 +    日历 +    改变视图 +    日历视图 +    周历视图 +    月历视图 +    年历视图     简易活动列表 -    你近期似乎没有任何活动。 +    您近期似乎没有任何活动。     前往今天     前往日期 -    嘿\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 日历,您必须取消同步          节日     添加节日 -    国定节日 +    法定节日     宗教节日     节日已成功导入"节日"活动类型     导入一些活动失败 @@ -158,23 +158,24 @@     管理活动类型     每日开始于     每日结束于 + Allow customizing day count     显示第几周     提醒通知时震动     ​​提醒音效 -    未发现能够设置铃声的程式 +    未发现能够设置铃声的程序          结束时间不能比开始早 -    CalDAV同步 +    CalDAV 同步     活动列表     显示过去的活动     活动描述改成地点     删除全部活动 -    你确定要删除全部活动吗?会完整留下你的活动类型和其他设定。 +    您确定要删除全部活动吗?会完整留下您的活动类型和其他设定。     显示网络     不断重复提醒直到解除     淡化过去的活动     活动 -    用于提醒的音源串流 +    用于提醒的音频流     系统     闹钟     通知 @@ -183,32 +184,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 +234,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: 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/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 - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 352f020c5..221830c09 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -9,6 +9,7 @@ 60dp 10dp 10dp + 60dp 250dp 250dp 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 diff --git a/build.gradle b/build.gradle index 0a6167029..a1fa23748 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() @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + 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/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/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 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 diff --git a/fastlane/metadata/android/en-US/changelogs/178.txt b/fastlane/metadata/android/en-US/changelogs/178.txt new file mode 100644 index 000000000..0cbcab9fe --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/178.txt @@ -0,0 +1,3 @@ + * Allow changing the amount of days shown at the weekly view + * Show a Save / Discard prompt at leaving an edited event (by fnrngg) + * Some translation and stability improvements diff --git a/fastlane/metadata/android/en-US/changelogs/179.txt b/fastlane/metadata/android/en-US/changelogs/179.txt new file mode 100644 index 000000000..7e6c79f68 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/179.txt @@ -0,0 +1 @@ + * Fixing a glitch with zoomed out weekly view 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 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 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 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 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 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 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 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 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 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..168f2a63d --- /dev/null +++ b/fastlane/metadata/android/gl/short_description.txt @@ -0,0 +1 @@ +Calendadario simple, con eventos, widget personalizable e sen publicidade. 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 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 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 - 活动&约会 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2d407db26..4a0ca69c0 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 +#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-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip