mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-06-05 21:59:17 +02:00
17
CHANGELOG.md
17
CHANGELOG.md
@@ -1,6 +1,23 @@
|
||||
Changelog
|
||||
==========
|
||||
|
||||
Version 6.13.1 *(2021-03-10)*
|
||||
----------------------------
|
||||
|
||||
* Allow repeating events every fifth weekday
|
||||
* Properly highlight weekends on widgets, if selected so
|
||||
* Fixed some CalDAV syncing and .ics file importing issues
|
||||
|
||||
Version 6.13.0 *(2021-02-23)*
|
||||
----------------------------
|
||||
|
||||
* Added a new combination of monthly + daily view
|
||||
* Fixed too big background activity with CalDAV sync enabled
|
||||
* Fixed some glitches at importing .ics files
|
||||
* Fixed a glitch at new events having wrong date set by default in some cases
|
||||
* Added a setting item for quick notification customizing on Android 8+
|
||||
* Added some translation and stability improvements
|
||||
|
||||
Version 6.12.0 *(2021-02-13)*
|
||||
----------------------------
|
||||
|
||||
|
@@ -11,15 +11,14 @@ if (keystorePropertiesFile.exists()) {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 29
|
||||
buildToolsVersion "29.0.3"
|
||||
compileSdkVersion 30
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.simplemobiletools.calendar.pro"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 29
|
||||
versionCode 191
|
||||
versionName "6.12.0"
|
||||
targetSdkVersion 30
|
||||
versionCode 193
|
||||
versionName "6.13.1"
|
||||
multiDexEnabled true
|
||||
setProperty("archivesBaseName", "calendar")
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
@@ -64,8 +63,8 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.simplemobiletools:commons:5.33.35'
|
||||
implementation 'joda-time:joda-time:2.10.1'
|
||||
implementation 'com.simplemobiletools:commons:5.34.21'
|
||||
implementation 'joda-time:joda-time:2.10.3'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||
|
@@ -67,8 +67,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Bhogi
|
||||
UID:ind_9
|
||||
DTSTART;VALUE=DATE:20160114
|
||||
DTEND;VALUE=DATE:20160115
|
||||
DTSTART;VALUE=DATE:20220113
|
||||
DTEND;VALUE=DATE:20220114
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20180113}
|
||||
@@ -92,8 +92,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Maha Shivaratri
|
||||
UID:ind_12
|
||||
DTSTART;VALUE=DATE:20160226
|
||||
DTEND;VALUE=DATE:20160227
|
||||
DTSTART;VALUE=DATE:20220301
|
||||
DTEND;VALUE=DATE:20220302
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20170225}
|
||||
@@ -101,16 +101,16 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Solar Eclipse [Total]
|
||||
UID:ind_13
|
||||
DTSTART:20160309T005800Z
|
||||
DTEND:20160309T010200Z
|
||||
DTSTART;VALUE=DATE:20211204
|
||||
DTEND;VALUE=DATE:20211205
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Holi
|
||||
UID:ind_14
|
||||
DTSTART;VALUE=DATE:20160323
|
||||
DTEND;VALUE=DATE:20160324
|
||||
DTSTART;VALUE=DATE:20210328
|
||||
DTEND;VALUE=DATE:20210329
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
@@ -182,16 +182,16 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Sri Ram navami
|
||||
UID:ind_23
|
||||
DTSTART;VALUE=DATE:20160415
|
||||
DTEND;VALUE=DATE:20160416
|
||||
DTSTART;VALUE=DATE:20160421
|
||||
DTEND;VALUE=DATE:20160422
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Mahavir Jayanti
|
||||
UID:ind_24
|
||||
DTSTART;VALUE=DATE:20160419
|
||||
DTEND;VALUE=DATE:20160420
|
||||
DTSTART;VALUE=DATE:20210425
|
||||
DTEND;VALUE=DATE:20210426
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20180420}
|
||||
@@ -215,8 +215,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Buddha Purnima
|
||||
UID:ind_27
|
||||
DTSTART;VALUE=DATE:20160521
|
||||
DTEND;VALUE=DATE:20160522
|
||||
DTSTART;VALUE=DATE:20210526
|
||||
DTEND;VALUE=DATE:20210527
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20170522}
|
||||
@@ -224,8 +224,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Raksha Bandhan
|
||||
UID:ind_28
|
||||
DTSTART;VALUE=DATE:20160705
|
||||
DTEND;VALUE=DATE:20160706
|
||||
DTSTART;VALUE=DATE:20210822
|
||||
DTEND;VALUE=DATE:20210823
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20170706}
|
||||
@@ -233,8 +233,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Parsi New Year
|
||||
UID:ind_29
|
||||
DTSTART;VALUE=DATE:20160817
|
||||
DTEND;VALUE=DATE:20160818
|
||||
DTSTART;VALUE=DATE:20220819
|
||||
DTEND;VALUE=DATE:20220820
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20180818}
|
||||
@@ -242,8 +242,8 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Janmashtami
|
||||
UID:ind_30
|
||||
DTSTART;VALUE=DATE:20160825
|
||||
DTEND;VALUE=DATE:20160826
|
||||
DTSTART;VALUE=DATE:20210831
|
||||
DTEND;VALUE=DATE:20210901
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
EXDATE:20170826}
|
||||
@@ -251,24 +251,24 @@ END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Solar Eclipse [Annular]
|
||||
UID:ind_31
|
||||
DTSTART:20160901T070800Z
|
||||
DTEND:20160901T071200Z
|
||||
DTSTART;VALUE=DATE:20210610
|
||||
DTEND;VALUE=DATE:20210611
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Ganesh Chaturthi
|
||||
UID:ind_32
|
||||
DTSTART;VALUE=DATE:20160905
|
||||
DTEND;VALUE=DATE:20160906
|
||||
DTSTART;VALUE=DATE:20210910
|
||||
DTEND;VALUE=DATE:20210911
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
SUMMARY:Onam
|
||||
UID:ind_33
|
||||
DTSTART;VALUE=DATE:20160913
|
||||
DTEND;VALUE=DATE:20160914
|
||||
DTSTART;VALUE=DATE:20220907
|
||||
DTEND;VALUE=DATE:20220908
|
||||
STATUS:CONFIRMED
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
END:VEVENT
|
||||
|
@@ -70,12 +70,13 @@ SUMMARY:海の日 / Umi no hi / Marine Day
|
||||
RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO
|
||||
DTSTART;VALUE=DATE:20070716
|
||||
DTEND;VALUE=DATE:20070717
|
||||
EXDATE:20200720,20210719
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_10
|
||||
SUMMARY:体育の日 / Taiiku no hi / Health-Sports Day
|
||||
RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO
|
||||
RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO;UNTIL=20191231
|
||||
DTSTART;VALUE=DATE:20071008
|
||||
DTEND;VALUE=DATE:20071009
|
||||
END:VEVENT
|
||||
@@ -99,7 +100,7 @@ BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_13
|
||||
SUMMARY:天皇誕生日 / Tennō tanjōbi / Emperor Akihito's Birthday
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20190430
|
||||
DTSTART;VALUE=DATE:20071223
|
||||
DTEND;VALUE=DATE:20071224
|
||||
END:VEVENT
|
||||
@@ -370,6 +371,7 @@ SUMMARY:山の日 / Yama no hi / Mountain Day
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
DTSTART;VALUE=DATE:20160811
|
||||
DTEND;VALUE=DATE:20160812
|
||||
EXDATE:20200811,20210811
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
@@ -378,4 +380,105 @@ SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
|
||||
DTSTART;VALUE=DATE:20190812
|
||||
DTEND;VALUE=DATE:20190813
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_52
|
||||
SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
|
||||
DTSTART;VALUE=DATE:20200224
|
||||
DTEND;VALUE=DATE:20200225
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_53
|
||||
SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
|
||||
DTSTART;VALUE=DATE:20210809
|
||||
DTEND;VALUE=DATE:20210810
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_54
|
||||
SUMMARY:国民の休日 / Kokumin no kyūjitsu / National Holiday
|
||||
DTSTART;VALUE=DATE:20190430
|
||||
DTEND;VALUE=DATE:20190501
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_55
|
||||
SUMMARY:国民の休日 / Kokumin no kyūjitsu / National Holiday
|
||||
DTSTART;VALUE=DATE:20190502
|
||||
DTEND;VALUE=DATE:20190503
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_56
|
||||
SUMMARY:即位礼正殿の儀 / Sokuireiseiden no gi
|
||||
DTSTART;VALUE=DATE:20191022
|
||||
DTEND;VALUE=DATE:20191023
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_57
|
||||
SUMMARY:即位の日 / Sokui no hi / Emperor Naruhito's Enthronement Day
|
||||
DTSTART;VALUE=DATE:20190501
|
||||
DTEND;VALUE=DATE:20190502
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_58
|
||||
SUMMARY:天皇誕生日 / Tennō tanjōbi / Emperor Naruhito's Birthday
|
||||
RRULE:FREQ=YEARLY;INTERVAL=1
|
||||
DTSTART;VALUE=DATE:20200223
|
||||
DTEND;VALUE=DATE:20200224
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_59
|
||||
SUMMARY:海の日 / Umi no hi / Marine Day
|
||||
DTSTART;VALUE=DATE:20200723
|
||||
DTEND;VALUE=DATE:20200724
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_60
|
||||
SUMMARY:海の日 / Umi no hi / Marine Day
|
||||
DTSTART;VALUE=DATE:20210722
|
||||
DTEND;VALUE=DATE:20210723
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_61
|
||||
SUMMARY:山の日 / Yama no hi / Mountain Day
|
||||
DTSTART;VALUE=DATE:20200810
|
||||
DTEND;VALUE=DATE:20200811
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_62
|
||||
SUMMARY:山の日 / Yama no hi / Mountain Day
|
||||
DTSTART;VALUE=DATE:20210808
|
||||
DTEND;VALUE=DATE:20210809
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_63
|
||||
SUMMARY:スポーツの日 / Supōtu o hi / Sports Day
|
||||
RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO
|
||||
DTSTART;VALUE=DATE:20201012
|
||||
DTEND;VALUE=DATE:20201013
|
||||
EXDATE:20201012,20211011
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_64
|
||||
SUMMARY:スポーツの日 / Supōtu o hi / Sports Day
|
||||
DTSTART;VALUE=DATE:20200724
|
||||
DTEND;VALUE=DATE:20200725
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
STATUS:CONFIRMED
|
||||
UID:jap_65
|
||||
SUMMARY:スポーツの日 / Supōtu o hi / Sports Day
|
||||
DTSTART;VALUE=DATE:20210723
|
||||
DTEND;VALUE=DATE:20210724
|
||||
END:VEVENT
|
||||
END:VCALENDAR
|
||||
|
@@ -256,7 +256,8 @@ class EventActivity : SimpleActivity() {
|
||||
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 millis = System.currentTimeMillis()
|
||||
(DateTimeZone.forID(mEvent.getTimeZoneString()).getOffset(millis) - DateTimeZone.forID(original).getOffset(millis)) / 1000L
|
||||
}
|
||||
|
||||
val newStartTS = mEventStartDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds() - offset
|
||||
@@ -289,9 +290,9 @@ class EventActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
val reminders = getReminders()
|
||||
if (event_title.value != mEvent.title ||
|
||||
event_location.value != mEvent.location ||
|
||||
event_description.value != mEvent.description ||
|
||||
if (event_title.text.toString() != mEvent.title ||
|
||||
event_location.text.toString() != mEvent.location ||
|
||||
event_description.text.toString() != mEvent.description ||
|
||||
event_time_zone.text != mEvent.getTimeZoneString() ||
|
||||
reminders != mEvent.getReminders() ||
|
||||
mRepeatInterval != mEvent.repeatInterval ||
|
||||
@@ -644,17 +645,9 @@ class EventActivity : SimpleActivity() {
|
||||
private fun getAvailableMonthlyRepetitionRules(): ArrayList<RadioItem> {
|
||||
val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_monthly)))
|
||||
|
||||
// split Every Last Sunday and Every Fourth Sunday of the month, if the month has 4 sundays
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
if (isLastWeekDayOfMonth()) {
|
||||
val order = (mEventStartDateTime.dayOfMonth - 1) / 7 + 1
|
||||
if (order == 4) {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
} else if (order == 5) {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
}
|
||||
} else {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
}
|
||||
|
||||
if (isLastDayOfTheMonth()) {
|
||||
@@ -666,16 +659,9 @@ class EventActivity : SimpleActivity() {
|
||||
private fun getAvailableYearlyRepetitionRules(): ArrayList<RadioItem> {
|
||||
val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_yearly)))
|
||||
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
if (isLastWeekDayOfMonth()) {
|
||||
val order = (mEventStartDateTime.dayOfMonth - 1) / 7 + 1
|
||||
if (order == 4) {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
} else if (order == 5) {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
}
|
||||
} else {
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
|
||||
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
|
||||
}
|
||||
|
||||
return items
|
||||
@@ -711,7 +697,7 @@ class EventActivity : SimpleActivity() {
|
||||
private fun getOrderString(repeatRule: Int): String {
|
||||
val dayOfMonth = mEventStartDateTime.dayOfMonth
|
||||
var order = (dayOfMonth - 1) / 7 + 1
|
||||
if (order == 4 && isLastWeekDayOfMonth() && repeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST) {
|
||||
if (isLastWeekDayOfMonth() && repeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST) {
|
||||
order = -1
|
||||
}
|
||||
|
||||
@@ -721,6 +707,7 @@ class EventActivity : SimpleActivity() {
|
||||
2 -> if (isMale) R.string.second_m else R.string.second_f
|
||||
3 -> if (isMale) R.string.third_m else R.string.third_f
|
||||
4 -> if (isMale) R.string.fourth_m else R.string.fourth_f
|
||||
5 -> if (isMale) R.string.fifth_m else R.string.fifth_f
|
||||
else -> if (isMale) R.string.last_m else R.string.last_f
|
||||
})
|
||||
}
|
||||
|
@@ -172,6 +172,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
shouldGoToTodayBeVisible = currentFragments.last().shouldGoToTodayBeVisible()
|
||||
menu.apply {
|
||||
goToTodayButton = findItem(R.id.go_to_today)
|
||||
findItem(R.id.print).isVisible = config.storedView != MONTHLY_DAILY_VIEW
|
||||
findItem(R.id.filter).isVisible = mShouldFilterBeVisible
|
||||
findItem(R.id.go_to_today).isVisible = shouldGoToTodayBeVisible && !mIsSearchOpen
|
||||
findItem(R.id.go_to_date).isVisible = config.storedView != EVENTS_LIST_VIEW
|
||||
@@ -933,11 +934,11 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
val licenses = LICENSE_JODA
|
||||
|
||||
val faqItems = arrayListOf(
|
||||
FAQItem(R.string.faq_1_title_commons, R.string.faq_1_text_commons),
|
||||
FAQItem(R.string.faq_4_title_commons, R.string.faq_4_text_commons),
|
||||
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
|
||||
FAQItem(R.string.faq_2_title, R.string.faq_2_text),
|
||||
FAQItem(R.string.faq_3_title, R.string.faq_3_text),
|
||||
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
|
||||
FAQItem(R.string.faq_1_title_commons, R.string.faq_1_text_commons),
|
||||
FAQItem(R.string.faq_4_title_commons, R.string.faq_4_text_commons),
|
||||
FAQItem(R.string.faq_4_title, R.string.faq_4_text),
|
||||
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
|
||||
FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons),
|
||||
@@ -955,7 +956,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
search_results_list.beVisibleIf(events.isNotEmpty())
|
||||
search_placeholder.beVisibleIf(events.isEmpty())
|
||||
val listItems = getEventListItems(events)
|
||||
val eventsAdapter = EventListAdapter(this, listItems, true, this, search_results_list) {
|
||||
val eventsAdapter = EventListAdapter(this, listItems, true, this, search_results_list, true) {
|
||||
if (it is ListEvent) {
|
||||
Intent(applicationContext, EventActivity::class.java).apply {
|
||||
putExtra(EVENT_ID, it.id)
|
||||
|
@@ -43,6 +43,7 @@ class SettingsActivity : SimpleActivity() {
|
||||
|
||||
private fun setupSettingItems() {
|
||||
setupCustomizeColors()
|
||||
setupCustomizeNotifications()
|
||||
setupUseEnglish()
|
||||
setupManageEventTypes()
|
||||
setupHourFormat()
|
||||
@@ -139,6 +140,13 @@ class SettingsActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupCustomizeNotifications() {
|
||||
settings_customize_notifications_holder.beVisibleIf(isOreoPlus())
|
||||
settings_customize_notifications_holder.setOnClickListener {
|
||||
launchCustomizeNotificationsIntent()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupUseEnglish() {
|
||||
settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en")
|
||||
settings_use_english.isChecked = config.useEnglish
|
||||
@@ -340,11 +348,11 @@ class SettingsActivity : SimpleActivity() {
|
||||
updateReminderSound(it)
|
||||
}
|
||||
}, onAlarmSoundDeleted = {
|
||||
if (it.uri == config.reminderSoundUri) {
|
||||
val defaultAlarm = getDefaultAlarmSound(RingtoneManager.TYPE_NOTIFICATION)
|
||||
updateReminderSound(defaultAlarm)
|
||||
}
|
||||
})
|
||||
if (it.uri == config.reminderSoundUri) {
|
||||
val defaultAlarm = getDefaultAlarmSound(RingtoneManager.TYPE_NOTIFICATION)
|
||||
updateReminderSound(defaultAlarm)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,12 +9,12 @@ import android.widget.SeekBar
|
||||
import com.simplemobiletools.calendar.pro.R
|
||||
import com.simplemobiletools.calendar.pro.extensions.config
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||
import com.simplemobiletools.calendar.pro.helpers.LOW_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.helpers.MyWidgetDateProvider
|
||||
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
|
||||
import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.applyColorFilter
|
||||
import com.simplemobiletools.commons.extensions.setFillWithStroke
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import kotlinx.android.synthetic.main.widget_config_date.*
|
||||
|
||||
class WidgetDateConfigureActivity : SimpleActivity() {
|
||||
@@ -112,7 +112,7 @@ class WidgetDateConfigureActivity : SimpleActivity() {
|
||||
|
||||
private fun updateColors() {
|
||||
mTextColor = mTextColorWithoutTransparency
|
||||
mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOW_ALPHA)
|
||||
mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOWER_ALPHA)
|
||||
mPrimaryColor = config.primaryColor
|
||||
|
||||
config_text_color.setFillWithStroke(mTextColor, Color.BLACK)
|
||||
|
@@ -46,7 +46,7 @@ class WidgetListConfigureActivity : SimpleActivity() {
|
||||
finish()
|
||||
}
|
||||
|
||||
EventListAdapter(this, getListItems(), false, null, config_events_list) {}.apply {
|
||||
EventListAdapter(this, getListItems(), false, null, config_events_list, true) {}.apply {
|
||||
updateTextColor(mTextColor)
|
||||
config_events_list.adapter = this
|
||||
}
|
||||
|
@@ -13,7 +13,6 @@ import com.simplemobiletools.calendar.pro.R
|
||||
import com.simplemobiletools.calendar.pro.extensions.addDayEvents
|
||||
import com.simplemobiletools.calendar.pro.extensions.addDayNumber
|
||||
import com.simplemobiletools.calendar.pro.extensions.config
|
||||
import com.simplemobiletools.calendar.pro.helpers.LOW_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.helpers.MonthlyCalendarImpl
|
||||
import com.simplemobiletools.calendar.pro.helpers.MyWidgetMonthlyProvider
|
||||
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
|
||||
@@ -23,6 +22,7 @@ import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.applyColorFilter
|
||||
import com.simplemobiletools.commons.extensions.beVisible
|
||||
import com.simplemobiletools.commons.extensions.setFillWithStroke
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import kotlinx.android.synthetic.main.first_row.*
|
||||
import kotlinx.android.synthetic.main.top_navigation.*
|
||||
import kotlinx.android.synthetic.main.widget_config_monthly.*
|
||||
@@ -127,7 +127,7 @@ class WidgetMonthlyConfigureActivity : SimpleActivity(), MonthlyCalendar {
|
||||
|
||||
private fun updateColors() {
|
||||
mTextColor = mTextColorWithoutTransparency
|
||||
mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOW_ALPHA)
|
||||
mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOWER_ALPHA)
|
||||
mPrimaryColor = config.primaryColor
|
||||
|
||||
top_left_arrow.applyColorFilter(mTextColor)
|
||||
|
@@ -13,13 +13,13 @@ import com.simplemobiletools.calendar.pro.extensions.shareEvents
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||
import com.simplemobiletools.calendar.pro.helpers.ITEM_EVENT
|
||||
import com.simplemobiletools.calendar.pro.helpers.ITEM_EVENT_SIMPLE
|
||||
import com.simplemobiletools.calendar.pro.helpers.LOW_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.models.Event
|
||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||
import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.applyColorFilter
|
||||
import com.simplemobiletools.commons.extensions.beInvisible
|
||||
import com.simplemobiletools.commons.extensions.beInvisibleIf
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
import kotlinx.android.synthetic.main.event_item_day_view.view.*
|
||||
@@ -136,7 +136,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
|
||||
|
||||
var newTextColor = textColor
|
||||
if (dimPastEvents && event.isPastEvent && !isPrintVersion) {
|
||||
newTextColor = newTextColor.adjustAlpha(LOW_ALPHA)
|
||||
newTextColor = newTextColor.adjustAlpha(LOWER_ALPHA)
|
||||
}
|
||||
|
||||
event_item_start.setTextColor(newTextColor)
|
||||
|
@@ -20,6 +20,7 @@ import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.applyColorFilter
|
||||
import com.simplemobiletools.commons.extensions.beInvisible
|
||||
import com.simplemobiletools.commons.extensions.beInvisibleIf
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
@@ -28,7 +29,7 @@ import kotlinx.android.synthetic.main.event_list_section.view.*
|
||||
import java.util.*
|
||||
|
||||
class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListItem>, val allowLongClick: Boolean, val listener: RefreshRecyclerViewListener?,
|
||||
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
recyclerView: MyRecyclerView, val tryDimPastEvents: Boolean, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
|
||||
private val topDivider = resources.getDrawable(R.drawable.divider_width)
|
||||
private val allDayString = resources.getString(R.string.all_day)
|
||||
@@ -176,9 +177,9 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
|
||||
startTextColor = adjustedPrimaryColor
|
||||
}
|
||||
|
||||
if (dimPastEvents && listEvent.isPastEvent && !isPrintVersion) {
|
||||
startTextColor = startTextColor.adjustAlpha(LOW_ALPHA)
|
||||
endTextColor = endTextColor.adjustAlpha(LOW_ALPHA)
|
||||
if (tryDimPastEvents && dimPastEvents && listEvent.isPastEvent && !isPrintVersion) {
|
||||
startTextColor = startTextColor.adjustAlpha(LOWER_ALPHA)
|
||||
endTextColor = endTextColor.adjustAlpha(LOWER_ALPHA)
|
||||
}
|
||||
} else if (listEvent.startTS <= now && listEvent.endTS >= now && !isPrintVersion) {
|
||||
startTextColor = adjustedPrimaryColor
|
||||
@@ -197,7 +198,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
|
||||
setCompoundDrawablesWithIntrinsicBounds(null, if (position == 0) null else topDivider, null, null)
|
||||
var color = if (listSection.isToday && !isPrintVersion) adjustedPrimaryColor else textColor
|
||||
if (dimPastEvents && listSection.isPastSection && !isPrintVersion) {
|
||||
color = color.adjustAlpha(LOW_ALPHA)
|
||||
color = color.adjustAlpha(LOWER_ALPHA)
|
||||
}
|
||||
setTextColor(color)
|
||||
}
|
||||
|
@@ -22,6 +22,7 @@ import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.setBackgroundColor
|
||||
import com.simplemobiletools.commons.extensions.setText
|
||||
import com.simplemobiletools.commons.extensions.setTextSize
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import org.joda.time.DateTime
|
||||
import java.util.*
|
||||
|
||||
@@ -32,7 +33,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
|
||||
private val allDayString = context.resources.getString(R.string.all_day)
|
||||
private var events = ArrayList<ListItem>()
|
||||
private var textColor = context.config.widgetTextColor
|
||||
private var weakTextColor = textColor.adjustAlpha(LOW_ALPHA)
|
||||
private var weakTextColor = textColor.adjustAlpha(LOWER_ALPHA)
|
||||
private val replaceDescription = context.config.replaceDescription
|
||||
private val dimPastEvents = context.config.dimPastEvents
|
||||
private var mediumFontSize = context.getWidgetFontSize()
|
||||
@@ -157,7 +158,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
|
||||
|
||||
override fun onDataSetChanged() {
|
||||
textColor = context.config.widgetTextColor
|
||||
weakTextColor = textColor.adjustAlpha(LOW_ALPHA)
|
||||
weakTextColor = textColor.adjustAlpha(LOWER_ALPHA)
|
||||
mediumFontSize = context.getWidgetFontSize()
|
||||
val fromTS = DateTime().seconds() - context.config.displayPastEvents * 60
|
||||
val toTS = DateTime().plusYears(1).seconds()
|
||||
|
@@ -36,4 +36,6 @@ class MyMonthDayPagerAdapter(fm: FragmentManager, private val mCodes: List<Strin
|
||||
fun printCurrentView(pos: Int) {
|
||||
mFragments[pos].printCurrentView()
|
||||
}
|
||||
|
||||
fun getNewEventDayCode(pos: Int): String = mFragments[pos].getNewEventDayCode()
|
||||
}
|
||||
|
@@ -389,7 +389,7 @@ fun Context.scheduleCalDAVSync(activate: Boolean) {
|
||||
fun Context.addDayNumber(rawTextColor: Int, day: DayMonthly, linearLayout: LinearLayout, dayLabelHeight: Int, callback: (Int) -> Unit) {
|
||||
var textColor = rawTextColor
|
||||
if (!day.isThisMonth)
|
||||
textColor = textColor.adjustAlpha(LOW_ALPHA)
|
||||
textColor = textColor.adjustAlpha(LOWER_ALPHA)
|
||||
|
||||
(View.inflate(applicationContext, R.layout.day_monthly_number_view, null) as TextView).apply {
|
||||
setTextColor(textColor)
|
||||
@@ -456,7 +456,7 @@ fun Context.addDayEvents(day: DayMonthly, linearLayout: LinearLayout, res: Resou
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.getEventListItems(events: List<Event>): ArrayList<ListItem> {
|
||||
fun Context.getEventListItems(events: List<Event>, addSections: Boolean = true): ArrayList<ListItem> {
|
||||
val listItems = ArrayList<ListItem>(events.size)
|
||||
val replaceDescription = config.replaceDescription
|
||||
|
||||
@@ -481,7 +481,7 @@ fun Context.getEventListItems(events: List<Event>): ArrayList<ListItem> {
|
||||
|
||||
sorted.forEach {
|
||||
val code = Formatter.getDayCodeFromTS(it.startTS)
|
||||
if (code != prevCode) {
|
||||
if (code != prevCode && addSections) {
|
||||
val day = Formatter.getDayTitle(this, code)
|
||||
val isToday = day == today
|
||||
val listSection = ListSection(day, code, isToday, !isToday && it.startTS < now)
|
||||
@@ -521,7 +521,6 @@ fun Context.refreshCalDAVCalendars(ids: String, showToasts: Boolean) {
|
||||
}
|
||||
|
||||
Bundle().apply {
|
||||
putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true)
|
||||
putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true)
|
||||
accounts.forEach {
|
||||
ContentResolver.requestSync(it, uri.authority, this)
|
||||
@@ -553,3 +552,11 @@ fun Context.printBitmap(bitmap: Bitmap) {
|
||||
printHelper.orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
printHelper.printBitmap(getString(R.string.app_name), bitmap)
|
||||
}
|
||||
|
||||
fun Context.editEvent(event: ListEvent) {
|
||||
Intent(this, EventActivity::class.java).apply {
|
||||
putExtra(EVENT_ID, event.id)
|
||||
putExtra(EVENT_OCCURRENCE_TS, event.startTS)
|
||||
startActivity(this)
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,5 @@
|
||||
package com.simplemobiletools.calendar.pro.fragments
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
@@ -10,13 +9,10 @@ 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
|
||||
import com.simplemobiletools.calendar.pro.activities.SimpleActivity
|
||||
import com.simplemobiletools.calendar.pro.adapters.EventListAdapter
|
||||
import com.simplemobiletools.calendar.pro.extensions.*
|
||||
import com.simplemobiletools.calendar.pro.helpers.EVENT_ID
|
||||
import com.simplemobiletools.calendar.pro.helpers.EVENT_OCCURRENCE_TS
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||
import com.simplemobiletools.calendar.pro.models.Event
|
||||
import com.simplemobiletools.calendar.pro.models.ListEvent
|
||||
@@ -119,9 +115,9 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
|
||||
|
||||
val currAdapter = mView.calendar_events_list.adapter
|
||||
if (currAdapter == null || forceRecreation) {
|
||||
EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list) {
|
||||
EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list, true) {
|
||||
if (it is ListEvent) {
|
||||
editEvent(it)
|
||||
context?.editEvent(it)
|
||||
}
|
||||
}.apply {
|
||||
mView.calendar_events_list.adapter = this
|
||||
@@ -169,14 +165,6 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
|
||||
mView.calendar_empty_list_placeholder.setTextColor(activity!!.config.textColor)
|
||||
}
|
||||
|
||||
private fun editEvent(event: ListEvent) {
|
||||
Intent(context, EventActivity::class.java).apply {
|
||||
putExtra(EVENT_ID, event.id)
|
||||
putExtra(EVENT_OCCURRENCE_TS, event.startTS)
|
||||
startActivity(this)
|
||||
}
|
||||
}
|
||||
|
||||
private fun fetchPreviousPeriod() {
|
||||
val lastPosition = (mView.calendar_events_list.layoutManager as MyLinearLayoutManager).findLastVisibleItemPosition()
|
||||
bottomItemAtRefresh = (mView.calendar_events_list.adapter as EventListAdapter).listItems[lastPosition]
|
||||
|
@@ -6,34 +6,43 @@ import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
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.activities.SimpleActivity
|
||||
import com.simplemobiletools.calendar.pro.adapters.EventListAdapter
|
||||
import com.simplemobiletools.calendar.pro.extensions.*
|
||||
import com.simplemobiletools.calendar.pro.helpers.Config
|
||||
import com.simplemobiletools.calendar.pro.helpers.DAY_CODE
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter.YEAR_PATTERN
|
||||
import com.simplemobiletools.calendar.pro.helpers.MonthlyCalendarImpl
|
||||
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
|
||||
import com.simplemobiletools.calendar.pro.interfaces.NavigationListener
|
||||
import com.simplemobiletools.calendar.pro.models.DayMonthly
|
||||
import com.simplemobiletools.calendar.pro.models.Event
|
||||
import com.simplemobiletools.calendar.pro.models.ListEvent
|
||||
import com.simplemobiletools.commons.extensions.beVisibleIf
|
||||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import kotlinx.android.synthetic.main.fragment_month_day.*
|
||||
import kotlinx.android.synthetic.main.fragment_month_day.view.*
|
||||
import org.joda.time.DateTime
|
||||
|
||||
class MonthDayFragment : Fragment(), MonthlyCalendar {
|
||||
private var mTextColor = 0
|
||||
class MonthDayFragment : Fragment(), MonthlyCalendar, RefreshRecyclerViewListener {
|
||||
private var mSundayFirst = false
|
||||
private var mShowWeekNumbers = false
|
||||
private var mDayCode = ""
|
||||
private var mSelectedDayCode = ""
|
||||
private var mPackageName = ""
|
||||
private var mLastHash = 0L
|
||||
private var mCalendar: MonthlyCalendarImpl? = null
|
||||
private var mListEvents = ArrayList<Event>()
|
||||
|
||||
var listener: NavigationListener? = null
|
||||
|
||||
lateinit var mRes: Resources
|
||||
lateinit var mHolder: RelativeLayout
|
||||
lateinit var mHolder: ConstraintLayout
|
||||
lateinit var mConfig: Config
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
@@ -42,12 +51,19 @@ class MonthDayFragment : Fragment(), MonthlyCalendar {
|
||||
mPackageName = activity!!.packageName
|
||||
mHolder = view.month_day_calendar_holder
|
||||
mDayCode = arguments!!.getString(DAY_CODE)!!
|
||||
|
||||
val shownMonthDateTime = Formatter.getDateTimeFromCode(mDayCode)
|
||||
mHolder.month_day_selected_day_label.apply {
|
||||
text = getMonthLabel(shownMonthDateTime)
|
||||
setOnClickListener {
|
||||
(activity as MainActivity).showGoToDateDialog()
|
||||
}
|
||||
}
|
||||
|
||||
mConfig = context!!.config
|
||||
storeStateVariables()
|
||||
|
||||
setupButtons()
|
||||
mCalendar = MonthlyCalendarImpl(this, context!!)
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
@@ -91,19 +107,85 @@ class MonthDayFragment : Fragment(), MonthlyCalendar {
|
||||
mLastHash = newHash
|
||||
|
||||
activity?.runOnUiThread {
|
||||
updateDays(days)
|
||||
mHolder.month_day_view_wrapper.updateDays(days, false) {
|
||||
mSelectedDayCode = it.code
|
||||
updateVisibleEvents()
|
||||
}
|
||||
}
|
||||
|
||||
refreshItems()
|
||||
}
|
||||
|
||||
private fun updateVisibleEvents() {
|
||||
if (activity == null) {
|
||||
return
|
||||
}
|
||||
|
||||
val filtered = mListEvents.filter {
|
||||
if (mSelectedDayCode.isEmpty()) {
|
||||
val shownMonthDateTime = Formatter.getDateTimeFromCode(mDayCode)
|
||||
val startDateTime = Formatter.getDateTimeFromTS(it.startTS)
|
||||
shownMonthDateTime.year == startDateTime.year && shownMonthDateTime.monthOfYear == startDateTime.monthOfYear
|
||||
} else {
|
||||
Formatter.getDayCodeFromTS(it.startTS) == mSelectedDayCode
|
||||
}
|
||||
}
|
||||
|
||||
val listItems = activity!!.getEventListItems(filtered, false)
|
||||
if (mSelectedDayCode.isNotEmpty()) {
|
||||
mHolder.month_day_selected_day_label.text = Formatter.getDateFromCode(activity!!, mSelectedDayCode, false)
|
||||
}
|
||||
|
||||
activity?.runOnUiThread {
|
||||
if (activity != null) {
|
||||
mHolder.month_day_events_list.beVisibleIf(listItems.isNotEmpty())
|
||||
mHolder.month_day_no_events_placeholder.beVisibleIf(listItems.isEmpty())
|
||||
|
||||
val currAdapter = mHolder.month_day_events_list.adapter
|
||||
if (currAdapter == null) {
|
||||
EventListAdapter(activity as SimpleActivity, listItems, true, this, month_day_events_list, false) {
|
||||
if (it is ListEvent) {
|
||||
activity?.editEvent(it)
|
||||
}
|
||||
}.apply {
|
||||
month_day_events_list.adapter = this
|
||||
}
|
||||
} else {
|
||||
(currAdapter as EventListAdapter).updateListItems(listItems)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupButtons() {
|
||||
mTextColor = mConfig.textColor
|
||||
}
|
||||
|
||||
private fun updateDays(days: ArrayList<DayMonthly>) {
|
||||
mHolder.month_day_view_wrapper.updateDays(days, false) {
|
||||
// (activity as MainActivity).openDayFromMonthly(Formatter.getDateTimeFromCode(it.code))
|
||||
val textColor = mConfig.textColor
|
||||
mHolder.apply {
|
||||
month_day_selected_day_label.setTextColor(textColor)
|
||||
month_day_no_events_placeholder.setTextColor(textColor)
|
||||
}
|
||||
}
|
||||
|
||||
fun printCurrentView() {}
|
||||
|
||||
fun getNewEventDayCode() = if (mSelectedDayCode.isEmpty()) mDayCode else mSelectedDayCode
|
||||
|
||||
private fun getMonthLabel(shownMonthDateTime: DateTime): String {
|
||||
var month = Formatter.getMonthName(activity!!, shownMonthDateTime.monthOfYear)
|
||||
val targetYear = shownMonthDateTime.toString(YEAR_PATTERN)
|
||||
if (targetYear != DateTime().toString(YEAR_PATTERN)) {
|
||||
month += " $targetYear"
|
||||
}
|
||||
return month
|
||||
}
|
||||
|
||||
override fun refreshItems() {
|
||||
val startDateTime = Formatter.getLocalDateTimeFromCode(mDayCode).minusWeeks(1)
|
||||
val endDateTime = startDateTime.plusWeeks(6)
|
||||
activity?.eventsHelper?.getEvents(startDateTime.seconds(), endDateTime.seconds()) { events ->
|
||||
mListEvents = events
|
||||
activity?.runOnUiThread {
|
||||
updateVisibleEvents()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -139,7 +139,12 @@ class MonthDayFragmentsHolder : MyFragmentHolder(), NavigationListener {
|
||||
(activity as? MainActivity)?.updateActionBarTitle(getString(R.string.app_launcher_name))
|
||||
}
|
||||
|
||||
override fun getNewEventDayCode() = if (shouldGoToTodayBeVisible()) currentDayCode else todayDayCode
|
||||
override fun getNewEventDayCode() = (viewPager?.adapter as? MyMonthDayPagerAdapter)?.getNewEventDayCode(viewPager?.currentItem ?: 0)
|
||||
?: if (shouldGoToTodayBeVisible()) {
|
||||
currentDayCode
|
||||
} else {
|
||||
todayDayCode
|
||||
}
|
||||
|
||||
override fun printView() {}
|
||||
}
|
||||
|
@@ -25,6 +25,8 @@ import com.simplemobiletools.calendar.pro.models.EventWeeklyView
|
||||
import com.simplemobiletools.calendar.pro.views.MyScrollView
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.DAY_SECONDS
|
||||
import com.simplemobiletools.commons.helpers.HIGHER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.WEEK_SECONDS
|
||||
import com.simplemobiletools.commons.views.MyTextView
|
||||
import kotlinx.android.synthetic.main.fragment_week.*
|
||||
@@ -449,9 +451,10 @@ 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)
|
||||
val textColor = backgroundColor.getContrastColor()
|
||||
var textColor = backgroundColor.getContrastColor()
|
||||
if (dimPastEvents && event.isPastEvent && !isPrintVersion) {
|
||||
backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA)
|
||||
backgroundColor = backgroundColor.adjustAlpha(LOWER_ALPHA)
|
||||
textColor = textColor.adjustAlpha(HIGHER_ALPHA)
|
||||
}
|
||||
|
||||
background = ColorDrawable(backgroundColor)
|
||||
@@ -555,9 +558,10 @@ class WeekFragment : Fragment(), WeeklyCalendar {
|
||||
private fun addAllDayEvent(event: Event) {
|
||||
(inflater.inflate(R.layout.week_all_day_event_marker, null, false) as TextView).apply {
|
||||
var backgroundColor = eventTypeColors.get(event.eventType, primaryColor)
|
||||
val textColor = backgroundColor.getContrastColor()
|
||||
var textColor = backgroundColor.getContrastColor()
|
||||
if (dimPastEvents && event.isPastEvent && !isPrintVersion) {
|
||||
backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA)
|
||||
backgroundColor = backgroundColor.adjustAlpha(LOWER_ALPHA)
|
||||
textColor = textColor.adjustAlpha(HIGHER_ALPHA)
|
||||
}
|
||||
background = ColorDrawable(backgroundColor)
|
||||
|
||||
|
@@ -13,8 +13,7 @@ import com.simplemobiletools.calendar.pro.extensions.*
|
||||
import com.simplemobiletools.calendar.pro.models.*
|
||||
import com.simplemobiletools.calendar.pro.objects.States.isUpdatingCalDAV
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALENDAR
|
||||
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALENDAR
|
||||
import com.simplemobiletools.commons.helpers.*
|
||||
import org.joda.time.DateTimeZone
|
||||
import org.joda.time.format.DateTimeFormat
|
||||
import java.util.*
|
||||
@@ -43,6 +42,7 @@ class CalDAVHelper(val context: Context) {
|
||||
|
||||
fetchCalDAVCalendarEvents(calendar.id, localEventType.id!!, showToasts)
|
||||
}
|
||||
|
||||
context.scheduleCalDAVSync(true)
|
||||
callback()
|
||||
} finally {
|
||||
@@ -59,13 +59,13 @@ class CalDAVHelper(val context: Context) {
|
||||
|
||||
val uri = Calendars.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
Calendars._ID,
|
||||
Calendars.CALENDAR_DISPLAY_NAME,
|
||||
Calendars.ACCOUNT_NAME,
|
||||
Calendars.ACCOUNT_TYPE,
|
||||
Calendars.OWNER_ACCOUNT,
|
||||
Calendars.CALENDAR_COLOR,
|
||||
Calendars.CALENDAR_ACCESS_LEVEL)
|
||||
Calendars._ID,
|
||||
Calendars.CALENDAR_DISPLAY_NAME,
|
||||
Calendars.ACCOUNT_NAME,
|
||||
Calendars.ACCOUNT_TYPE,
|
||||
Calendars.OWNER_ACCOUNT,
|
||||
Calendars.CALENDAR_COLOR,
|
||||
Calendars.CALENDAR_ACCESS_LEVEL)
|
||||
|
||||
val selection = if (ids.trim().isNotEmpty()) "${Calendars._ID} IN ($ids)" else null
|
||||
context.queryCursor(uri, projection, selection, showErrors = showToasts) { cursor ->
|
||||
@@ -83,39 +83,38 @@ class CalDAVHelper(val context: Context) {
|
||||
return calendars
|
||||
}
|
||||
|
||||
// check if the calendars color or title has changed
|
||||
fun updateCalDAVCalendar(eventType: EventType) {
|
||||
val uri = Calendars.CONTENT_URI
|
||||
val values = fillCalendarContentValues(eventType)
|
||||
val newUri = ContentUris.withAppendedId(uri, eventType.caldavCalendarId.toLong())
|
||||
try {
|
||||
context.contentResolver.update(newUri, values, null, null)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
}
|
||||
}
|
||||
val projection = arrayOf(
|
||||
Calendars.CALENDAR_COLOR_KEY,
|
||||
Calendars.CALENDAR_COLOR,
|
||||
Calendars.CALENDAR_DISPLAY_NAME
|
||||
)
|
||||
|
||||
private fun fillCalendarContentValues(eventType: EventType): ContentValues {
|
||||
val colorKey = getEventTypeColorKey(eventType)
|
||||
return ContentValues().apply {
|
||||
put(Calendars.CALENDAR_COLOR_KEY, colorKey)
|
||||
put(Calendars.CALENDAR_DISPLAY_NAME, eventType.title)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun getEventTypeColorKey(eventType: EventType): Int {
|
||||
val uri = Colors.CONTENT_URI
|
||||
val projection = arrayOf(Colors.COLOR_KEY)
|
||||
val selection = "${Colors.COLOR_TYPE} = ? AND ${Colors.COLOR} = ? AND ${Colors.ACCOUNT_NAME} = ?"
|
||||
val selectionArgs = arrayOf(Colors.TYPE_CALENDAR.toString(), eventType.color.toString(), eventType.caldavEmail)
|
||||
|
||||
val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||
cursor?.use {
|
||||
if (cursor.moveToFirst()) {
|
||||
return cursor.getStringValue(Colors.COLOR_KEY).toInt()
|
||||
context.queryCursor(newUri, projection) { cursor ->
|
||||
val properColorKey = cursor.getIntValue(Calendars.CALENDAR_COLOR_KEY)
|
||||
val properColor = cursor.getIntValue(Calendars.CALENDAR_COLOR)
|
||||
val displayName = cursor.getStringValue(Calendars.CALENDAR_DISPLAY_NAME)
|
||||
if (eventType.color != properColor || displayName != eventType.title) {
|
||||
val values = fillCalendarContentValues(properColorKey, displayName)
|
||||
try {
|
||||
context.contentResolver.update(newUri, values, null, null)
|
||||
eventType.color = properColor
|
||||
eventType.title = displayName
|
||||
context.eventTypesDB.insertOrUpdate(eventType)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
private fun fillCalendarContentValues(colorKey: Int, title: String): ContentValues {
|
||||
return ContentValues().apply {
|
||||
put(Calendars.CALENDAR_COLOR_KEY, colorKey)
|
||||
put(Calendars.CALENDAR_DISPLAY_NAME, title)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@@ -157,21 +156,21 @@ class CalDAVHelper(val context: Context) {
|
||||
|
||||
val uri = Events.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
Events._ID,
|
||||
Events.TITLE,
|
||||
Events.DESCRIPTION,
|
||||
Events.DTSTART,
|
||||
Events.DTEND,
|
||||
Events.DURATION,
|
||||
Events.EXDATE,
|
||||
Events.ALL_DAY,
|
||||
Events.RRULE,
|
||||
Events.ORIGINAL_ID,
|
||||
Events.ORIGINAL_INSTANCE_TIME,
|
||||
Events.EVENT_LOCATION,
|
||||
Events.EVENT_TIMEZONE,
|
||||
Events.CALENDAR_TIME_ZONE,
|
||||
Events.DELETED)
|
||||
Events._ID,
|
||||
Events.TITLE,
|
||||
Events.DESCRIPTION,
|
||||
Events.DTSTART,
|
||||
Events.DTEND,
|
||||
Events.DURATION,
|
||||
Events.EXDATE,
|
||||
Events.ALL_DAY,
|
||||
Events.RRULE,
|
||||
Events.ORIGINAL_ID,
|
||||
Events.ORIGINAL_INSTANCE_TIME,
|
||||
Events.EVENT_LOCATION,
|
||||
Events.EVENT_TIMEZONE,
|
||||
Events.CALENDAR_TIME_ZONE,
|
||||
Events.DELETED)
|
||||
|
||||
val selection = "${Events.CALENDAR_ID} = $calendarId"
|
||||
context.queryCursor(uri, projection, selection, showErrors = showToasts) { cursor ->
|
||||
@@ -203,15 +202,15 @@ class CalDAVHelper(val context: Context) {
|
||||
val reminder3 = reminders.getOrNull(2)
|
||||
val importId = getCalDAVEventImportId(calendarId, id)
|
||||
val eventTimeZone = cursor.getStringValue(Events.EVENT_TIMEZONE)
|
||||
?: cursor.getStringValue(Events.CALENDAR_TIME_ZONE) ?: DateTimeZone.getDefault().id
|
||||
?: cursor.getStringValue(Events.CALENDAR_TIME_ZONE) ?: DateTimeZone.getDefault().id
|
||||
|
||||
val source = "$CALDAV-$calendarId"
|
||||
val repeatRule = Parser().parseRepeatInterval(rrule, startTS)
|
||||
val event = Event(null, startTS, endTS, title, location, description, reminder1?.minutes ?: REMINDER_OFF,
|
||||
reminder2?.minutes ?: REMINDER_OFF, reminder3?.minutes ?: REMINDER_OFF, reminder1?.type
|
||||
?: REMINDER_NOTIFICATION, reminder2?.type ?: REMINDER_NOTIFICATION, reminder3?.type
|
||||
?: REMINDER_NOTIFICATION, repeatRule.repeatInterval, repeatRule.repeatRule,
|
||||
repeatRule.repeatLimit, ArrayList(), attendees, importId, eventTimeZone, allDay, eventTypeId, source = source)
|
||||
reminder2?.minutes ?: REMINDER_OFF, reminder3?.minutes ?: REMINDER_OFF, reminder1?.type
|
||||
?: REMINDER_NOTIFICATION, reminder2?.type ?: REMINDER_NOTIFICATION, reminder3?.type
|
||||
?: REMINDER_NOTIFICATION, repeatRule.repeatInterval, repeatRule.repeatRule,
|
||||
repeatRule.repeatLimit, ArrayList(), attendees, importId, eventTimeZone, allDay, eventTypeId, source = source)
|
||||
|
||||
if (event.getIsAllDay()) {
|
||||
event.startTS = Formatter.getShiftedImportTimestamp(event.startTS)
|
||||
@@ -241,12 +240,13 @@ class CalDAVHelper(val context: Context) {
|
||||
}
|
||||
|
||||
// some calendars add repeatable event exceptions with using the "exdate" field, not by creating a child event that is an exception
|
||||
// exdate can be stored as "20190216T230000Z", but also as "Europe/Madrid;20201208T000000Z"
|
||||
val exdate = cursor.getStringValue(Events.EXDATE) ?: ""
|
||||
if (exdate.length > 8) {
|
||||
val lines = exdate.split("\n")
|
||||
for (line in lines) {
|
||||
val dates = line.split(",")
|
||||
dates.forEach {
|
||||
dates.filter { it.isNotEmpty() && it[0].isDigit() }.forEach {
|
||||
if (it.endsWith("Z")) {
|
||||
// convert for example "20190216T230000Z" to "20190217000000" in Slovakia in a weird way
|
||||
val formatter = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss'Z'")
|
||||
@@ -469,8 +469,8 @@ class CalDAVHelper(val context: Context) {
|
||||
val reminders = ArrayList<Reminder>()
|
||||
val uri = Reminders.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
Reminders.MINUTES,
|
||||
Reminders.METHOD)
|
||||
Reminders.MINUTES,
|
||||
Reminders.METHOD)
|
||||
val selection = "${Reminders.EVENT_ID} = $eventId"
|
||||
|
||||
context.queryCursor(uri, projection, selection) { cursor ->
|
||||
@@ -490,10 +490,10 @@ class CalDAVHelper(val context: Context) {
|
||||
val attendees = ArrayList<Attendee>()
|
||||
val uri = Attendees.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
Attendees.ATTENDEE_NAME,
|
||||
Attendees.ATTENDEE_EMAIL,
|
||||
Attendees.ATTENDEE_STATUS,
|
||||
Attendees.ATTENDEE_RELATIONSHIP)
|
||||
Attendees.ATTENDEE_NAME,
|
||||
Attendees.ATTENDEE_EMAIL,
|
||||
Attendees.ATTENDEE_STATUS,
|
||||
Attendees.ATTENDEE_RELATIONSHIP)
|
||||
val selection = "${Attendees.EVENT_ID} = $eventId"
|
||||
context.queryCursor(uri, projection, selection) { cursor ->
|
||||
val name = cursor.getStringValue(Attendees.ATTENDEE_NAME) ?: ""
|
||||
|
@@ -1,8 +1,8 @@
|
||||
package com.simplemobiletools.calendar.pro.helpers
|
||||
|
||||
const val LOW_ALPHA = .3f
|
||||
const val MEDIUM_ALPHA = .6f
|
||||
const val STORED_LOCALLY_ONLY = 0
|
||||
const val ROW_COUNT = 6
|
||||
const val COLUMN_COUNT = 7
|
||||
|
||||
const val DAY_CODE = "day_code"
|
||||
const val YEAR_LABEL = "year"
|
||||
@@ -163,8 +163,8 @@ fun getNowSeconds() = System.currentTimeMillis() / 1000L
|
||||
|
||||
fun isWeekend(i: Int, isSundayFirst: Boolean): Boolean {
|
||||
return if (isSundayFirst) {
|
||||
i == 0 || i == 6
|
||||
i == 0 || i == 6 || i == 7 || i == 13
|
||||
} else {
|
||||
i == 5 || i == 6
|
||||
i == 5 || i == 6 || i == 12 || i == 13
|
||||
}
|
||||
}
|
||||
|
@@ -73,7 +73,7 @@ class IcsImporter(val activity: SimpleActivity) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (line == BEGIN_EVENT) {
|
||||
if (line.trim() == BEGIN_EVENT) {
|
||||
resetValues()
|
||||
curEventTypeId = defaultEventTypeId
|
||||
isParsingEvent = true
|
||||
@@ -134,7 +134,13 @@ class IcsImporter(val activity: SimpleActivity) {
|
||||
value = value.substring(0, value.length - 1)
|
||||
}
|
||||
|
||||
curRepeatExceptions.add(Formatter.getDayCodeFromTS(getTimestamp(value)))
|
||||
if (value.contains(",")) {
|
||||
value.split(",").forEach { exdate ->
|
||||
curRepeatExceptions.add(Formatter.getDayCodeFromTS(getTimestamp(exdate)))
|
||||
}
|
||||
} else {
|
||||
curRepeatExceptions.add(Formatter.getDayCodeFromTS(getTimestamp(value)))
|
||||
}
|
||||
} else if (line.startsWith(LOCATION)) {
|
||||
curLocation = getLocation(line.substring(LOCATION.length).replace("\\,", ","))
|
||||
if (curLocation.trim().isEmpty()) {
|
||||
@@ -145,14 +151,15 @@ class IcsImporter(val activity: SimpleActivity) {
|
||||
curRecurrenceDayCode = Formatter.getDayCodeFromTS(timestamp)
|
||||
} else if (line.startsWith(SEQUENCE)) {
|
||||
isSequence = true
|
||||
} else if (line == BEGIN_ALARM) {
|
||||
} else if (line.trim() == BEGIN_ALARM) {
|
||||
isNotificationDescription = true
|
||||
} else if (line == END_ALARM) {
|
||||
} else if (line.trim() == END_ALARM) {
|
||||
if (isProperReminderAction && curReminderTriggerMinutes != REMINDER_OFF) {
|
||||
curReminderMinutes.add(curReminderTriggerMinutes)
|
||||
curReminderActions.add(curReminderTriggerAction)
|
||||
}
|
||||
} else if (line == END_EVENT) {
|
||||
isNotificationDescription = false
|
||||
} else if (line.trim() == END_EVENT) {
|
||||
isParsingEvent = false
|
||||
if (curStart != -1L && curEnd == -1L) {
|
||||
curEnd = curStart
|
||||
@@ -246,17 +253,19 @@ class IcsImporter(val activity: SimpleActivity) {
|
||||
|
||||
private fun getTimestamp(fullString: String): Long {
|
||||
return try {
|
||||
if (fullString.startsWith(';')) {
|
||||
val value = fullString.substring(fullString.lastIndexOf(':') + 1).replace(" ", "")
|
||||
if (value.isEmpty()) {
|
||||
return 0
|
||||
} else if (!value.contains("T")) {
|
||||
curFlags = curFlags or FLAG_ALL_DAY
|
||||
}
|
||||
when {
|
||||
fullString.startsWith(';') -> {
|
||||
val value = fullString.substring(fullString.lastIndexOf(':') + 1).replace(" ", "")
|
||||
if (value.isEmpty()) {
|
||||
return 0
|
||||
} else if (!value.contains("T")) {
|
||||
curFlags = curFlags or FLAG_ALL_DAY
|
||||
}
|
||||
|
||||
Parser().parseDateTimeValue(value)
|
||||
} else {
|
||||
Parser().parseDateTimeValue(fullString.substring(1))
|
||||
Parser().parseDateTimeValue(value)
|
||||
}
|
||||
fullString.startsWith(":") -> Parser().parseDateTimeValue(fullString.substring(1))
|
||||
else -> Parser().parseDateTimeValue(fullString)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
activity.showErrorToast(e)
|
||||
|
@@ -18,6 +18,7 @@ import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
|
||||
import com.simplemobiletools.calendar.pro.models.DayMonthly
|
||||
import com.simplemobiletools.calendar.pro.models.Event
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA
|
||||
import org.joda.time.DateTime
|
||||
|
||||
class MyWidgetMonthlyProvider : AppWidgetProvider() {
|
||||
|
@@ -10,9 +10,7 @@ import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.provider.CalendarContract
|
||||
import com.simplemobiletools.calendar.pro.extensions.config
|
||||
import com.simplemobiletools.calendar.pro.extensions.recheckCalDAVCalendars
|
||||
import com.simplemobiletools.calendar.pro.extensions.refreshCalDAVCalendars
|
||||
|
||||
// based on https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
@@ -34,13 +32,13 @@ class CalDAVUpdateListener : JobService() {
|
||||
val uri = CalendarContract.Calendars.CONTENT_URI
|
||||
JobInfo.Builder(CALDAV_EVENT_CONTENT_JOB, componentName).apply {
|
||||
addTriggerContentUri(JobInfo.TriggerContentUri(uri, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
|
||||
context.getSystemService(JobScheduler::class.java).schedule(build())
|
||||
(context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler).schedule(build())
|
||||
}
|
||||
}
|
||||
|
||||
fun isScheduled(context: Context): Boolean {
|
||||
val jobScheduler = context.getSystemService(JobScheduler::class.java)
|
||||
val jobs = jobScheduler.allPendingJobs ?: return false
|
||||
val jobs = jobScheduler.allPendingJobs
|
||||
return jobs.any { it.id == CALDAV_EVENT_CONTENT_JOB }
|
||||
}
|
||||
|
||||
|
@@ -99,10 +99,8 @@ data class Event(
|
||||
private fun addXthDayInterval(currStart: DateTime, original: Event, forceLastWeekday: Boolean): DateTime {
|
||||
val day = currStart.dayOfWeek
|
||||
var order = (currStart.dayOfMonth - 1) / 7
|
||||
val properMonth = currStart.withDayOfMonth(7).plusMonths(repeatInterval / MONTH).withDayOfWeek(day)
|
||||
var firstProperDay = properMonth.dayOfMonth % 7
|
||||
if (firstProperDay == 0)
|
||||
firstProperDay = properMonth.dayOfMonth
|
||||
var properMonth = currStart.withDayOfMonth(7).plusMonths(repeatInterval / MONTH).withDayOfWeek(day)
|
||||
var wantedDay: Int
|
||||
|
||||
// check if it should be for example Fourth Monday, or Last Monday
|
||||
if (forceLastWeekday && (order == 3 || order == 4)) {
|
||||
@@ -112,13 +110,14 @@ data class Event(
|
||||
order = -1
|
||||
}
|
||||
|
||||
val daysCnt = properMonth.dayOfMonth().maximumValue
|
||||
var wantedDay = firstProperDay + order * 7
|
||||
if (wantedDay > daysCnt)
|
||||
wantedDay -= 7
|
||||
|
||||
if (order == -1) {
|
||||
wantedDay = firstProperDay + ((daysCnt - firstProperDay) / 7) * 7
|
||||
wantedDay = properMonth.dayOfMonth + ((properMonth.dayOfMonth().maximumValue - properMonth.dayOfMonth) / 7) * 7
|
||||
} else {
|
||||
wantedDay = properMonth.dayOfMonth + (order - (properMonth.dayOfMonth - 1) / 7) * 7
|
||||
while (properMonth.dayOfMonth().maximumValue < wantedDay) {
|
||||
properMonth = properMonth.withDayOfMonth(7).plusMonths(repeatInterval / MONTH).withDayOfWeek(day)
|
||||
wantedDay = properMonth.dayOfMonth + (order - (properMonth.dayOfMonth - 1) / 7) * 7
|
||||
}
|
||||
}
|
||||
|
||||
return properMonth.withDayOfMonth(wantedDay)
|
||||
|
@@ -1,9 +1,7 @@
|
||||
package com.simplemobiletools.calendar.pro.views
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.RectF
|
||||
import android.graphics.*
|
||||
import android.text.TextPaint
|
||||
import android.text.TextUtils
|
||||
import android.util.AttributeSet
|
||||
@@ -12,10 +10,7 @@ import android.view.View
|
||||
import com.simplemobiletools.calendar.pro.R
|
||||
import com.simplemobiletools.calendar.pro.extensions.config
|
||||
import com.simplemobiletools.calendar.pro.extensions.seconds
|
||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||
import com.simplemobiletools.calendar.pro.helpers.LOW_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.helpers.MEDIUM_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.helpers.isWeekend
|
||||
import com.simplemobiletools.calendar.pro.helpers.*
|
||||
import com.simplemobiletools.calendar.pro.models.DayMonthly
|
||||
import com.simplemobiletools.calendar.pro.models.Event
|
||||
import com.simplemobiletools.calendar.pro.models.MonthViewEvent
|
||||
@@ -23,17 +18,20 @@ import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
|
||||
import com.simplemobiletools.commons.extensions.getContrastColor
|
||||
import com.simplemobiletools.commons.extensions.moveLastItemToFront
|
||||
import com.simplemobiletools.commons.helpers.HIGHER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||
import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA
|
||||
import org.joda.time.DateTime
|
||||
import org.joda.time.Days
|
||||
|
||||
// used in the Monthly view fragment, 1 view per screen
|
||||
class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(context, attrs, defStyle) {
|
||||
private val BG_CORNER_RADIUS = 8f
|
||||
private val ROW_COUNT = 6
|
||||
|
||||
private var textPaint: Paint
|
||||
private var eventTitlePaint: TextPaint
|
||||
private var gridPaint: Paint
|
||||
private var circleStrokePaint: Paint
|
||||
private var config = context.config
|
||||
private var dayWidth = 0f
|
||||
private var dayHeight = 0f
|
||||
@@ -53,9 +51,11 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
private var isMonthDayView = false
|
||||
private var allEvents = ArrayList<MonthViewEvent>()
|
||||
private var bgRectF = RectF()
|
||||
private var dayTextRect = Rect()
|
||||
private var dayLetters = ArrayList<String>()
|
||||
private var days = ArrayList<DayMonthly>()
|
||||
private var dayVerticalOffsets = SparseIntArray()
|
||||
private var selectedDayCoords = Point(-1, -1)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
|
||||
|
||||
@@ -78,7 +78,13 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
}
|
||||
|
||||
gridPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
color = textColor.adjustAlpha(LOW_ALPHA)
|
||||
color = textColor.adjustAlpha(LOWER_ALPHA)
|
||||
}
|
||||
|
||||
circleStrokePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = resources.getDimension(R.dimen.circle_stroke_width)
|
||||
color = primaryColor
|
||||
}
|
||||
|
||||
val smallerTextSize = resources.getDimensionPixelSize(R.dimen.smaller_text_size)
|
||||
@@ -142,7 +148,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
|
||||
var curId = 0
|
||||
for (y in 0 until ROW_COUNT) {
|
||||
for (x in 0..6) {
|
||||
for (x in 0 until COLUMN_COUNT) {
|
||||
val day = days.getOrNull(curId)
|
||||
if (day != null) {
|
||||
dayVerticalOffsets.put(day.indexOnMonthView, dayVerticalOffsets[day.indexOnMonthView] + weekDaysLetterHeight)
|
||||
@@ -150,11 +156,26 @@ 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 && !isPrintVersion) {
|
||||
canvas.drawCircle(xPosCenter, yPos + textPaint.textSize * 0.7f, textPaint.textSize * 0.75f, getCirclePaint(day))
|
||||
val dayNumber = day.value.toString()
|
||||
|
||||
val textPaint = getTextPaint(day)
|
||||
if (selectedDayCoords.x != -1 && x == selectedDayCoords.x && y == selectedDayCoords.y) {
|
||||
canvas.drawCircle(xPosCenter, yPos + textPaint.textSize * 0.7f, textPaint.textSize * 0.8f, circleStrokePaint)
|
||||
if (day.isToday) {
|
||||
textPaint.color = textColor
|
||||
}
|
||||
} else if (day.isToday && !isPrintVersion) {
|
||||
canvas.drawCircle(xPosCenter, yPos + textPaint.textSize * 0.7f, textPaint.textSize * 0.8f, getCirclePaint(day))
|
||||
}
|
||||
|
||||
canvas.drawText(day.value.toString(), xPosCenter, yPos + textPaint.textSize, getTextPaint(day))
|
||||
// mark days with events with a dot
|
||||
if (isMonthDayView && day.dayEvents.isNotEmpty()) {
|
||||
getCirclePaint(day).getTextBounds(dayNumber, 0, dayNumber.length, dayTextRect)
|
||||
val height = dayTextRect.height() * 1.25f
|
||||
canvas.drawCircle(xPosCenter, yPos + height + textPaint.textSize / 2, textPaint.textSize * 0.2f, getDayEventColor(day.dayEvents.first()))
|
||||
}
|
||||
|
||||
canvas.drawText(dayNumber, xPosCenter, yPos + textPaint.textSize, textPaint)
|
||||
dayVerticalOffsets.put(day.indexOnMonthView, (verticalOffset + textPaint.textSize * 2).toInt())
|
||||
}
|
||||
curId++
|
||||
@@ -170,7 +191,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
|
||||
private fun drawGrid(canvas: Canvas) {
|
||||
// vertical lines
|
||||
for (i in 0..6) {
|
||||
for (i in 0 until COLUMN_COUNT) {
|
||||
var lineX = i * dayWidth
|
||||
if (showWeekNumbers) {
|
||||
lineX += horizontalOffset
|
||||
@@ -180,13 +201,13 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
|
||||
// horizontal lines
|
||||
canvas.drawLine(0f, 0f, canvas.width.toFloat(), 0f, gridPaint)
|
||||
for (i in 0..5) {
|
||||
for (i in 0 until ROW_COUNT) {
|
||||
canvas.drawLine(0f, i * dayHeight + weekDaysLetterHeight, canvas.width.toFloat(), i * dayHeight + weekDaysLetterHeight, gridPaint)
|
||||
}
|
||||
}
|
||||
|
||||
private fun addWeekDayLetters(canvas: Canvas) {
|
||||
for (i in 0..6) {
|
||||
for (i in 0 until COLUMN_COUNT) {
|
||||
val xPos = horizontalOffset + (i + 1) * dayWidth - dayWidth / 2
|
||||
var weekDayLetterPaint = textPaint
|
||||
if (i == currDayOfWeek && !isPrintVersion) {
|
||||
@@ -231,7 +252,9 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
val xPosCenter = xPos + dayWidth / 2
|
||||
|
||||
if (verticalOffset - eventTitleHeight * 2 > dayHeight) {
|
||||
canvas.drawText("...", xPosCenter, yPos + verticalOffset - eventTitleHeight / 2, getTextPaint(days[event.startDayIndex]))
|
||||
val paint = getTextPaint(days[event.startDayIndex])
|
||||
paint.color = textColor
|
||||
canvas.drawText("...", xPosCenter, yPos + verticalOffset - eventTitleHeight / 2, paint)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -255,16 +278,16 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
bgRectF.set(bgLeft, bgTop, bgRight, bgBottom)
|
||||
canvas.drawRoundRect(bgRectF, BG_CORNER_RADIUS, BG_CORNER_RADIUS, getEventBackgroundColor(event, startDayIndex, endDayIndex))
|
||||
|
||||
drawEventTitle(event, canvas, xPos, yPos + verticalOffset, bgRight - bgLeft - smallPadding)
|
||||
drawEventTitle(event, canvas, xPos, yPos + verticalOffset, bgRight - bgLeft - smallPadding, startDayIndex, endDayIndex)
|
||||
|
||||
for (i in 0 until Math.min(event.daysCnt, 7 - event.startDayIndex % 7)) {
|
||||
dayVerticalOffsets.put(event.startDayIndex + i, verticalOffset + eventTitleHeight + smallPadding * 2)
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawEventTitle(event: MonthViewEvent, canvas: Canvas, x: Float, y: Float, availableWidth: Float) {
|
||||
private fun drawEventTitle(event: MonthViewEvent, canvas: Canvas, x: Float, y: Float, availableWidth: Float, startDay: DayMonthly, endDay: DayMonthly) {
|
||||
val ellipsized = TextUtils.ellipsize(event.title, eventTitlePaint, availableWidth - smallPadding, TextUtils.TruncateAt.END)
|
||||
canvas.drawText(event.title, 0, ellipsized.length, x + smallPadding * 2, y, getEventTitlePaint(event))
|
||||
canvas.drawText(event.title, 0, ellipsized.length, x + smallPadding * 2, y, getEventTitlePaint(event, startDay, endDay))
|
||||
}
|
||||
|
||||
private fun getTextPaint(startDay: DayMonthly): Paint {
|
||||
@@ -299,9 +322,14 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
return getColoredPaint(paintColor)
|
||||
}
|
||||
|
||||
private fun getEventTitlePaint(event: MonthViewEvent): Paint {
|
||||
private fun getEventTitlePaint(event: MonthViewEvent, startDay: DayMonthly, endDay: DayMonthly): Paint {
|
||||
var paintColor = event.color.getContrastColor()
|
||||
if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent && !isPrintVersion)) {
|
||||
paintColor = paintColor.adjustAlpha(HIGHER_ALPHA)
|
||||
}
|
||||
|
||||
val curPaint = Paint(eventTitlePaint)
|
||||
curPaint.color = event.color.getContrastColor()
|
||||
curPaint.color = paintColor
|
||||
return curPaint
|
||||
}
|
||||
|
||||
@@ -315,6 +343,12 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
return curPaint
|
||||
}
|
||||
|
||||
private fun getDayEventColor(event: Event): Paint {
|
||||
val curPaint = Paint(Paint.ANTI_ALIAS_FLAG)
|
||||
curPaint.color = event.color
|
||||
return curPaint
|
||||
}
|
||||
|
||||
private fun initWeekDayLetters() {
|
||||
dayLetters = context.resources.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
|
||||
if (config.isSundayFirst) {
|
||||
@@ -369,8 +403,13 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
|
||||
}
|
||||
|
||||
textPaint.color = textColor
|
||||
gridPaint.color = textColor.adjustAlpha(LOW_ALPHA)
|
||||
gridPaint.color = textColor.adjustAlpha(LOWER_ALPHA)
|
||||
invalidate()
|
||||
initWeekDayLetters()
|
||||
}
|
||||
|
||||
fun updateCurrentlySelectedDay(x: Int, y: Int) {
|
||||
selectedDayCoords = Point(x, y)
|
||||
invalidate()
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,8 @@ import android.view.LayoutInflater
|
||||
import android.widget.FrameLayout
|
||||
import com.simplemobiletools.calendar.pro.R
|
||||
import com.simplemobiletools.calendar.pro.extensions.config
|
||||
import com.simplemobiletools.calendar.pro.helpers.COLUMN_COUNT
|
||||
import com.simplemobiletools.calendar.pro.helpers.ROW_COUNT
|
||||
import com.simplemobiletools.calendar.pro.models.DayMonthly
|
||||
import com.simplemobiletools.commons.extensions.onGlobalLayout
|
||||
import kotlinx.android.synthetic.main.month_view.view.*
|
||||
@@ -36,7 +38,7 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
|
||||
onGlobalLayout {
|
||||
if (!wereViewsAdded && days.isNotEmpty()) {
|
||||
measureSizes()
|
||||
addViews()
|
||||
addClickableBackgrounds()
|
||||
monthView.updateDays(days, isMonthDayView)
|
||||
}
|
||||
}
|
||||
@@ -48,7 +50,7 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
|
||||
dayClickCallback = callback
|
||||
days = newDays
|
||||
if (dayWidth != 0f && dayHeight != 0f) {
|
||||
addViews()
|
||||
addClickableBackgrounds()
|
||||
}
|
||||
|
||||
isMonthDayView = !addEvents
|
||||
@@ -69,32 +71,41 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
|
||||
}
|
||||
}
|
||||
|
||||
private fun addViews() {
|
||||
private fun addClickableBackgrounds() {
|
||||
removeAllViews()
|
||||
monthView = inflater.inflate(R.layout.month_view, this).month_view
|
||||
wereViewsAdded = true
|
||||
var curId = 0
|
||||
for (y in 0..5) {
|
||||
for (x in 0..6) {
|
||||
for (y in 0 until ROW_COUNT) {
|
||||
for (x in 0 until COLUMN_COUNT) {
|
||||
val day = days.getOrNull(curId)
|
||||
if (day != null) {
|
||||
val xPos = x * dayWidth + horizontalOffset
|
||||
val yPos = y * dayHeight + weekDaysLetterHeight
|
||||
addViewBackground(xPos, yPos, day)
|
||||
addViewBackground(x, y, day)
|
||||
}
|
||||
curId++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun addViewBackground(xPos: Float, yPos: Float, day: DayMonthly) {
|
||||
private fun addViewBackground(viewX: Int, viewY: Int, day: DayMonthly) {
|
||||
val xPos = viewX * dayWidth + horizontalOffset
|
||||
val yPos = viewY * dayHeight + weekDaysLetterHeight
|
||||
|
||||
inflater.inflate(R.layout.month_view_background, this, false).apply {
|
||||
if (isMonthDayView) {
|
||||
background = null
|
||||
}
|
||||
|
||||
layoutParams.width = dayWidth.toInt()
|
||||
layoutParams.height = dayHeight.toInt()
|
||||
x = xPos
|
||||
y = yPos
|
||||
setOnClickListener {
|
||||
dayClickCallback?.invoke(day)
|
||||
|
||||
if (isMonthDayView) {
|
||||
monthView.updateCurrentlySelectedDay(viewX, viewY)
|
||||
}
|
||||
}
|
||||
addView(this)
|
||||
}
|
||||
|
@@ -8,11 +8,11 @@ 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.helpers.MEDIUM_ALPHA
|
||||
import com.simplemobiletools.calendar.pro.helpers.isWeekend
|
||||
import com.simplemobiletools.calendar.pro.models.DayYearly
|
||||
import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
|
||||
import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA
|
||||
import java.util.*
|
||||
|
||||
// used for displaying months at Yearly view
|
||||
|
@@ -32,6 +32,27 @@
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_customize_notifications_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/medium_margin"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/normal_margin"
|
||||
android:paddingTop="@dimen/activity_margin"
|
||||
android:paddingRight="@dimen/normal_margin"
|
||||
android:paddingBottom="@dimen/activity_margin">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/settings_customize_notifications_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:paddingStart="@dimen/medium_margin"
|
||||
android:text="@string/customize_notifications" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_manage_event_types_holder"
|
||||
android:layout_width="match_parent"
|
||||
|
@@ -1,5 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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/month_day_calendar_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -8,6 +10,61 @@
|
||||
<com.simplemobiletools.calendar.pro.views.MonthViewWrapper
|
||||
android:id="@+id/month_day_view_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/month_day_list_holder"
|
||||
app:layout_constraintHeight_percent="0.3"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</RelativeLayout>
|
||||
<include
|
||||
android:id="@+id/month_day_view_divider"
|
||||
layout="@layout/divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1px"
|
||||
android:layout_below="@+id/month_day_view_wrapper"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/month_day_view_wrapper" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/month_day_list_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintHeight_percent="0.7"
|
||||
app:layout_constraintTop_toBottomOf="@+id/month_day_view_divider">
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/month_day_selected_day_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:padding="@dimen/normal_margin"
|
||||
android:textSize="@dimen/actionbar_text_size"
|
||||
tools:text="8/5/2021" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyTextView
|
||||
android:id="@+id/month_day_no_events_placeholder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/month_day_selected_day_label"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:alpha="0.8"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/activity_margin"
|
||||
android:paddingEnd="@dimen/activity_margin"
|
||||
android:text="@string/no_items_found"
|
||||
android:textSize="@dimen/bigger_text_size"
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/month_day_events_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_below="@+id/month_day_selected_day_label"
|
||||
android:clipToPadding="false"
|
||||
android:scrollbars="vertical"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
|
||||
|
||||
</RelativeLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.simplemobiletools.calendar.pro.views.MonthView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<com.simplemobiletools.calendar.pro.views.MonthView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/month_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
android:layout_height="match_parent" />
|
||||
|
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<View
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<View xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/month_view_background"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:background="?attr/selectableItemBackground"/>
|
||||
android:background="?attr/selectableItemBackground" />
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">ثاني</string>
|
||||
<string name="third_m">ثالث</string>
|
||||
<string name="fourth_m">رابع</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">أخير</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">ثاني</string>
|
||||
<string name="third_f">ثالث</string>
|
||||
<string name="fourth_f">رابع</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">أخير</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">ikinci</string>
|
||||
<string name="third_m">üçüncü</string>
|
||||
<string name="fourth_m">dördüncü</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">sonuncu</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">ikinci</string>
|
||||
<string name="third_f">üçüncü</string>
|
||||
<string name="fourth_f">dördüncü</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">sonuncu</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -75,6 +75,7 @@
|
||||
<string name="second_m">দ্বিতীয়</string>
|
||||
<string name="third_m">তৃতীয়</string>
|
||||
<string name="fourth_m">চতুর্থ</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">শেষ</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -85,6 +86,7 @@
|
||||
<string name="second_f">দ্বিতীয়</string>
|
||||
<string name="third_f">তৃতীয়</string>
|
||||
<string name="fourth_f">চতুর্থ</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">শেষ</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">eil</string>
|
||||
<string name="third_m">trede</string>
|
||||
<string name="fourth_m">pevare</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">diwezhañ</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">eil</string>
|
||||
<string name="third_f">trede</string>
|
||||
<string name="fourth_f">pevare</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">diwezhañ</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">druhý</string>
|
||||
<string name="third_m">třetí</string>
|
||||
<string name="fourth_m">čtvrtý</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">poslední</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">druhou</string>
|
||||
<string name="third_f">třetí</string>
|
||||
<string name="fourth_f">čtvrtou</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">poslední</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">anden</string>
|
||||
<string name="third_m">tredje</string>
|
||||
<string name="fourth_m">fjerde</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">sidste</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">anden</string>
|
||||
<string name="third_f">tredje</string>
|
||||
<string name="fourth_f">fjerde</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">sidste</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">zweiten</string>
|
||||
<string name="third_m">dritten</string>
|
||||
<string name="fourth_m">vierten</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">letzten</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">zweiten</string>
|
||||
<string name="third_f">dritten</string>
|
||||
<string name="fourth_f">vierten</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">letzten</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">δεύτερη</string>
|
||||
<string name="third_m">τρίτη</string>
|
||||
<string name="fourth_m">τέταρτη</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">τελευταία</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">δεύτερη</string>
|
||||
<string name="third_f">τρίτη</string>
|
||||
<string name="fourth_f">τέταρτη</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">τελευταία</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">segundo</string>
|
||||
<string name="third_m">tercero</string>
|
||||
<string name="fourth_m">cuarto</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">último</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">segundo</string>
|
||||
<string name="third_f">tercer</string>
|
||||
<string name="fourth_f">cuarto</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">último</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">bigarren</string>
|
||||
<string name="third_m">hirugarren</string>
|
||||
<string name="fourth_m">laugarren</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">azken</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">bigarren</string>
|
||||
<string name="third_f">hirugarren</string>
|
||||
<string name="fourth_f">laugarren</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">azken</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">toinen</string>
|
||||
<string name="third_m">kolmas</string>
|
||||
<string name="fourth_m">neljäs</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">viimeinen</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">toisena</string>
|
||||
<string name="third_f">kolmantena</string>
|
||||
<string name="fourth_f">neljäntenä</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">viimeisenä</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -72,6 +72,7 @@
|
||||
<string name="second_m">deuxième</string>
|
||||
<string name="third_m">troisième</string>
|
||||
<string name="fourth_m">quatrième</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">dernier</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -82,6 +83,7 @@
|
||||
<string name="second_f">deuxième</string>
|
||||
<string name="third_f">troisième</string>
|
||||
<string name="fourth_f">quatrième</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">dernier</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">segundo</string>
|
||||
<string name="third_m">terceiro</string>
|
||||
<string name="fourth_m">cuarto</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">último</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">segundo</string>
|
||||
<string name="third_f">terceiro</string>
|
||||
<string name="fourth_f">cuarto</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">último</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">שני</string>
|
||||
<string name="third_m">שלישי</string>
|
||||
<string name="fourth_m">רביעי</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">אחרון</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">שניה</string>
|
||||
<string name="third_f">שלישית</string>
|
||||
<string name="fourth_f">רביעית</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">אחרונה</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">second</string>
|
||||
<string name="third_m">third</string>
|
||||
<string name="fourth_m">fourth</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">last</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">second</string>
|
||||
<string name="third_f">third</string>
|
||||
<string name="fourth_f">fourth</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">last</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">drugi</string>
|
||||
<string name="third_m">treći</string>
|
||||
<string name="fourth_m">četvrti</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">peti</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">drugi</string>
|
||||
<string name="third_f">treći</string>
|
||||
<string name="fourth_f">četvrti</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">peti</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">second</string>
|
||||
<string name="third_m">third</string>
|
||||
<string name="fourth_m">fourth</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">last</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">second</string>
|
||||
<string name="third_f">third</string>
|
||||
<string name="fourth_f">fourth</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">last</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">kedua</string>
|
||||
<string name="third_m">ketiga</string>
|
||||
<string name="fourth_m">keempat</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">terakhir</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">kedua</string>
|
||||
<string name="third_f">ketiga</string>
|
||||
<string name="fourth_f">keempat</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">terakhir</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">kedua</string>
|
||||
<string name="third_m">ketiga</string>
|
||||
<string name="fourth_m">keempat</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">terakhir</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">kedua</string>
|
||||
<string name="third_f">ketiga</string>
|
||||
<string name="fourth_f">keempat</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">terakhir</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">secondo</string>
|
||||
<string name="third_m">terzo</string>
|
||||
<string name="fourth_m">quarto</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">ultimo</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">secondo</string>
|
||||
<string name="third_f">terzo</string>
|
||||
<string name="fourth_f">quarto</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">ultimo</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">שני</string>
|
||||
<string name="third_m">שלישי</string>
|
||||
<string name="fourth_m">רביעי</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">אחרון</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">שניה</string>
|
||||
<string name="third_f">שלישית</string>
|
||||
<string name="fourth_f">רביעית</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">אחרונה</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">second</string>
|
||||
<string name="third_m">third</string>
|
||||
<string name="fourth_m">fourth</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">last</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">second</string>
|
||||
<string name="third_f">third</string>
|
||||
<string name="fourth_f">fourth</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">last</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">두 번째</string>
|
||||
<string name="third_m">세 번째</string>
|
||||
<string name="fourth_m">네 번째</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">마지막</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">두 번째</string>
|
||||
<string name="third_f">세 번째</string>
|
||||
<string name="fourth_f">네 번째</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">마지막</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">Antrą</string>
|
||||
<string name="third_m">Trečią</string>
|
||||
<string name="fourth_m">Ketvirtą</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">Paskutinę</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">Antrą</string>
|
||||
<string name="third_f">Trečią</string>
|
||||
<string name="fourth_f">Ketvirtą</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">Paskutinę</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">2.</string>
|
||||
<string name="third_m">3.</string>
|
||||
<string name="fourth_m">4.</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">pēdēj.</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">2.</string>
|
||||
<string name="third_f">3.</string>
|
||||
<string name="fourth_f">4.</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">pēdēj.</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">andre</string>
|
||||
<string name="third_m">tredje</string>
|
||||
<string name="fourth_m">fjerde</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">siste</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">andre</string>
|
||||
<string name="third_f">tredje</string>
|
||||
<string name="fourth_f">fjerde</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">siste</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">tweede</string>
|
||||
<string name="third_m">derde</string>
|
||||
<string name="fourth_m">vierde</string>
|
||||
<string name="fifth_m">vijfde</string>
|
||||
<string name="last_m">laatste</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">tweede</string>
|
||||
<string name="third_f">derde</string>
|
||||
<string name="fourth_f">vierde</string>
|
||||
<string name="fifth_f">vijfde</string>
|
||||
<string name="last_f">laatste</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">andre</string>
|
||||
<string name="third_m">tredje</string>
|
||||
<string name="fourth_m">fjerde</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">siste</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">andre</string>
|
||||
<string name="third_f">tredje</string>
|
||||
<string name="fourth_f">fjerde</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">siste</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">drugi(ą)</string>
|
||||
<string name="third_m">trzeci(ą)</string>
|
||||
<string name="fourth_m">czwarty(ą)</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">ostatni(ą)</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">drugi(ą)</string>
|
||||
<string name="third_f">trzeci(ą)</string>
|
||||
<string name="fourth_f">czwarty(ą)</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">ostatni(ą)</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">segundo</string>
|
||||
<string name="third_m">terceiro</string>
|
||||
<string name="fourth_m">quarto</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">último</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">segundo</string>
|
||||
<string name="third_f">terceiro</string>
|
||||
<string name="fourth_f">quarto</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">ultimo</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -6,10 +6,10 @@
|
||||
<string name="daily_view">Vista diária</string>
|
||||
<string name="weekly_view">Vista semanal</string>
|
||||
<string name="monthly_view">Vista mensal</string>
|
||||
<string name="monthly_daily_view">Monthly + daily view</string>
|
||||
<string name="monthly_daily_view">Mensal + vista diária</string>
|
||||
<string name="yearly_view">Vista anual</string>
|
||||
<string name="simple_event_list">Lista de eventos</string>
|
||||
<string name="no_upcoming_events">Parece que você não tem eventos para breve</string>
|
||||
<string name="no_upcoming_events">Parece que não existem eventos para breve</string>
|
||||
<string name="go_to_today">Ir para hoje</string>
|
||||
<string name="go_to_date">Ir para data</string>
|
||||
<string name="upgraded_from_free">Olá,\n\nparece que você utilizou a opção de atualização existente na versão antiga. Tem que migrar os eventos locais através de exportação para um ficheiro .ics e posterior importação. Pode encontrar os botões de exportação/importação no ecrã do menu principal.\n\nDepois já poderá desinstalar a aplicação antiga. Também terá que repor as predefinições da aplicação.\n\nObrigado!</string>
|
||||
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">segunda</string>
|
||||
<string name="third_m">terceira</string>
|
||||
<string name="fourth_m">quarta</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">última</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">segundo</string>
|
||||
<string name="third_f">terceiro</string>
|
||||
<string name="fourth_f">quarto</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">último</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
@@ -144,7 +146,7 @@
|
||||
<string name="select_event_type">Selecione um tipo de evento</string>
|
||||
<string name="move_events_into_default">Mover eventos afetados para o tipo de evento padrão</string>
|
||||
<string name="remove_affected_events">Remover permanentemente os eventos afetados</string>
|
||||
<string name="unsync_caldav_calendar">Para remover um calendário CalDAV, tem que cancelar a sua sincronização</string>
|
||||
<string name="unsync_caldav_calendar">Para remover um calendário CalDAV, tem que cancelar a sincronização</string>
|
||||
|
||||
<!-- Holidays -->
|
||||
<string name="holidays">Feriados</string>
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">a doua</string>
|
||||
<string name="third_m">a treia</string>
|
||||
<string name="fourth_m">a patra</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">ultima</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">a doua</string>
|
||||
<string name="third_f">a treia</string>
|
||||
<string name="fourth_f">a patra</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">ultima</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">второй</string>
|
||||
<string name="third_m">третий</string>
|
||||
<string name="fourth_m">четвёртый</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">последний</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">вторую</string>
|
||||
<string name="third_f">третью</string>
|
||||
<string name="fourth_f">четвёртую</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">последнюю</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">druhý</string>
|
||||
<string name="third_m">tretí</string>
|
||||
<string name="fourth_m">štvrtý</string>
|
||||
<string name="fifth_m">piaty</string>
|
||||
<string name="last_m">posledný</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">druhú</string>
|
||||
<string name="third_f">tretiu</string>
|
||||
<string name="fourth_f">štvrtú</string>
|
||||
<string name="fifth_f">piatu</string>
|
||||
<string name="last_f">poslednú</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">andra</string>
|
||||
<string name="third_m">tredje</string>
|
||||
<string name="fourth_m">fjärde</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">sista</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">andra</string>
|
||||
<string name="third_f">tredje</string>
|
||||
<string name="fourth_f">fjärde</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">sista</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">ikinci</string>
|
||||
<string name="third_m">üçüncü</string>
|
||||
<string name="fourth_m">dördüncü</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">son</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">ikinci</string>
|
||||
<string name="third_f">üçüncü</string>
|
||||
<string name="fourth_f">dördüncü</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">son</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">другий</string>
|
||||
<string name="third_m">третій</string>
|
||||
<string name="fourth_m">четвертий</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">останній</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">другий</string>
|
||||
<string name="third_f">третій</string>
|
||||
<string name="fourth_f">четвертий</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">останній</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">第二个</string>
|
||||
<string name="third_m">第三个</string>
|
||||
<string name="fourth_m">第四个</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">最后的</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">第二个</string>
|
||||
<string name="third_f">第三个</string>
|
||||
<string name="fourth_f">第四个</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">最后的</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">第二個</string>
|
||||
<string name="third_m">第三個</string>
|
||||
<string name="fourth_m">第四個</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">最後的</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">第二個</string>
|
||||
<string name="third_f">第三個</string>
|
||||
<string name="fourth_f">第四個</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">最後的</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">第二個</string>
|
||||
<string name="third_m">第三個</string>
|
||||
<string name="fourth_m">第四個</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">最後的</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">第二個</string>
|
||||
<string name="third_f">第三個</string>
|
||||
<string name="fourth_f">第四個</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">最後的</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -3,6 +3,7 @@
|
||||
<dimen name="yearly_padding_side">10dp</dimen>
|
||||
<dimen name="yearly_padding_half">3dp</dimen>
|
||||
<dimen name="yearly_padding_full">6dp</dimen>
|
||||
<dimen name="circle_stroke_width">2dp</dimen>
|
||||
|
||||
<dimen name="monthly_day_height">40dp</dimen>
|
||||
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<string name="second_m">second</string>
|
||||
<string name="third_m">third</string>
|
||||
<string name="fourth_m">fourth</string>
|
||||
<string name="fifth_m">fifth</string>
|
||||
<string name="last_m">last</string>
|
||||
|
||||
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
|
||||
@@ -81,6 +82,7 @@
|
||||
<string name="second_f">second</string>
|
||||
<string name="third_f">third</string>
|
||||
<string name="fourth_f">fourth</string>
|
||||
<string name="fifth_f">fifth</string>
|
||||
<string name="last_f">last</string>
|
||||
|
||||
<!-- Birthdays -->
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.4.30'
|
||||
ext.kotlin_version = '1.4.31'
|
||||
|
||||
repositories {
|
||||
google()
|
||||
|
6
fastlane/metadata/android/en-US/changelogs/192.txt
Normal file
6
fastlane/metadata/android/en-US/changelogs/192.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
* Added a new combination of monthly + daily view
|
||||
* Fixed too big background activity with CalDAV sync enabled
|
||||
* Fixed some glitches at importing .ics files
|
||||
* Fixed a glitch at new events having wrong date set by default in some cases
|
||||
* Added a setting item for quick notification customizing on Android 8+
|
||||
* Added some translation and stability improvements
|
3
fastlane/metadata/android/en-US/changelogs/193.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/193.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
* Allow repeating events every fifth weekday
|
||||
* Properly highlight weekends on widgets, if selected so
|
||||
* Fixed some CalDAV syncing and .ics file importing issues
|
Reference in New Issue
Block a user