Merge pull request #34 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-11-04 18:25:28 +03:00 committed by GitHub
commit 3947d3747e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
148 changed files with 2276 additions and 970 deletions

View File

@ -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)*
----------------------------

View File

@ -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'

View File

@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.simplemobiletools.calendar.pro"
android:installLocation="auto">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
@ -18,11 +17,11 @@
<uses-permission
android:name="android.permission.USE_FINGERPRINT"
tools:node="remove"/>
tools:node="remove" />
<uses-feature
android:name="android.hardware.faketouch"
android:required="false"/>
android:required="false" />
<application
android:name=".App"
@ -36,43 +35,43 @@
<activity
android:name=".activities.SplashActivity"
android:launchMode="singleTask"
android:theme="@style/SplashTheme"/>
android:theme="@style/SplashTheme" />
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTask">
<meta-data
android:name="android.app.default_searchable"
android:resource="@xml/searchable"/>
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:scheme="file"/>
<data android:mimeType="text/x-vcalendar"/>
<data android:mimeType="text/calendar"/>
<data android:mimeType="application/ics"/>
<data android:scheme="content" />
<data android:scheme="file" />
<data android:mimeType="text/x-vcalendar" />
<data android:mimeType="text/calendar" />
<data android:mimeType="application/ics" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="time/epoch"/>
<data android:host="com.android.calendar"/>
<data android:scheme="content"/>
<data android:mimeType="time/epoch" />
<data android:host="com.android.calendar" />
<data android:scheme="content" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.item/event"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/event" />
</intent-filter>
</activity>
@ -81,7 +80,7 @@
android:screenOrientation="portrait"
android:theme="@style/MyWidgetConfigTheme">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
@ -90,7 +89,7 @@
android:screenOrientation="portrait"
android:theme="@style/MyWidgetConfigTheme">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
@ -99,29 +98,29 @@
android:screenOrientation="portrait"
android:theme="@style/MyWidgetConfigTheme">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<activity
android:name="com.simplemobiletools.commons.activities.AboutActivity"
android:label="@string/about"
android:parentActivityName=".activities.MainActivity"/>
android:parentActivityName=".activities.MainActivity" />
<activity
android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
android:label="@string/customize_colors"
android:parentActivityName=".activities.SettingsActivity"/>
android:parentActivityName=".activities.SettingsActivity" />
<activity
android:name="com.simplemobiletools.commons.activities.LicenseActivity"
android:label="@string/third_party_licences"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity" />
<activity
android:name="com.simplemobiletools.commons.activities.FAQActivity"
android:label="@string/frequently_asked_questions"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity" />
<activity
android:name=".activities.EventActivity"
@ -129,19 +128,19 @@
android:parentActivityName=".activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.INSERT"/>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.item/event"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/event" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.INSERT"/>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/event"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/event" />
</intent-filter>
</activity>
@ -160,28 +159,28 @@
<activity
android:name=".activities.SettingsActivity"
android:label="@string/settings"
android:parentActivityName=".activities.MainActivity"/>
android:parentActivityName=".activities.MainActivity" />
<activity
android:name=".activities.ManageEventTypesActivity"
android:label="@string/event_types"
android:parentActivityName=".activities.SettingsActivity"/>
android:parentActivityName=".activities.SettingsActivity" />
<activity
android:name=".activities.SnoozeReminderActivity"
android:theme="@style/Theme.Transparent"/>
android:theme="@style/Theme.Transparent" />
<receiver
android:name=".helpers.MyWidgetMonthlyProvider"
android:icon="@drawable/img_widget_monthly_preview"
android:label="@string/widget_monthly">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_monthly_info"/>
android:resource="@xml/widget_monthly_info" />
</receiver>
<receiver
@ -189,12 +188,12 @@
android:icon="@drawable/img_widget_list_preview"
android:label="@string/widget_list">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_list_info"/>
android:resource="@xml/widget_list_info" />
</receiver>
<receiver
@ -202,38 +201,38 @@
android:icon="@drawable/img_widget_date_preview"
android:label="@string/widget_todays_date">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_date_info"/>
android:resource="@xml/widget_date_info" />
</receiver>
<service
android:name=".services.WidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS"/>
android:permission="android.permission.BIND_REMOTEVIEWS" />
<service
android:name=".services.WidgetServiceEmpty"
android:permission="android.permission.BIND_REMOTEVIEWS"/>
android:permission="android.permission.BIND_REMOTEVIEWS" />
<service android:name=".services.SnoozeService"/>
<service android:name=".services.SnoozeService" />
<service
android:name=".jobs.CalDAVUpdateListener"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE"/>
android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver android:name=".receivers.NotificationReceiver"/>
<receiver android:name=".receivers.NotificationReceiver" />
<receiver android:name=".receivers.CalDAVSyncReceiver"/>
<receiver android:name=".receivers.CalDAVSyncReceiver" />
<receiver android:name=".receivers.BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
@ -244,7 +243,7 @@
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
android:resource="@xml/provider_paths" />
</provider>
<activity-alias
@ -255,8 +254,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -268,8 +267,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -281,8 +280,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -294,8 +293,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -307,8 +306,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -320,8 +319,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -333,8 +332,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -346,8 +345,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -359,8 +358,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -372,8 +371,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -385,8 +384,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -398,8 +397,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -411,8 +410,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -424,8 +423,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -436,8 +435,8 @@
android:roundIcon="@mipmap/ic_launcher"
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -449,8 +448,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -462,8 +461,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -475,8 +474,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
@ -488,8 +487,8 @@
android:targetActivity=".activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
</application>

View File

@ -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

View File

@ -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

View File

@ -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<Attendee>()
private var mStoredEventTypes = ArrayList<EventType>()
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<Long, Long> {
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<Reminder> {
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<Reminder>
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<ArrayList<Attendee>>(getString(ATTENDEES), object : TypeToken<List<Attendee>>() {}.type)
?: ArrayList()
val token = object : TypeToken<List<Attendee>>() {}.type
mAttendees = Gson().fromJson<ArrayList<Attendee>>(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<ArrayList<Attendee>>(mEvent.attendees, object : TypeToken<List<Attendee>>() {}.type) ?: ArrayList()
val token = object : TypeToken<List<Attendee>>() {}.type
mAttendees = Gson().fromJson<ArrayList<Attendee>>(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<CalDAVCalendar>, calendarId: Int): CalDAVCalendar? =
calendars.firstOrNull { it.id == calendarId }
private fun getCalendarWithId(calendars: List<CalDAVCalendar>, 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<Reminder>
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()

View File

@ -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<Int>, callback: (Int) -> Unit) {
var eventsAdded = 0
var eventsFound = 0
private fun addContactEvents(birthdays: Boolean, reminders: ArrayList<Int>, 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<SimpleContact>, reminders: ArrayList<Int>, 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<String, Long>()
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<String>()
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)
}

View File

@ -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<Attendee>) : ArrayAdapter<Attendee>(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

View File

@ -30,6 +30,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, 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<Event>, 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<Event>, r
}
var newTextColor = textColor
if (dimPastEvents && event.isPastEvent) {
if (dimPastEvents && event.isPastEvent && !isPrintVersion) {
newTextColor = newTextColor.adjustAlpha(LOW_ALPHA)
}

View File

@ -37,6 +37,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
private val now = getNowSeconds()
private var use24HourFormat = activity.config.use24HourFormat
private var currentItemsHash = listItems.hashCode()
private var isPrintVersion = false
init {
setupDragListener(true)
@ -131,6 +132,16 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
}
}
fun togglePrintMode() {
isPrintVersion = !isPrintVersion
textColor = if (isPrintVersion) {
resources.getColor(R.color.theme_light_text_color)
} else {
baseConfig.textColor
}
notifyDataSetChanged()
}
private fun setupListEvent(view: View, listEvent: ListEvent) {
view.apply {
event_item_frame.isSelected = selectedKeys.contains(listEvent.hashCode())
@ -161,15 +172,15 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
var startTextColor = textColor
var endTextColor = textColor
if (listEvent.isAllDay || listEvent.startTS <= now && listEvent.endTS <= now) {
if (listEvent.isAllDay && Formatter.getDayCodeFromTS(listEvent.startTS) == Formatter.getDayCodeFromTS(now)) {
if (listEvent.isAllDay && Formatter.getDayCodeFromTS(listEvent.startTS) == Formatter.getDayCodeFromTS(now) && !isPrintVersion) {
startTextColor = primaryColor
}
if (dimPastEvents && listEvent.isPastEvent) {
if (dimPastEvents && listEvent.isPastEvent && !isPrintVersion) {
startTextColor = startTextColor.adjustAlpha(LOW_ALPHA)
endTextColor = endTextColor.adjustAlpha(LOW_ALPHA)
}
} else if (listEvent.startTS <= now && listEvent.endTS >= now) {
} else if (listEvent.startTS <= now && listEvent.endTS >= now && !isPrintVersion) {
startTextColor = primaryColor
}
@ -184,8 +195,8 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
view.event_section_title.apply {
text = listSection.title
setCompoundDrawablesWithIntrinsicBounds(null, if (position == 0) null else topDivider, null, null)
var color = if (listSection.isToday) primaryColor else textColor
if (dimPastEvents && listSection.isPastSection) {
var color = if (listSection.isToday && !isPrintVersion) primaryColor else textColor
if (dimPastEvents && listSection.isPastSection && !isPrintVersion) {
color = color.adjustAlpha(LOW_ALPHA)
}
setTextColor(color)

View File

@ -48,7 +48,10 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
setupListEvent(remoteView, event)
} else {
remoteView = RemoteViews(context.packageName, R.layout.event_list_section_widget)
setupListSection(remoteView, events[position] as ListSection)
val section = events.getOrNull(position) as? ListSection
if (section != null) {
setupListSection(remoteView, section)
}
}
return remoteView

View File

@ -33,4 +33,8 @@ class MyDayPagerAdapter(fm: FragmentManager, private val mCodes: List<String>, p
mFragments[pos + i]?.updateCalendar()
}
}
fun printCurrentView(pos: Int) {
mFragments[pos].printCurrentView()
}
}

View File

@ -32,4 +32,8 @@ class MyMonthPagerAdapter(fm: FragmentManager, private val mCodes: List<String>,
mFragments[pos + i]?.updateCalendar()
}
}
fun printCurrentView(pos: Int) {
mFragments[pos].printCurrentView()
}
}

View File

@ -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<Long>, private val mListener: WeekFragmentListener) : FragmentStatePagerAdapter(fm) {
private val mFragments = SparseArray<WeekFragment>()
@ -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()
}
}

View File

@ -30,4 +30,8 @@ class MyYearPagerAdapter(fm: FragmentManager, val mYears: List<Int>) : FragmentS
mFragments[pos + i]?.updateCalendar()
}
}
fun printCurrentView(pos: Int) {
mFragments[pos].printCurrentView()
}
}

View File

@ -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)
}
}
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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
}

View File

@ -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<Event>(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)
}
}
}

View File

@ -138,4 +138,8 @@ class DayFragmentsHolder : MyFragmentHolder(), NavigationListener {
}
override fun getNewEventDayCode() = currentDayCode
override fun printView() {
(viewPager?.adapter as? MyDayPagerAdapter)?.printCurrentView(viewPager?.currentItem ?: 0)
}
}

View File

@ -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)
}
}
}

View File

@ -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()
}
}
}

View File

@ -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)
}
}

View File

@ -14,4 +14,6 @@ abstract class MyFragmentHolder : Fragment() {
abstract fun updateActionBarTitle()
abstract fun getNewEventDayCode(): String
abstract fun printView()
}

View File

@ -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<RelativeLayout>()
private var allDayRows = ArrayList<HashSet<Int>>()
private var currEvents = ArrayList<Event>()
private var dayColumns = ArrayList<RelativeLayout>()
private var eventTypeColors = LongSparseArray<Int>()
private var eventTimeRanges = LinkedHashMap<String, ArrayList<EventWeeklyView>>()
@ -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<String>
val labelIDs = if (useLongerDayLabels) {
R.array.week_days_short
} else {
R.array.week_day_letters
}
val dayLetters = res.getStringArray(labelIDs).toMutableList() as ArrayList<String>
val dayLetter = dayLetters[curDay.dayOfWeek - 1]
mView.findViewById<TextView>(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<Event> { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description }
compareBy<Event> { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description }
).toMutableList() as ArrayList<Event>
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<ViewGroup>(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)
}
}

View File

@ -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<Long> {
val weekTSs = ArrayList<Long>(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)
}
}
}

View File

@ -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<SmallMonthView>(res.getIdentifier("month_" + i, "id", context!!.packageName))
val monthView = mView.findViewById<SmallMonthView>(resources.getIdentifier("month_$i", "id", context!!.packageName))
var dayOfWeek = dateTime.withMonthOfYear(i).dayOfWeek().get()
if (!mSundayFirst) {
dayOfWeek--
}
val monthLabel = mView.findViewById<TextView>(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<TextView>(res.getIdentifier("month_${now.monthOfYear}_label", "id", context!!.packageName))
val monthLabel = mView.findViewById<TextView>(resources.getIdentifier("month_${now.monthOfYear}_label", "id", context!!.packageName))
monthLabel.setTextColor(context!!.getAdjustedPrimaryColor())
val monthView = mView.findViewById<SmallMonthView>(res.getIdentifier("month_${now.monthOfYear}", "id", context!!.packageName))
val monthView = mView.findViewById<SmallMonthView>(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<SmallMonthView>(res.getIdentifier("month_$i", "id", context!!.packageName))
val monthView = mView.findViewById<SmallMonthView>(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<SmallMonthView>(resources.getIdentifier("month_$i", "id", context!!.packageName))
monthView.togglePrintMode()
}
}
}

View File

@ -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)
}
}

View File

@ -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()
}

View File

@ -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)

View File

@ -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()
}

View File

@ -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<Reminder>
@ -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

View File

@ -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())

View File

@ -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)
}

View File

@ -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)

View File

@ -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<Event>()
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)
}

View File

@ -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<String> = 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<String> = 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

View File

@ -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<MonthViewEvent>()
private var bgRectF = RectF()
private var dayLetters = ArrayList<String>()
@ -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<MonthViewEvent>
.toMutableList() as ArrayList<MonthViewEvent>
}
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()
}
}

View File

@ -96,4 +96,8 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
addView(this)
}
}
fun togglePrintMode() {
monthView.togglePrintMode()
}
}

View File

@ -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<DayYearly>? = 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()
}
}

View File

@ -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)
}

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/calendar_holder"
android:layout_width="match_parent"
@ -14,7 +13,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/yearly_padding_full"
android:layout_marginRight="@dimen/yearly_padding_full"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
@ -24,15 +22,14 @@
android:gravity="center_horizontal"
android:text="@string/january"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_1_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_2_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_3_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
<RelativeLayout
@ -94,7 +88,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/yearly_padding_full"
android:layout_marginRight="@dimen/yearly_padding_full"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
@ -104,16 +97,15 @@
android:gravity="center_horizontal"
android:text="@string/april"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_4_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"
app:days="30"/>
app:days="30" />
</RelativeLayout>
</TableRow>
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_5_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_6"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_6_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"
app:days="30"/>
app:days="30" />
</RelativeLayout>
<RelativeLayout
@ -178,7 +167,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/yearly_padding_full"
android:layout_marginRight="@dimen/yearly_padding_full"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
@ -188,15 +176,14 @@
android:gravity="center_horizontal"
android:text="@string/july"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_7"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_7_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
<RelativeLayout
@ -214,15 +201,14 @@
android:gravity="center_horizontal"
android:text="@string/august"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_8"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_8_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
</TableRow>
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_9"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_9_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"
app:days="30"/>
app:days="30" />
</RelativeLayout>
<RelativeLayout
@ -261,7 +245,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/yearly_padding_full"
android:layout_marginRight="@dimen/yearly_padding_full"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
@ -271,15 +254,14 @@
android:gravity="center_horizontal"
android:text="@string/october"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_10"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_10_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
<RelativeLayout
@ -297,23 +279,21 @@
android:gravity="center_horizontal"
android:text="@string/november"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_11"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_11_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"
app:days="30"/>
app:days="30" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/month_12_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">
@ -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" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_12"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_12_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"/>
android:layout_marginStart="@dimen/yearly_month_padding" />
</RelativeLayout>
</TableRow>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/event_scrollview"
@ -25,7 +24,7 @@
android:maxLines="1"
android:minEms="20"
android:textCursorDrawable="@null"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/event_location"
@ -41,20 +40,19 @@
android:maxLines="1"
android:minEms="20"
android:textCursorDrawable="@null"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<ImageView
android:id="@+id/event_show_on_map"
android:layout_width="wrap_content"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="match_parent"
android:layout_alignTop="@+id/event_location"
android:layout_alignBottom="@+id/event_location"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/activity_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingStart="@dimen/small_margin"
android:paddingEnd="@dimen/small_margin"
android:src="@drawable/ic_place_vector"/>
android:padding="@dimen/small_margin"
android:src="@drawable/ic_place_vector" />
<com.simplemobiletools.commons.views.MyEditText
android:id="@+id/event_description"
@ -71,7 +69,7 @@
android:linksClickable="true"
android:minEms="20"
android:textCursorDrawable="@null"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<ImageView
android:id="@+id/event_description_divider"
@ -81,7 +79,7 @@
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginBottom="@dimen/normal_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/event_time_image"
@ -92,7 +90,7 @@
android:layout_alignBottom="@+id/event_all_day"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_clock_vector"/>
android:src="@drawable/ic_clock_vector" />
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/event_all_day"
@ -107,7 +105,7 @@
android:paddingBottom="@dimen/normal_margin"
android:text="@string/all_day"
android:textSize="@dimen/day_text_size"
app:switchPadding="@dimen/small_margin"/>
app:switchPadding="@dimen/small_margin" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_start_date"
@ -120,7 +118,7 @@
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="January 1 1970"/>
tools:text="January 1 1970" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_start_time"
@ -131,7 +129,7 @@
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="00:00"/>
tools:text="00:00" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_end_date"
@ -144,7 +142,7 @@
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="January 1 1970"/>
tools:text="January 1 1970" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_end_time"
@ -155,34 +153,34 @@
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="00:00"/>
tools:text="00:00" />
<ImageView
android:id="@+id/event_time_zone_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/event_end_date"
android:layout_marginStart="@dimen/normal_margin"
android:layout_alignTop="@+id/event_time_zone"
android:layout_alignBottom="@+id/event_time_zone"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_globe_vector"/>
android:src="@drawable/ic_globe_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_time_zone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/event_end_date"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/small_margin"
android:layout_toEndOf="@+id/event_time_zone_image"
android:background="?attr/selectableItemBackground"
android:layout_centerVertical="true"
android:ellipsize="end"
android:lines="1"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="Europe/Bratislava"/>
tools:text="Europe/Bratislava" />
<ImageView
android:id="@+id/event_date_time_divider"
@ -192,7 +190,7 @@
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/event_reminder_image"
@ -203,7 +201,7 @@
android:layout_alignBottom="@+id/event_reminder_1"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_bell_vector"/>
android:src="@drawable/ic_bell_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_1"
@ -217,9 +215,10 @@
android:ellipsize="end"
android:lines="1"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="@string/add_another_reminder"/>
tools:text="@string/add_another_reminder" />
<ImageView
android:id="@+id/event_reminder_1_type"
@ -231,7 +230,7 @@
android:layout_marginStart="@dimen/small_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_bell_vector"/>
android:src="@drawable/ic_bell_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_2"
@ -245,11 +244,12 @@
android:ellipsize="end"
android:lines="1"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/add_another_reminder"
android:textSize="@dimen/day_text_size"
android:visibility="gone"
tools:text="@string/add_another_reminder"/>
tools:text="@string/add_another_reminder" />
<ImageView
android:id="@+id/event_reminder_2_type"
@ -261,7 +261,7 @@
android:layout_marginStart="@dimen/small_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_bell_vector"/>
android:src="@drawable/ic_bell_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_3"
@ -275,11 +275,12 @@
android:ellipsize="end"
android:lines="1"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/add_another_reminder"
android:textSize="@dimen/day_text_size"
android:visibility="gone"
tools:text="@string/add_another_reminder"/>
tools:text="@string/add_another_reminder" />
<ImageView
android:id="@+id/event_reminder_3_type"
@ -291,7 +292,7 @@
android:layout_marginStart="@dimen/small_margin"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_bell_vector"/>
android:src="@drawable/ic_bell_vector" />
<ImageView
android:id="@+id/event_reminder_divider"
@ -301,7 +302,7 @@
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/event_repetition_image"
@ -312,7 +313,7 @@
android:layout_alignBottom="@+id/event_repetition"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_repeat_vector"/>
android:src="@drawable/ic_repeat_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_repetition"
@ -323,9 +324,10 @@
android:layout_toEndOf="@+id/event_repetition_image"
android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size"
tools:text="@string/no_repetition"/>
tools:text="@string/no_repetition" />
<RelativeLayout
android:id="@+id/event_repetition_rule_holder"
@ -344,7 +346,7 @@
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_on"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_repetition_rule"
@ -356,7 +358,7 @@
android:gravity="end"
android:padding="@dimen/activity_margin"
android:text="@string/every_day"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
</RelativeLayout>
<RelativeLayout
@ -377,7 +379,7 @@
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_till"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_repetition_limit"
@ -387,7 +389,7 @@
android:clickable="false"
android:padding="@dimen/activity_margin"
android:text="@string/forever"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
</RelativeLayout>
<ImageView
@ -397,7 +399,7 @@
android:layout_below="@+id/event_repetition_limit_holder"
android:layout_marginTop="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/event_attendees_image"
@ -408,7 +410,7 @@
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginTop="@dimen/small_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_people_vector"/>
android:src="@drawable/ic_people_vector" />
<LinearLayout
android:id="@+id/event_attendees_holder"
@ -417,7 +419,7 @@
android:layout_below="@+id/event_repetition_divider"
android:layout_marginTop="@dimen/medium_margin"
android:layout_toEndOf="@+id/event_attendees_image"
android:orientation="vertical"/>
android:orientation="vertical" />
<ImageView
android:id="@+id/event_attendees_divider"
@ -426,7 +428,7 @@
android:layout_below="@+id/event_attendees_holder"
android:layout_marginTop="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/event_caldav_calendar_image"
@ -434,12 +436,12 @@
android:layout_height="match_parent"
android:layout_below="@+id/event_attendees_divider"
android:layout_alignTop="@+id/event_caldav_calendar_holder"
android:layout_alignBottom="@+id/event_caldav_calendar_holder"
android:layout_alignEnd="@+id/event_time_image"
android:layout_alignBottom="@+id/event_caldav_calendar_holder"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_calendar_vector"
android:visibility="gone"/>
android:visibility="gone" />
<RelativeLayout
android:id="@+id/event_caldav_calendar_holder"
@ -459,10 +461,10 @@
android:ellipsize="end"
android:maxLines="1"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/tiny_margin"
android:textSize="@dimen/day_text_size"
tools:text="My calendar"/>
tools:text="My calendar" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_caldav_calendar_email"
@ -476,7 +478,7 @@
android:paddingEnd="@dimen/medium_margin"
android:paddingBottom="@dimen/medium_margin"
android:textSize="@dimen/meta_text_size"
tools:text="hello@simplemobiletools.com"/>
tools:text="hello@simplemobiletools.com" />
<ImageView
android:id="@+id/event_caldav_calendar_color"
@ -485,7 +487,7 @@
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_margin"
android:clickable="false"/>
android:clickable="false" />
</RelativeLayout>
@ -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" />
<ImageView
android:id="@+id/event_type_image"
@ -507,7 +509,7 @@
android:layout_alignBottom="@+id/event_type_holder"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_color_vector"/>
android:src="@drawable/ic_color_vector" />
<RelativeLayout
android:id="@+id/event_type_holder"
@ -528,7 +530,7 @@
android:layout_toStartOf="@+id/event_type_color"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size"/>
android:textSize="@dimen/day_text_size" />
<ImageView
android:id="@+id/event_type_color"
@ -537,7 +539,7 @@
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_margin"
android:clickable="false"/>
android:clickable="false" />
</RelativeLayout>
@ -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" />
</RelativeLayout>
</ScrollView>

View File

@ -186,22 +186,26 @@
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_reminder_sound_label"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_reminder_sound"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
android:text="@string/reminder_sound" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_reminder_sound"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginEnd="@dimen/small_margin"
android:layout_toEndOf="@+id/settings_reminder_sound_label"
android:background="@null"
android:clickable="false" />
android:clickable="false"
android:gravity="end"
android:maxLines="3"
tools:text="None" />
</RelativeLayout>

View File

@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.commons.views.MyRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
<com.simplemobiletools.commons.views.MyRecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/filter_event_types_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingTop="@dimen/medium_margin"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
android:paddingTop="@dimen/activity_margin"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />

View File

@ -31,7 +31,7 @@
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/calendar_empty_list_placeholder_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/week_holder"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -22,7 +21,7 @@
<com.simplemobiletools.calendar.pro.views.WeeklyViewGrid
android:id="@+id/week_horizontal_grid_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/week_events_columns_holder"
@ -31,48 +30,6 @@
android:background="@android:color/transparent"
android:orientation="horizontal">
<RelativeLayout
android:id="@+id/week_column_0"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<RelativeLayout
android:id="@+id/week_column_6"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
</RelativeLayout>
</com.simplemobiletools.calendar.pro.views.MyScrollView>
@ -91,72 +48,7 @@
android:background="@drawable/stroke_bottom"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="@dimen/small_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/monday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/tuesday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/wednesday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/thursday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/friday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/saturday_letter"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_day_label_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/sunday_letter"
android:textSize="@dimen/normal_text_size"/>
</LinearLayout>
android:paddingBottom="@dimen/small_margin" />
<LinearLayout
android:id="@+id/week_all_day_holder"

View File

@ -1,48 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/week_view_main_holder"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/week_view_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true">
android:orientation="horizontal">
<RelativeLayout
android:id="@+id/week_view_holder"
<ImageView
android:id="@+id/week_view_hours_divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_alignEnd="@+id/week_view_hours_scrollview"
android:background="@drawable/stroke_bottom_right"
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/week_view_hours_divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/week_view_hours_scrollview"
android:background="@drawable/stroke_bottom_right"
android:importantForAccessibility="no"/>
<com.simplemobiletools.calendar.pro.views.MyScrollView
android:id="@+id/week_view_hours_scrollview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/week_view_seekbar"
android:layout_below="@+id/week_view_hours_divider"
android:background="@drawable/stroke_right"
android:overScrollMode="never"
android:paddingTop="@dimen/medium_margin"
android:scrollbars="none">
<com.simplemobiletools.calendar.pro.views.MyScrollView
android:id="@+id/week_view_hours_scrollview"
<LinearLayout
android:id="@+id/week_view_hours_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/week_view_hours_divider"
android:background="@drawable/stroke_right"
android:overScrollMode="never"
android:paddingTop="@dimen/medium_margin"
android:scrollbars="none">
android:orientation="vertical" />
<LinearLayout
android:id="@+id/week_view_hours_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</com.simplemobiletools.calendar.pro.views.MyScrollView>
</com.simplemobiletools.calendar.pro.views.MyScrollView>
<com.simplemobiletools.commons.views.MyViewPager
android:id="@+id/week_view_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/week_view_days_count_divider"
android:layout_toEndOf="@+id/week_view_hours_scrollview" />
<com.simplemobiletools.commons.views.MyViewPager
android:id="@+id/week_view_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toEndOf="@+id/week_view_hours_scrollview"/>
<include
android:id="@+id/week_view_days_count_divider"
layout="@layout/divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_above="@+id/week_view_seekbar" />
</RelativeLayout>
</LinearLayout>
<com.simplemobiletools.commons.views.MySeekBar
android:id="@+id/week_view_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="@dimen/activity_margin"
android:layout_toStartOf="@+id/week_view_days_count"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/week_view_days_count"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/week_view_seekbar"
android:layout_alignBottom="@+id/week_view_seekbar"
android:layout_alignParentEnd="true"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:gravity="center_vertical"
tools:text="7 days" />
</RelativeLayout>

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/calendar_holder"
android:layout_width="match_parent"
@ -14,24 +13,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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_1_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/january"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_1_label"
android:layout_centerInParent="true"/>
android:layout_centerInParent="true" />
</RelativeLayout>
@ -43,20 +41,20 @@
android:layout_marginEnd="@dimen/yearly_padding_half"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_2_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/february"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_2_label"/>
android:layout_below="@+id/month_2_label" />
</RelativeLayout>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_3_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/march"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/month_3_label"/>
android:layout_below="@+id/month_3_label" />
</RelativeLayout>
</TableRow>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_4_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/april"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_4_label"
app:days="30"/>
app:days="30" />
</RelativeLayout>
@ -122,20 +118,20 @@
android:layout_marginEnd="@dimen/yearly_padding_half"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_5_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/may"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_5_label"/>
android:layout_below="@+id/month_5_label" />
</RelativeLayout>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_6_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/june"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_6"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_6_label"
app:days="30"/>
app:days="30" />
</RelativeLayout>
</TableRow>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_7_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/july"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_7"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_7_label"/>
android:layout_below="@+id/month_7_label" />
</RelativeLayout>
<RelativeLayout
@ -199,20 +193,20 @@
android:layout_marginEnd="@dimen/yearly_padding_half"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_8_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/august"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_8"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_8_label"/>
android:layout_below="@+id/month_8_label" />
</RelativeLayout>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_9_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/september"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_9"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_9_label"
app:days="30"/>
app:days="30" />
</RelativeLayout>
</TableRow>
@ -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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_10_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/october"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_10"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_10_label"/>
android:layout_below="@+id/month_10_label" />
</RelativeLayout>
@ -278,47 +270,45 @@
android:layout_marginEnd="@dimen/yearly_padding_half"
android:layout_weight="1">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_11_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/november"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_11"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_11_label"
android:layout_marginLeft="@dimen/yearly_month_padding"
android:layout_marginStart="@dimen/yearly_month_padding"
app:days="30"/>
app:days="30" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/month_12_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">
<com.simplemobiletools.commons.views.MyTextView
<TextView
android:id="@+id/month_12_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/december"
android:textAllCaps="true"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />
<com.simplemobiletools.calendar.pro.views.SmallMonthView
android:id="@+id/month_12"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/month_12_label"/>
android:layout_below="@+id/month_12_label" />
</RelativeLayout>
</TableRow>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/week_column"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.commons.views.MyTextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/week_day_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:textSize="@dimen/normal_text_size"
tools:text="@string/monday_letter" />

View File

@ -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" />

View File

@ -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" />

View File

@ -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" />
<TextView

View File

@ -31,6 +31,10 @@
android:id="@+id/go_to_date"
android:title="@string/go_to_date"
app:showAsAction="never"/>
<item
android:id="@+id/print"
android:title="@string/print"
app:showAsAction="never"/>
<item
android:id="@+id/add_holidays"
android:title="@string/add_holidays"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">إدارة أنواع الأحداث</string>
<string name="start_day_at">ابدأ اليوم عند</string>
<string name="end_day_at">نهاية الحدث</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">عرض أرقام الأسبوع</string>
<string name="vibrate">إهتزاز عند الإشعار</string>
<string name="reminder_sound">صوت التذكير</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Hadisə tiplərini idarə et</string>
<string name="start_day_at">Günə başla</string>
<string name="end_day_at">Günü bitir</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Həftə günlərini göstər</string>
<string name="vibrate">Xatırladıcı bildirişində vibrasiya et</string>
<string name="reminder_sound">Xatırladıcı səsi</string>

View File

@ -162,6 +162,7 @@
<string name="manage_event_types">ইভেন্ট টাইপ ম্যানেজ করুন</string>
<string name="start_day_at">দিনের শুরু</string>
<string name="end_day_at">দিনের শেষ</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">সপ্তাহের সংখ্যাগুলি দেখান</string>
<string name="vibrate">রিমাইন্ডার নোটিফিকেশনে ভাইব্রেট করো</string>
<string name="reminder_sound">রিমাইন্ডারের শব্দ</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Merañ an doareoù darvoudoù</string>
<string name="start_day_at">Kregiñ an devezh da</string>
<string name="end_day_at">Echuiñ an devezh da</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Diskouez niverennoù ar sizhun</string>
<string name="vibrate">Froumal evit ar rebuzadurioù adc\'halv</string>
<string name="reminder_sound">Soniri adc\'halv</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Správa typů událostí</string>
<string name="start_day_at">Počátek dne</string>
<string name="end_day_at">Konec dne</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Zobrazovat čísla týdnů</string>
<string name="vibrate">Vibrovat při připomínce</string>
<string name="reminder_sound">Zvuk připomínky</string>

View File

@ -16,7 +16,7 @@
<!-- Widget titles -->
<string name="widget_monthly">Månedlig kalender</string>
<string name="widget_list">Begivenhedsliste</string>
<string name="widget_todays_date">Calendar today\'s date</string>
<string name="widget_todays_date">Dags dato-kalender</string>
<!-- Event -->
<string name="event">Begivenhed</string>
@ -158,6 +158,7 @@
<string name="manage_event_types">Håndter begivenhedstyper</string>
<string name="start_day_at">Start dagen kl.</string>
<string name="end_day_at">Slut dagen kl.</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Vis ugenumre</string>
<string name="vibrate">Vibrer under påmindelser</string>
<string name="reminder_sound">Lyd til påmindelser</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Termintypen verwalten</string>
<string name="start_day_at">Wochenansicht beginnt um</string>
<string name="end_day_at">Wochenansicht endet um</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Kalenderwoche anzeigen</string>
<string name="vibrate">Vibration bei Erinnerung</string>
<string name="reminder_sound">Erinnerungston</string>
@ -249,7 +250,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Termine &amp; Erinnerungen</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_short_description">Der beste Kalender zum Organisieren der Ereignisse während des ganzen Tages</string>
<string name="app_long_description">
Simple Calendar Pro ist ein vollständig anpassbarer Offline-Kalender, der genau das bietet, was man von einem Kalender erwartet. <b>Keine umständlichen Funktionen, keine unnötigen Berechtigungen und keine Werbung!</b>

View File

@ -16,7 +16,7 @@
<!-- Widget titles -->
<string name="widget_monthly">Μηνιαίο ημερολόγιο</string>
<string name="widget_list">Λίστα εκδηλώσεων ημερολογίου</string>
<string name="widget_todays_date">Calendar today\'s date</string>
<string name="widget_todays_date">Σημερινό ημερολόγιο</string>
<!-- Event -->
<string name="event">Εκδηλώσεις</string>
@ -158,6 +158,7 @@
<string name="manage_event_types">Διαχείριση τύπων εκδηλώσεων</string>
<string name="start_day_at">Ημέρα έναρξης την</string>
<string name="end_day_at">Ημέρα λήξης την</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Εμφάνιση αριθμών εβδομάδων</string>
<string name="vibrate">Δόνηση στην ειδοποίηση υπενθύμισης</string>
<string name="reminder_sound">Ήχος υπενθύμισης</string>

View File

@ -16,7 +16,7 @@
<!-- Widget titles -->
<string name="widget_monthly">Calendario mensual</string>
<string name="widget_list">Lista de eventos del calendario</string>
<string name="widget_todays_date">Calendar today\'s date</string>
<string name="widget_todays_date">Calendario de la fecha de hoy</string>
<!-- Event -->
<string name="event">Evento</string>
@ -56,7 +56,7 @@
<string name="repeat_forever">Repetir por siempre</string>
<string name="times">veces</string>
<string name="repeat">Repetir</string>
<string name="repeat_on">Repertir los</string>
<string name="repeat_on">Repertir en</string>
<string name="every_day">Cada día</string>
<string name="selected_days">En los días seleccionados</string>
<string name="the_same_day">El mismo día</string>
@ -76,9 +76,9 @@
<!-- used in repetition, like "Every first Sunday" -->
<string name="repeat_every_f">Repetir cada</string>
<string name="every_f">Cada</string>
<string name="first_f">primero</string>
<string name="first_f">primer</string>
<string name="second_f">segundo</string>
<string name="third_f">tercero</string>
<string name="third_f">tercer</string>
<string name="fourth_f">cuarto</string>
<string name="last_f">último</string>
@ -158,6 +158,7 @@
<string name="manage_event_types">Gestionar tipos de eventos</string>
<string name="start_day_at">El día en la vista semanal comienza a las</string>
<string name="end_day_at">El día en la vista semanal finaliza a las</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Mostrar los números de la semana</string>
<string name="vibrate">Vibración en notificación de recordatorio</string>
<string name="reminder_sound">Sonido de recordatorio</string>
@ -174,7 +175,7 @@
<string name="loop_reminders">Repetir recordatorios hasta ser descartados</string>
<string name="dim_past_events">Sombrear eventos pasados</string>
<string name="events">Eventos</string>
<string name="reminder_stream">Sonido usado en recordatorios</string>
<string name="reminder_stream">Tipo de sonido usado en recordatorios</string>
<string name="system_stream">Sistema</string>
<string name="alarm_stream">Alarma</string>
<string name="notification_stream">Notificación</string>
@ -208,17 +209,17 @@
<string name="select_a_different_caldav_color">Seleccionar un color diferente (localmente)</string>
<string name="insufficient_permissions">No tiene permiso para modificar el calendario</string>
<string name="caldav_event_not_found">Evento no encontrado. Habilite la sincronización de CalDAV para los calendarios en la configuración.</string>
<string name="no_synchronized_calendars">No synchronizable calendars have been found</string>
<string name="no_synchronized_calendars">No se han encontrado calendarios para sincronizar</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">Lunes</string>
<string name="tuesday_alt">Martes</string>
<string name="wednesday_alt">Miércoles</string>
<string name="thursday_alt">Jueves</string>
<string name="friday_alt">Viernes</string>
<string name="saturday_alt">Sábado</string>
<string name="sunday_alt">Domingo</string>
<string name="monday_alt">lunes</string>
<string name="tuesday_alt">martes</string>
<string name="wednesday_alt">miércoles</string>
<string name="thursday_alt">jueves</string>
<string name="friday_alt">viernes</string>
<string name="saturday_alt">sábado</string>
<string name="sunday_alt">domingo</string>
<!-- List widget config example events -->
<string name="sample_title_1">Ejercicio</string>
@ -248,9 +249,9 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Calendario Simple Pro - Eventos y Recordatorios</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_short_description">Calendario móvil Simple 2020. Horarios y recordatorios para cualquier día</string>
<string name="app_long_description">
Calendario Simple Pro es un calendario fuera de línea, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. <b> ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios! </b>
Calendario Simple Pro es un calendario sin conexión, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. <b> ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios! </b>
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 <b> sea fácil mantenerse organizado </b>. Con una increíble variedad de <b> opciones de personalización </b>, puedes personalizar recordatorios de eventos, sonidos de notificación, widgets de calendario y el aspecto de la aplicación.

View File

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Calendar</string>
<string name="app_launcher_name">Egutegia</string>
<string name="change_view">Aldatu ikuspegia</string>
<string name="daily_view">Eguneko ikuspegia</string>
<string name="weekly_view">Asteko ikuspegia</string>
<string name="monthly_view">Hilabeteko ikuspegia</string>
<string name="yearly_view">Urteko ikuspegia</string>
<string name="simple_event_list">Gertaera-zerrenda sinplea</string>
<string name="no_upcoming_events">Hurrengo gertaerarik ez.</string>
<string name="go_to_today">Joan gaurko egunera</string>
<string name="go_to_date">Joan data zehatz batera</string>
<string name="upgraded_from_free">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!</string>
<!-- Widget titles -->
<string name="widget_monthly">Egutegia (hilabetea)</string>
<string name="widget_list">Egutegia (gertaera-zerrenda)</string>
<string name="widget_todays_date">Egutegia (gaurko eguna)</string>
<!-- Event -->
<string name="event">Gertaera</string>
<string name="edit_event">Editatu gertaera</string>
<string name="new_event">Gertaera berria</string>
<string name="create_new_event">Sortu gertaera berria</string>
<string name="duplicate_event">Bikoiztu gertaera</string>
<string name="title_empty">Izenburuak ezin du hutsik egon</string>
<string name="end_before_start">Gertaerak ezin du bukatu hasi baino lehen</string>
<string name="event_added">Gertaera ondo gehitu da</string>
<string name="event_updated">Gertaera ondo eguneratu da</string>
<string name="filter_events_by_type">Iragazi gertaerak motaren arabera</string>
<string name="please_fill_location">Bete kokalekua mapan erakusteko</string>
<string name="public_event_notification_text">Gertaera bat dator</string>
<!-- Event Repetition -->
<string name="repetition">Errepikapena</string>
<string name="no_repetition">Errepikapenik ez</string>
<string name="daily">Egunero</string>
<string name="weekly">Astero</string>
<string name="monthly">Hilabetero</string>
<string name="yearly">Urtero</string>
<string name="weeks_raw">asteak</string>
<string name="months_raw">hilabeteak</string>
<string name="years_raw">urteak</string>
<string name="repeat_till">Noiz arte errepikatu</string>
<string name="forever">Betiko</string>
<string name="event_is_repeatable">Gertaera errepikagarria da</string>
<string name="selection_contains_repetition">Hautaketak errepikatzen diren gertaerak ditu</string>
<string name="delete_one_only">Ezabatu hautatutako gertaera soilik</string>
<string name="delete_future_occurrences">Ezabatu gertaera hau eta datozen guztiak</string>
<string name="delete_all_occurrences">Ezabatu gertaera guztiak</string>
<string name="update_one_only">Eguneratu hautatutako gertaera soilik</string>
<string name="update_all_occurrences">Eguneratu gertaera guztiak</string>
<string name="repeat_till_date">Errepikatu data zehatz batera arte</string>
<string name="stop_repeating_after_x">Errepikatzeari utzi x gertaera ondoren</string>
<string name="repeat_forever">Errepikatu betiko</string>
<string name="times">aldiz</string>
<string name="repeat">Errepikatu</string>
<string name="repeat_on">Errepikatu egun hauetan:</string>
<string name="every_day">Egunero</string>
<string name="selected_days">Hautatutako egunetan</string>
<string name="the_same_day">Egun bera</string>
<string name="the_last_day">Azken eguna</string>
<string name="repeat_on_the_same_day_monthly">Errepikatu hilabetero egun berean</string>
<string name="repeat_on_the_last_day_monthly">Errepikatu hilabeteko azken egunean</string>
<string name="repeat_on_the_same_day_yearly">Errepikatu urtero egun berean</string>
<string name="repeat_every_m">Errepikatze-maiztasuna</string>
<string name="every_m">Maiztasuna:</string>
<string name="first_m">lehenengo</string>
<string name="second_m">bigarren</string>
<string name="third_m">hirugarren</string>
<string name="fourth_m">laugarren</string>
<string name="last_m">azken</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every first Sunday" -->
<string name="repeat_every_f">Erepikatze-maiztasuna:</string>
<string name="every_f">Maiztasuna:</string>
<string name="first_f">lehenengo</string>
<string name="second_f">bigarren</string>
<string name="third_f">hirugarren</string>
<string name="fourth_f">laugarren</string>
<string name="last_f">azken</string>
<!-- Birthdays -->
<string name="birthdays">Urtebetetzeak</string>
<string name="add_birthdays">Gehitu kontaktuen urtebetetzeak</string>
<string name="no_birthdays">Urtebetetzerik ez da aurkitu</string>
<string name="no_new_birthdays">Urtebetetze berririk ez da aurkitu</string>
<string name="birthdays_added">Urtebetetzeak ondo gehitu dira</string>
<!-- Anniversaries -->
<string name="anniversaries">Urteurrenak</string>
<string name="add_anniversaries">Gehitu kontaktuen urteurrenak</string>
<string name="no_anniversaries">Urteurrenik ez da aurkitu</string>
<string name="no_new_anniversaries">Urteurren berririk ez da aurkitu</string>
<string name="anniversaries_added">Urteurrenak ondo gehitu dira</string>
<!-- Event Reminders -->
<string name="reminder">Abisua</string>
<string name="before">hau baino lehen:</string>
<string name="add_another_reminder">Gehitu beste abisu bat</string>
<string name="event_reminders">Gertaera-abisua</string>
<!-- Event attendees -->
<string name="add_another_attendee">Gehitu beste parte-hartzaile bat</string>
<string name="my_status">Nire egoera:</string>
<string name="going">Banoa</string>
<string name="not_going">Ez noa</string>
<string name="maybe_going">Agian noa</string>
<string name="invited">Gonbidatua</string>
<!-- Time zones -->
<string name="enter_a_country">Sartu herrialdea edo ordu-zona</string>
<!-- Export / Import -->
<string name="import_events">Inportatu gertaerak</string>
<string name="export_events">Esportatu gertaerak</string>
<string name="import_events_from_ics">Inportatu gertaerak .ics fitxategi batetik</string>
<string name="export_events_to_ics">Esportatu gertaerak .ics fitxategi batetik</string>
<string name="default_event_type">Lehenetsitako gertaera mota</string>
<string name="export_past_events_too">Esportatu iraganeko gertaerak ere bai</string>
<string name="include_event_types">Gehitu gertaera motak</string>
<string name="filename_without_ics">Fitxategi-izena (.ics gabe)</string>
<string name="override_event_types">Gainidatzi fitxategiko gertaera motak</string>
<!-- Event details -->
<string name="location">Kokalekua</string>
<string name="description">Deskripzioa</string>
<string name="all_day">Egun osokoa</string>
<!-- Weekly view -->
<string name="week">Astea</string>
<!-- Event types -->
<string name="event_types">Gertaera motak</string>
<string name="add_new_type">Gehitu mota berria</string>
<string name="edit_type">Editatu mota</string>
<string name="type_already_exists">Izenburu hau duen mota jada badago</string>
<string name="color">Kolorea</string>
<string name="regular_event">Gertaera arrunta</string>
<string name="cannot_delete_default_type">Lehenetsitako gertaera mota ezin da ezabatu</string>
<string name="select_event_type">Hautatu gertaera mota</string>
<string name="move_events_into_default">Mugitu eragindako gertaerak lehenetsitako gertaera motara</string>
<string name="remove_affected_events">Eragindako gertaerak betiko kendu</string>
<string name="unsync_caldav_calendar">CalDAV egutegia ezabatzeko desinkronizatu behar duzu</string>
<!-- Holidays -->
<string name="holidays">Jaiegunak</string>
<string name="add_holidays">Gehitu jaiegunak</string>
<string name="national_holidays">Tokiko jaiegunak</string>
<string name="religious_holidays">Jaiegun erlijiosoak</string>
<string name="holidays_imported_successfully">Jaiegunak ondo inportatu dira \"Jaiegunak\" gertaera motan</string>
<string name="importing_some_holidays_failed">Gertaera batzuen inportazioak huts egin du</string>
<string name="importing_holidays_failed">Jaiegunak inportatzeak huts egin du</string>
<!-- Settings -->
<string name="manage_event_types">Kudeatu gertaera motak</string>
<string name="start_day_at">Eguna noiz hasi</string>
<string name="end_day_at">Eguna noiz bukatu</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Erakutsi asteen zenbakiak</string>
<string name="vibrate">Bibratu abisuen jakinarazpenetan</string>
<string name="reminder_sound">Abisuen soinua</string>
<string name="no_ringtone_picker">Dei-tonua ezartzeko gai den aplikaziorik ez da aurkitu</string>
<string name="no_ringtone_selected">Bat ere ez</string>
<string name="day_end_before_start">Egunak ezin du hasi baino lehen bukatu</string>
<string name="caldav_sync">CalDAVekin sinkronizatu</string>
<string name="event_lists">Gertaera-zerrendak</string>
<string name="display_past_events">Bistaratu iraganeko gertaerak</string>
<string name="replace_description_with_location">Ordeztu gertaeraren deskripzioa kokalekuarekin</string>
<string name="delete_all_events">Ezabatu gertaera guztiak</string>
<string name="delete_all_events_confirmation">Ziur zaude gertaera guztiak ezabatu nahi dituzula? Honek gertaera motak eta bestelako ezarpenak berdin utziko ditu.</string>
<string name="show_a_grid">Erakutsi sareta</string>
<string name="loop_reminders">Errepikatu abisuak baztertu arte</string>
<string name="dim_past_events">Lausotu iraganeko gertaerak</string>
<string name="events">Gertaerak</string>
<string name="reminder_stream">Abisuek erabilitako audio-transmisioa</string>
<string name="system_stream">Sistema</string>
<string name="alarm_stream">Alarma</string>
<string name="notification_stream">Jakinarazpena</string>
<string name="ring_stream">Jo tonua</string>
<string name="use_last_event_reminders">Erabili aurreko gertaeren abisuak gertaera berrien lehenetsitako gisa</string>
<string name="default_reminder_1">Lehenetsitako abisua 1</string>
<string name="default_reminder_2">Lehenetsitako abisua 2</string>
<string name="default_reminder_3">Lehenetsitako abisua 3</string>
<string name="view_to_open_from_widget">Gertaera-zerrendaren widgetatik irekitzeko ikuspegia</string>
<string name="last_view">Erabilitako azken ikuspegia</string>
<string name="new_events">Gertaera berriak</string>
<string name="default_start_time">Lehenetsitako hasiera-ordua</string>
<string name="next_full_hour">Hurrengo ordu osoa</string>
<string name="default_duration">Lehenetsitako iraupena</string>
<string name="last_used_one">Erabilitako azkena</string>
<string name="other_time">Bestelako denbora</string>
<string name="highlight_weekends">Nabarmendu asteburuak ikuspegi batzuetan</string>
<string name="allow_changing_time_zones">Baimendu gertaeren ordu-zonak aldatzea</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
<string name="select_caldav_calendars">Hautatu sinkronizatu nahi dituzun egutegiak</string>
<string name="manage_synced_calendars">Kudeatu sinkronizatutako egutegiak</string>
<string name="store_locally_only">Gorde lokalki soilik</string>
<string name="refresh_caldav_calendars">Freskatu CalDAV egutegiak</string>
<string name="refreshing">Freskatzen…</string>
<string name="refreshing_complete">Freskatu da</string>
<string name="editing_calendar_failed">Egutegia editatzeak huts egin du</string>
<string name="syncing">Sinkronizatzen…</string>
<string name="synchronization_completed">sinkronizatu da</string>
<string name="select_a_different_caldav_color">Hautatu kolore ezberdina (lokalki soilik aplikatu daiteke)</string>
<string name="insufficient_permissions">Ez duzu hautatutako egutegian idazteko baimenik</string>
<string name="caldav_event_not_found">Gertaera ez da aurkitu. Gaitu egutegi aproposerako CalDAV sinkronizazioa aplikazioaren ezarpenetan.</string>
<string name="no_synchronized_calendars">Sinkronizatu daitekeen egutegirik ez da aurkitu</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">astelehenean</string>
<string name="tuesday_alt">asteartean</string>
<string name="wednesday_alt">asteazkenean</string>
<string name="thursday_alt">ostegunean</string>
<string name="friday_alt">ostiralean</string>
<string name="saturday_alt">larunbatean</string>
<string name="sunday_alt">igandean</string>
<!-- List widget config example events -->
<string name="sample_title_1">Entrenamendua</string>
<string name="sample_description_1">Hankak</string>
<string name="sample_title_2">Bilera Itziarrekin</string>
<string name="sample_description_2">Katakraken</string>
<string name="sample_title_3">Liburutegia</string>
<string name="sample_title_4">Bazkaria Arkaitzekin</string>
<string name="sample_description_4">Garraxin</string>
<string name="sample_title_5">Kafea hartu</string>
<!-- FAQ -->
<string name="faq_1_title">Nola kendu ditzaket \"Gehitu jaiegunak\" botoiarekin inportatutako jaiegunak?</string>
<string name="faq_1_text">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.</string>
<string name="faq_2_title">Gertaerak Google Calendar bidez sinkronizatu ditzaket, edo CalDAV onartzen duen bestelako zerbitzurik?</string>
<string name="faq_2_text">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.</string>
<string name="faq_3_title">Abisu bisualak ikusten ditut, baina audiorik ez dut entzuten. Zer egin dezaket?</string>
<string name="faq_3_text">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.</string>
<string name="faq_4_title">Aplikazioak ordu-zonak onartzen ditu?</string>
<string name="faq_4_text">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.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Gertaerak eta abisuak</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Egutegi sinplea. Edozein egunetarako agenda antolatzailea eta hitzordu-abisuak</string>
<string name="app_long_description">
Simple Calendar Pro guztiz pertsonalizatu daitekeen lineaz kanpoko egutegia da, egutegi batek egin beharko lukeena egiteko diseinatua. <b>Eginbide korapilatsurik, beharrezkoa ez den baimenik eta iragarkirik ez!</b>
Gertaerak, urtebetetzeak, urteurrenak, negozio-bilerak, hitzorduak edo dena delakoa antolatu behar baduzu ere, Simple Calendar Pro-rekin <b>erraza da antolatzea</b>. Eskaintzen dituen <b>pertsonalizazio-aukera</b> 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, <b>zure bizitzan zer eta noiz gertatuko den</b> jakin dezazun.
----------------------------------------------------------
<b>Simple Calendar Pro Eginbideak eta abantailak</b>
----------------------------------------------------------
✔️ 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!
<b>Ikusi Simple Tools-en sorta osoa hemen:</b>
https://www.simplemobiletools.com
<b>Simple Calendar Pro-ren webgune autonomoa:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>

View File

@ -159,6 +159,7 @@
<string name="manage_event_types">Gestion des types d\événements</string>
<string name="start_day_at">Jour de début de la vue hebdomadaire</string>
<string name="end_day_at">Jour de fin de la vue hebdomadaire</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Afficher les numéros de semaine</string>
<string name="vibrate">Vibrer à la notification de rappel</string>
<string name="reminder_sound">Son de rappel</string>
@ -176,7 +177,7 @@
<string name="dim_past_events">Diminuer l\affichage des événements passés</string>
<string name="events">Evénements</string>
<string name="reminder_stream">Flux audio utilisé par les rappels</string>
<string name="system_stream">System</string>
<string name="system_stream">Système</string>
<string name="alarm_stream">Alarme</string>
<string name="notification_stream">Notification</string>
<string name="ring_stream">Sonnerie</string>
@ -197,7 +198,7 @@
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
<string name="select_caldav_calendars">Seléctionner les agendas à synchroniser</string>
<string name="select_caldav_calendars">Selectionner les agendas à synchroniser</string>
<string name="manage_synced_calendars">Gérer les agendas synchronisés</string>
<string name="store_locally_only">Stocker uniquement localement</string>
<string name="refresh_caldav_calendars">Rafraîchir les agendas CalDAV</string>
@ -209,7 +210,7 @@
<string name="select_a_different_caldav_color">Sélectionnez une couleur différente (peut être appliqué localement uniquement)</string>
<string name="insufficient_permissions">Vous n\êtes pas autorisé à écrire dans l\agenda sélectionné</string>
<string name="caldav_event_not_found">Événement introuvable. Veuillez activer la synchronisation CalDAV pour le calendrier approprié dans les paramètres de lapplication.</string>
<string name="no_synchronized_calendars">No synchronizable calendars have been found</string>
<string name="no_synchronized_calendars">Aucun calendrier synchronisable n\'a été trouvé</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
@ -250,47 +251,47 @@
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Calendrier mobile 2020. Planificat. d\'horaire; rappel de RDV n\'importe quel jour</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>
Simple Calendar Pro est un calendrier entièrement personnalisable et hors-ligne désigné pour faire exactement ce qu\'un calendrier devrait faire. <b>Aucune fonctionnalité compliquée, permissions inutiles et sans pubs !</b>
Whether youre organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it <b>easy to stay organized</b>. With an incredible variety of <b>customization options</b> 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 <b>votre organisation</b>. Avec une grande variété <b>d\'options de personnalisation</b>, 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 &amp; appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you <b>know exactly whats coming up in your life and when. </b>
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 <b>savoir exactement ce qui va arriver dans votre vie et quand. </b>
----------------------------------------------------------
<b>Simple Calendar Pro Features &amp; Benefits</b>
<b>Simple Calendar Pro Fonctionnalités &amp; avantages </b>
----------------------------------------------------------
✔️ No ads or annoying popups
✔️ No internet access needed, giving you more privacy &amp; 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 &amp; 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 &amp; event views on the calendar
✔️ Supports exporting &amp; importing events via .ics files
✔️ Set multiple event reminders, customize event reminder sound and vibration
✔️ Snooze option for reminders
✔️ Easily add holidays, birthdays, anniversaries &amp; 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 &amp; 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 !
<b>Check out the full suite of Simple Tools here:</b>
<b>Découvrez la suite complète des applications Simple Mobile Tools ici :</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Calendar Pro:</b>
<b>Site internet de Simple Calendar Pro :</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>
<b>Facebook :</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
<b>Reddit :</b>
https://www.reddit.com/r/SimpleMobileTools
</string>

View File

@ -8,15 +8,15 @@
<string name="monthly_view">Vista mensual</string>
<string name="yearly_view">Vista anual</string>
<string name="simple_event_list">Lista de eventos simple</string>
<string name="no_upcoming_events">Semella que non ten ningún evento próximo.</string>
<string name="no_upcoming_events">Semella que non tes ningún evento próximo.</string>
<string name="go_to_today">Ir ao día de hoxe</string>
<string name="go_to_date">Ir a unha data</string>
<string name="upgraded_from_free">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!</string>
<string name="upgraded_from_free">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!</string>
<!-- Widget titles -->
<string name="widget_monthly">Calendario mensual</string>
<string name="widget_list">Lista de eventos do calendario</string>
<string name="widget_todays_date">Calendar today\'s date</string>
<string name="widget_todays_date">Calendario no día actual</string>
<!-- Event -->
<string name="event">Evento</string>
@ -24,17 +24,17 @@
<string name="new_event">Novo evento</string>
<string name="create_new_event">Crear evento novo</string>
<string name="duplicate_event">Duplicar evento</string>
<string name="title_empty">O título non pode estar baldeiro</string>
<string name="title_empty">O título non pode estar baleiro</string>
<string name="end_before_start">O evento non pode rematar antes de iniciarse</string>
<string name="event_added">Evento engadido con éxito</string>
<string name="event_updated">O evento foi actualizado correctamente</string>
<string name="filter_events_by_type">Filtrar eventos por tipo</string>
<string name="please_fill_location">Introduza unha localización para que se mostre nun mapa</string>
<string name="please_fill_location">Escribe a localización para que se mostre nun mapa</string>
<string name="public_event_notification_text">Hai un evento próximo</string>
<!-- Event Repetition -->
<string name="repetition">Repetición</string>
<string name="no_repetition">Sin repetición</string>
<string name="no_repetition">Sen repetición</string>
<string name="daily">Diariamente</string>
<string name="weekly">Semanalmente</string>
<string name="monthly">Mensualmente</string>
@ -45,11 +45,11 @@
<string name="repeat_till">Repetir ata</string>
<string name="forever">Sempre</string>
<string name="event_is_repeatable">O evento é repetible</string>
<string name="selection_contains_repetition">A seleción contén eventos recurrentes</string>
<string name="delete_one_only">Eliminar só o evento selecionado</string>
<string name="selection_contains_repetition">A selección contén eventos recurrentes</string>
<string name="delete_one_only">Eliminar só o evento seleccionado</string>
<string name="delete_future_occurrences">Eliminar este e todos os eventos futuros</string>
<string name="delete_all_occurrences">Eliminar todos os eventos</string>
<string name="update_one_only">Actualizar só o evento selecionado</string>
<string name="update_one_only">Actualizar só o evento seleccionado</string>
<string name="update_all_occurrences">Actualizar todos os eventos</string>
<string name="repeat_till_date">Repetir ata a data</string>
<string name="stop_repeating_after_x">Deixar de repetir despois de x eventos</string>
@ -58,10 +58,10 @@
<string name="repeat">Repetir</string>
<string name="repeat_on">Repertir os</string>
<string name="every_day">Cada día</string>
<string name="selected_days">Nos días selecionados</string>
<string name="the_same_day">O mismo día</string>
<string name="selected_days">Nos días seleccionados</string>
<string name="the_same_day">O mesmo día</string>
<string name="the_last_day">O último día</string>
<string name="repeat_on_the_same_day_monthly">Repetir no mismo día cada mes</string>
<string name="repeat_on_the_same_day_monthly">Repetir no mesmo día cada mes</string>
<string name="repeat_on_the_last_day_monthly">Repetir no último día do mes</string>
<string name="repeat_on_the_same_day_yearly">Repetir no mesmo día cada ano</string>
<string name="repeat_every_m">Repetir cada</string>
@ -78,23 +78,23 @@
<string name="every_f">Cada</string>
<string name="first_f">primero</string>
<string name="second_f">segundo</string>
<string name="third_f">tercero</string>
<string name="third_f">terceiro</string>
<string name="fourth_f">cuarto</string>
<string name="last_f">último</string>
<!-- Birthdays -->
<string name="birthdays">Cumpleanos</string>
<string name="add_birthdays">Engadir cumpleanos de contactos</string>
<string name="no_birthdays">Non se atoparon cumpleanos</string>
<string name="no_new_birthdays">Non se atoparon novos cumpleanos</string>
<string name="birthdays_added">Engadíronse correctamente os cumpleanos</string>
<string name="birthdays">Aniversario</string>
<string name="add_birthdays">Engadir aniversario dos contactos</string>
<string name="no_birthdays">Non se atoparon aniversarios</string>
<string name="no_new_birthdays">Non se atoparon novos aniversarios</string>
<string name="birthdays_added">Engadíronse correctamente os aniversarios</string>
<!-- Anniversaries -->
<string name="anniversaries">Aniversarios</string>
<string name="add_anniversaries">Engadir aniversarios de contactos</string>
<string name="no_anniversaries">Non se atoparon aniversarios</string>
<string name="no_new_anniversaries">Non se atoparon novos aniversarios</string>
<string name="anniversaries_added">Engadíronse correctamente os aniversarios</string>
<string name="anniversaries">Celebracións</string>
<string name="add_anniversaries">Engadir celebracións de contactos</string>
<string name="no_anniversaries">Non se atoparon celebracións</string>
<string name="no_new_anniversaries">Non se atoparon novas celebracións</string>
<string name="anniversaries_added">Engadíronse correctamente as celebracións</string>
<!-- Event Reminders -->
<string name="reminder">Recordatorio</string>
@ -103,26 +103,26 @@
<string name="event_reminders">Recordatorios de eventos</string>
<!-- Event attendees -->
<string name="add_another_attendee">Add another attendee</string>
<string name="my_status">My status:</string>
<string name="going">Going</string>
<string name="not_going">Not going</string>
<string name="maybe_going">Maybe going</string>
<string name="invited">Invited</string>
<string name="add_another_attendee">Engadir participante</string>
<string name="my_status">O meu estado:</string>
<string name="going">Vou</string>
<string name="not_going">Non vou</string>
<string name="maybe_going">Pode que vaia</string>
<string name="invited">Convidado</string>
<!-- Time zones -->
<string name="enter_a_country">Enter a country or time zone</string>
<string name="enter_a_country">Inserir franxa horaria</string>
<!-- Export / Import -->
<string name="import_events">Importar eventos</string>
<string name="export_events">Exportar eventos</string>
<string name="import_events_from_ics">Importar eventos desde un ficheiro .ics</string>
<string name="export_events_to_ics">Exportar eventos desde un ficheiro .ics</string>
<string name="export_events_to_ics">Exportar eventos a un ficheiro .ics</string>
<string name="default_event_type">Tipo de evento predeterminado</string>
<string name="export_past_events_too">Exportar tamén eventos pasados</string>
<string name="include_event_types">Incluír tipos de eventos</string>
<string name="filename_without_ics">Nome de ficheiro (sin .ics)</string>
<string name="override_event_types">Sobreescribir tipos de evento no ficheiro</string>
<string name="filename_without_ics">Nome do ficheiro (sen .ics)</string>
<string name="override_event_types">Sobrescribir tipos de evento no ficheiro</string>
<!-- Event details -->
<string name="location">Localización</string>
@ -140,10 +140,10 @@
<string name="color">Cor</string>
<string name="regular_event">Evento regular</string>
<string name="cannot_delete_default_type">Non se pode eliminar o tipo de evento predeterminado</string>
<string name="select_event_type">Seleccione un tipo de evento</string>
<string name="move_events_into_default">Mover os eventos afectados ao tipo de evento por omisión</string>
<string name="select_event_type">Selecciona un tipo de evento</string>
<string name="move_events_into_default">Mover os eventos afectados ao tipo de evento por defecto</string>
<string name="remove_affected_events">Eliminar permanentemente os eventos afectados</string>
<string name="unsync_caldav_calendar">Para eliminar un calendario CalDAV antes debe deixar de sincronizalo</string>
<string name="unsync_caldav_calendar">Para eliminar un calendario CalDAV antes debes deixar de sincronizalo</string>
<!-- Holidays -->
<string name="holidays">Festivo</string>
@ -151,25 +151,26 @@
<string name="national_holidays">Festivo nacional</string>
<string name="religious_holidays">Festas relixiosas</string>
<string name="holidays_imported_successfully">Os festivos importáronse correctamente no tipo de evento \"Festivo\"</string>
<string name="importing_some_holidays_failed">Fallou a importación de algúns eventos</string>
<string name="importing_some_holidays_failed">Fallou a importación dalgúns eventos</string>
<string name="importing_holidays_failed">Fallou a importación de días festivos</string>
<!-- Settings -->
<string name="manage_event_types">Xestionar tipos de eventos</string>
<string name="start_day_at">Na vista xeral o día comeza as</string>
<string name="end_day_at">O día na vista semanal remata as</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Mostrar os números da semana</string>
<string name="vibrate">Vibrar coa notificación de recordatorio</string>
<string name="reminder_sound">Son de recordatorio</string>
<string name="no_ringtone_picker">Non se atopou ningunha aplicación capaz de establecer o ton de aviso</string>
<string name="no_ringtone_picker">Non se atopou ningún aplicativo capaz de establecer o ton de aviso</string>
<string name="no_ringtone_selected">Ningún</string>
<string name="day_end_before_start">O día non puede rematar antes de que comece</string>
<string name="day_end_before_start">O día non pode rematar antes de que comece</string>
<string name="caldav_sync">CalDAV sincr.</string>
<string name="event_lists">Listas de eventos</string>
<string name="event_lists">Listaxes de eventos</string>
<string name="display_past_events">Mostrar eventos do pasado</string>
<string name="replace_description_with_location">Substituir a descrición coa localización</string>
<string name="delete_all_events">Borrar tódolos eventos</string>
<string name="delete_all_events_confirmation">Está seguro de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes.</string>
<string name="replace_description_with_location">Substituír a descrición coa localización</string>
<string name="delete_all_events">Borrar todos os eventos</string>
<string name="delete_all_events_confirmation">Tes a certeza de querer borrar tódolos eventos? Esto deixará intactos os tipos de evento e outros axustes.</string>
<string name="show_a_grid">Mostrar unha cuadrícula</string>
<string name="loop_reminders">Repetir recordatorios ata que se descarten</string>
<string name="dim_past_events">Atenuar eventos pasados</string>
@ -178,12 +179,12 @@
<string name="system_stream">Sistema</string>
<string name="alarm_stream">Alarma</string>
<string name="notification_stream">Notificación</string>
<string name="ring_stream">Timbre</string>
<string name="ring_stream">Ton</string>
<string name="use_last_event_reminders">Usar os recordatorios dos últimos eventos como recordatorio por defecto para os eventos novos</string>
<string name="default_reminder_1">Recordatorio por defecto 1</string>
<string name="default_reminder_2">Recordatorio por defecto 2</string>
<string name="default_reminder_3">Recordatorio por defecto 3</string>
<string name="view_to_open_from_widget">Vista que abrir desde o widget da lista de eventos</string>
<string name="view_to_open_from_widget">Vista a abrir desde o widget da lista de eventos</string>
<string name="last_view">Última vista</string>
<string name="new_events">Eventos novos</string>
<string name="default_start_time">Hora de comezo por defecto</string>
@ -192,11 +193,11 @@
<string name="last_used_one">A última usada</string>
<string name="other_time">Outra hora</string>
<string name="highlight_weekends">Resaltar fins de semana nalgunhas vistas</string>
<string name="allow_changing_time_zones">Allow changing event time zones</string>
<string name="allow_changing_time_zones">Permitir cambiar as zonas horarias do evento</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
<string name="select_caldav_calendars">Escolla calendarios a sincronizar</string>
<string name="select_caldav_calendars">Escolle calendarios a sincronizar</string>
<string name="manage_synced_calendars">Xestionar calendarios sincronizados</string>
<string name="store_locally_only">Gardar só localmente</string>
<string name="refresh_caldav_calendars">Actualizar calendarios CalDAV</string>
@ -205,20 +206,20 @@
<string name="editing_calendar_failed">Fallou a edición do calendario</string>
<string name="syncing">Sincronizando…</string>
<string name="synchronization_completed">Sincronización completa</string>
<string name="select_a_different_caldav_color">Escolle un color diferente (pode que só se aplique localmente)</string>
<string name="select_a_different_caldav_color">Escolle unha cor diferente (pode que só se aplique localmente)</string>
<string name="insufficient_permissions">Non tes permiso para escribir no calendario seleccionado</string>
<string name="caldav_event_not_found">Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes da aplicación.</string>
<string name="no_synchronized_calendars">No synchronizable calendars have been found</string>
<string name="caldav_event_not_found">Evento non atopado. Activa a sincronización de CalDAV para o calendario apropiado nos axustes do aplicativo.</string>
<string name="no_synchronized_calendars">Non se atoparon calendarios sincronizados</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">Segunda</string>
<string name="tuesday_alt">Terceira</string>
<string name="wednesday_alt">Cuarta</string>
<string name="thursday_alt">Quinta</string>
<string name="friday_alt">Sexta</string>
<string name="saturday_alt">Sábado</string>
<string name="sunday_alt">Domingo</string>
<string name="monday_alt">luns</string>
<string name="tuesday_alt">martes</string>
<string name="wednesday_alt">mércores</string>
<string name="thursday_alt">xoves</string>
<string name="friday_alt">venres</string>
<string name="saturday_alt">sábado</string>
<string name="sunday_alt">domingo</string>
<!-- List widget config example events -->
<string name="sample_title_1">Exercicio</string>
@ -227,64 +228,63 @@
<string name="sample_description_2">No paseo do León</string>
<string name="sample_title_3">Biblioteca</string>
<string name="sample_title_4">Xantar con Aira</string>
<string name="sample_description_4">Na plaza</string>
<string name="sample_description_4">Na praza</string>
<string name="sample_title_5">Hora do café</string>
<!-- FAQ -->
<string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
<string name="faq_1_text">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.</string>
<string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
<string name="faq_2_text">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.</string>
<string name="faq_3_title">I see the visual reminders, but hear no audio. What can I do?</string>
<string name="faq_3_text">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.</string>
<string name="faq_4_title">Does the app support time zones?</string>
<string name="faq_4_text">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.</string>
<string name="faq_1_title">Como podo eliminar os días festivos engadidos vía o botón \"Engadir días festivos\"?</string>
<string name="faq_1_text">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.</string>
<string name="faq_2_title">Podo sincronizar os meus eventos vía Google Calendar, ou outro servizo que use CalDAV?</string>
<string name="faq_2_text">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.</string>
<string name="faq_3_title">Vexo os recordatorios visualmente, pero non escoito audio. Que podo facer?</string>
<string name="faq_3_text">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.</string>
<string name="faq_4_title">O app soporta zonas horarias?</string>
<string name="faq_4_text">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.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<string name="app_title">Simple Calendar Pro - Eventos &amp; Recordatorios</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_short_description">Calendadario simple, con eventos, widget personalizable e sen publicidade.</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>
Simple Calendar Pro é totalmente personalizable, calendario offline deseñado para facer o que debe facer un calendario. <b>Sen funcións complicadas, permisos innecesarios e sen publicidade!</b>
Whether youre organizing single or recurring events, birthdays, anniversaries, business meetings, appointments or anything else, Simple Calendar Pro makes it <b>easy to stay organized</b>. With an incredible variety of <b>customization options</b> 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 <b>organizado</b>. Cunha abraiante multitude de <b>opcións de personalización</b> 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 &amp; appointments a breeze. You can even view everything as a simple list of events rather than in calendar view, so you <b>know exactly whats coming up in your life and when. </b>
A vista Diaria, Semanal e Mensual facilítanche comprobar as próximas citas &amp; eventos. Podes incluso visualizalos como unha simple listaxe de eventos en lugar de nunha vista de calendario, así <b>sabes exactamente o que está por vir e cando</b>.
----------------------------------------------------------
<b>Simple Calendar Pro Features &amp; Benefits</b>
<b>Simple Calendar Pro Características &amp; Melloras</b>
----------------------------------------------------------
✔️ No ads or annoying popups
✔️ No internet access needed, giving you more privacy &amp; security
✔️ Only the bare minimum permissions required
✔️ Emphasis on simplicity does what a calendar needs to do!
✔️ Open source
✔️ Fully customizable themes &amp; 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 &amp; event views on the calendar
✔️ Supports exporting &amp; importing events via .ics files
✔️ Set multiple event reminders, customize event reminder sound and vibration
✔️ Snooze option for reminders
✔️ Easily add holidays, birthdays, anniversaries &amp; 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 &amp; email notifications to alert you about an event
✔️ Sen publicidade nin ventás emerxentes
✔️ Non precisa acceso a internet, proporcionando máis privacidade &amp; seguridade
✔️ Precisa os permisos mínimos imprescindibles
✔️ Énfase na simplicidade fai o que ten que facer!
✔️ Código aberto
✔️ Aspecto personalizable &amp; 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 &amp; 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 &amp; 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 &amp; 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!
<b>Check out the full suite of Simple Tools here:</b>
<b>Aquí tes a listaxe completa de Simple Tools:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Calendar Pro:</b>
<b>Web propia para Simple Calendar Pro:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">נהל סוגי אירועים</string>
<string name="start_day_at">שעת התחלה היום</string>
<string name="end_day_at">שעת סיום היום</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">הצגת מספרי שבועות</string>
<string name="vibrate">רטט בהתרעת תזכורת</string>
<string name="reminder_sound">צליל תזכורת</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Manage event types</string>
<string name="start_day_at">Start day at</string>
<string name="end_day_at">End day at</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">सफ्ताह क्रमांक दिखाए</string>
<string name="vibrate">Vibrate on reminder notification</string>
<string name="reminder_sound">Reminder sound</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Upravljanje vrstama događaja</string>
<string name="start_day_at">Započni dan u</string>
<string name="end_day_at">Završi dan u</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Pokaži tjedne brojeve</string>
<string name="vibrate">Vibrirajte na obavijesti podsjetnika</string>
<string name="reminder_sound">Zvuk podsjetnika</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Manage event types</string>
<string name="start_day_at">Start day at</string>
<string name="end_day_at">End day at</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Hetek sorszámának mutatása</string>
<string name="vibrate">Emlékeztetőnél rezgés</string>
<string name="reminder_sound">Reminder sound</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Kelola kategori acara</string>
<string name="start_day_at">Hari dimulai pada jam</string>
<string name="end_day_at">Hari berakhir pada jam</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Tampilkan nomor minggu</string>
<string name="vibrate">Getar pada notifikasi pengingat</string>
<string name="reminder_sound">Suara pengingat</string>

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">Kelola kategori acara</string>
<string name="start_day_at">Hari dimulai pada jam</string>
<string name="end_day_at">Hari berakhir pada jam</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Tampilkan nomor minggu</string>
<string name="vibrate">Getar pada notifikasi pengingat</string>
<string name="reminder_sound">Suara pengingat</string>

View File

@ -86,14 +86,14 @@
<string name="birthdays">Compleanni</string>
<string name="add_birthdays">Aggiungi compleanni dai contatti</string>
<string name="no_birthdays">Nessun compleanno trovato</string>
<string name="no_new_birthdays">No new birthdays have been found</string>
<string name="no_new_birthdays">Nessun nuovo compleanno trovato</string>
<string name="birthdays_added">Compleanni aggiunti con successo</string>
<!-- Anniversaries -->
<string name="anniversaries">Anniversari</string>
<string name="add_anniversaries">Aggiungi anniversari dai contatti</string>
<string name="no_anniversaries">Nessun anniversario trovato</string>
<string name="no_new_anniversaries">No new anniversaries have been found</string>
<string name="no_new_anniversaries">Nessun nuovo anniversario trovato</string>
<string name="anniversaries_added">Anniversari aggiunti con successo</string>
<!-- Event Reminders -->
@ -111,7 +111,7 @@
<string name="invited">Invitato</string>
<!-- Time zones -->
<string name="enter_a_country">Enter a country or time zone</string>
<string name="enter_a_country">Inserisci un paese o un fuso orario</string>
<!-- Export / Import -->
<string name="import_events">Importa eventi</string>
@ -158,6 +158,7 @@
<string name="manage_event_types">Gestisci i tipi di evento</string>
<string name="start_day_at">Il giorno inizia alle</string>
<string name="end_day_at">Il giorno finisce alle</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">Mostra numero settimane</string>
<string name="vibrate">Vibra per le notifiche di promemoria</string>
<string name="reminder_sound">Suoneria promemoria</string>
@ -191,8 +192,8 @@
<string name="default_duration">Durata predefinita</string>
<string name="last_used_one">L\'ultimo utilizzato</string>
<string name="other_time">Altro periodo</string>
<string name="highlight_weekends">Highlight weekends on some views</string>
<string name="allow_changing_time_zones">Allow changing event time zones</string>
<string name="highlight_weekends">Evidenzia il fine-settimana in alcune viste</string>
<string name="allow_changing_time_zones">Abilita il cambio del fuso orario negli eventi</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -207,9 +208,9 @@
<string name="synchronization_completed">Sincronizzazione completata</string>
<string name="select_a_different_caldav_color">Seleziona un colore differente (potrebbe essere applicato solamente in locale)</string>
<string name="insufficient_permissions">Non si hanno i permessi per scrivere nel calendario selezionato</string>
<string name="caldav_event_not_found">Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings.</string>
<string name="no_synchronized_calendars">No synchronizable calendars have been found</string>
<string name="caldav_event_not_found">Evento non trovato. Abilita la sincronizzazione CalDAV per il relativo calendario nelle impostazioni dell\'app.</string>
<string name="no_synchronized_calendars">Non é stato trovato nessun calendario sincronizzabile</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">Lunedì</string>
@ -240,9 +241,8 @@
<string name="faq_3_title">Visualizzo i promemoria, ma non sento l\'audio. Cosa posso fare?</string>
<string name="faq_3_text">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.</string>
<string name="faq_4_title">Does the app support time zones?</string>
<string name="faq_4_text">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.</string>
<string name="faq_4_title">L\'app supporta diversi fusi orari?</string>
<string name="faq_4_text">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.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->

View File

@ -158,6 +158,7 @@
<string name="manage_event_types">נהל סוגי אירועים</string>
<string name="start_day_at">שעת התחלה היום</string>
<string name="end_day_at">שעת סיום היום</string>
<string name="allow_customizing_day_count">Allow customizing day count</string>
<string name="week_numbers">הצגת מספרי שבועות</string>
<string name="vibrate">רטט בהתרעת תזכורת</string>
<string name="reminder_sound">צליל תזכורת</string>

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