Merge pull request #15 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2018-10-25 23:45:15 +03:00 committed by GitHub
commit 217abe8d3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
104 changed files with 1001 additions and 769 deletions

15
.gitignore vendored
View File

@ -1,21 +1,6 @@
# Temp files
*~
*.bak
*.backup
\#*
.\#*
*\#
*.swp
*.swap
*.sav
*.save
*.autosav
*.autosave
*.iml
.gradle
/local.properties
/gradle.properties
/.idea/
.DS_Store
/build

View File

@ -1,6 +1,33 @@
Changelog
==========
Version 5.1.1 *(2018-10-25)*
----------------------------
* Fixing a crash related to pull-to-refresh swiping
Version 5.1.0 *(2018-10-24)*
----------------------------
* Add optional pull-to-refresh for refreshing CalDAV events on some views (by azisuazusa)
* Allow setting a default view to be opened from the Event List widget (by knusprjg)
* Apply selected filters on all views, including widgets
* Allow changing any CalDAV calendars color, even if only locally
* Fix some glitches related to saving CalDAV events in a wrong calendar
* Some performance improvements related to fetching events
* Couple other smaller stability/ux improvements
Version 5.0.1 *(2018-10-17)*
----------------------------
* Fixed transparent date/time picker backgrounds
Version 5.0.0 *(2018-10-16)*
----------------------------
* Increased the minimal required Android OS version to 5
* Some translation and stability improvements
Version 4.2.1 *(2018-09-22)*
----------------------------

View File

@ -4,14 +4,14 @@ apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
buildToolsVersion "28.0.2"
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.simplemobiletools.calendar"
minSdkVersion 16
minSdkVersion 21
targetSdkVersion 28
versionCode 129
versionName "4.2.1"
versionCode 133
versionName "5.1.1"
multiDexEnabled true
setProperty("archivesBaseName", "calendar")
}
@ -42,10 +42,10 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:4.7.17'
implementation 'com.simplemobiletools:commons:5.2.6'
implementation 'joda-time:joda-time:2.9.9'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'androidx.multidex:multidex:2.0.0'
}
Properties props = new Properties()

View File

@ -184,7 +184,7 @@
</receiver>
<provider
android:name="android.support.v4.content.FileProvider"
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.calendar
import android.support.multidex.MultiDexApplication
import androidx.multidex.MultiDexApplication
import com.facebook.stetho.Stetho
import com.simplemobiletools.commons.extensions.checkUseEnglish

View File

@ -1,16 +1,15 @@
package com.simplemobiletools.calendar.activities
import android.annotation.SuppressLint
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.support.v4.app.NotificationManagerCompat
import android.text.method.LinkMovementMethod
import android.view.Menu
import android.view.MenuItem
import android.view.WindowManager
import androidx.core.app.NotificationManagerCompat
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.dialogs.*
import com.simplemobiletools.calendar.extensions.*
@ -94,9 +93,11 @@ class EventActivity : SimpleActivity() {
cancelNotification(mEvent.id)
} else {
mEvent = Event()
mReminder1Minutes = if (config.usePreviousEventReminders) config.lastEventReminderMinutes else config.defaultReminder1
mReminder2Minutes = if (config.usePreviousEventReminders) config.lastEventReminderMinutes2 else config.defaultReminder2
mReminder3Minutes = if (config.usePreviousEventReminders) config.lastEventReminderMinutes3 else config.defaultReminder3
config.apply {
mReminder1Minutes = if (usePreviousEventReminders) lastEventReminderMinutes1 else defaultReminder1
mReminder2Minutes = if (usePreviousEventReminders) lastEventReminderMinutes2 else defaultReminder2
mReminder3Minutes = if (usePreviousEventReminders) lastEventReminderMinutes3 else defaultReminder3
}
if (savedInstanceState == null) {
setupNewEvent()
@ -121,7 +122,7 @@ class EventActivity : SimpleActivity() {
event_repetition_limit_holder.setOnClickListener { showRepetitionTypePicker() }
event_reminder_1.setOnClickListener {
handleNotificationAvailability() {
handleNotificationAvailability {
if (config.wasAlarmWarningShown) {
showReminder1Dialog()
} else {
@ -243,6 +244,7 @@ class EventActivity : SimpleActivity() {
private fun setupNewEvent() {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
event_title.requestFocus()
updateActionBarTitle(getString(R.string.new_event))
val isLastCaldavCalendarOK = config.caldavSync && config.getSyncedCalendarIdsAsList().contains(config.lastUsedCaldavCalendarId.toString())
mEventCalendarId = if (isLastCaldavCalendarOK) config.lastUsedCaldavCalendarId else STORED_LOCALLY_ONLY
@ -620,6 +622,7 @@ class EventActivity : SimpleActivity() {
event_type_holder.beVisibleIf(currentCalendar == null)
event_caldav_calendar_divider.beVisibleIf(currentCalendar == null)
event_caldav_calendar_email.beGoneIf(currentCalendar == null)
event_caldav_calendar_color.beGoneIf(currentCalendar == null)
if (currentCalendar == null) {
mEventCalendarId = STORED_LOCALLY_ONLY
@ -634,6 +637,10 @@ class EventActivity : SimpleActivity() {
}
} else {
event_caldav_calendar_email.text = currentCalendar.accountName
val calendarColor = dbHelper.getEventTypeWithCalDAVCalendarId(currentCalendar.id)?.color ?: currentCalendar.color
event_caldav_calendar_color.setFillWithStroke(calendarColor, config.backgroundColor)
event_caldav_calendar_name.apply {
text = currentCalendar.displayName
setPadding(paddingLeft, paddingTop, paddingRight, resources.getDimension(R.dimen.tiny_margin).toInt())
@ -699,10 +706,10 @@ class EventActivity : SimpleActivity() {
val newEventType = if (!config.caldavSync || config.lastUsedCaldavCalendarId == 0 || mEventCalendarId == STORED_LOCALLY_ONLY) {
mEventTypeId
} else {
dbHelper.getEventTypeWithCalDAVCalendarId(config.lastUsedCaldavCalendarId)?.id ?: config.lastUsedLocalEventTypeId
dbHelper.getEventTypeWithCalDAVCalendarId(mEventCalendarId)?.id ?: config.lastUsedLocalEventTypeId
}
val newSource = if (!config.caldavSync || config.lastUsedCaldavCalendarId == 0 || mEventCalendarId == STORED_LOCALLY_ONLY) {
val newSource = if (!config.caldavSync || mEventCalendarId == STORED_LOCALLY_ONLY) {
config.lastUsedLocalEventTypeId = newEventType
SOURCE_SIMPLE_CALENDAR
} else {
@ -716,7 +723,7 @@ class EventActivity : SimpleActivity() {
config.apply {
if (usePreviousEventReminders) {
lastEventReminderMinutes = reminder1
lastEventReminderMinutes1 = reminder1
lastEventReminderMinutes2 = reminder2
lastEventReminderMinutes3 = reminder3
}
@ -856,17 +863,13 @@ class EventActivity : SimpleActivity() {
}
}
@SuppressLint("NewApi")
private fun setupStartDate() {
hideKeyboard()
config.backgroundColor.getContrastColor()
val datepicker = DatePickerDialog(this, mDialogTheme, startDateSetListener, mEventStartDateTime.year, mEventStartDateTime.monthOfYear - 1,
mEventStartDateTime.dayOfMonth)
if (isLollipopPlus()) {
datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
}
datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
datepicker.show()
}
@ -875,16 +878,12 @@ class EventActivity : SimpleActivity() {
TimePickerDialog(this, mDialogTheme, startTimeSetListener, mEventStartDateTime.hourOfDay, mEventStartDateTime.minuteOfHour, config.use24HourFormat).show()
}
@SuppressLint("NewApi")
private fun setupEndDate() {
hideKeyboard()
val datepicker = DatePickerDialog(this, mDialogTheme, endDateSetListener, mEventEndDateTime.year, mEventEndDateTime.monthOfYear - 1,
mEventEndDateTime.dayOfMonth)
if (isLollipopPlus()) {
datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
}
datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
datepicker.show()
}

View File

@ -11,13 +11,14 @@ import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.provider.ContactsContract
import android.support.v4.view.MenuItemCompat
import android.support.v7.widget.SearchView
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import com.simplemobiletools.calendar.BuildConfig
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.R.id.*
import com.simplemobiletools.calendar.adapters.EventListAdapter
import com.simplemobiletools.calendar.dialogs.ExportEventsDialog
import com.simplemobiletools.calendar.dialogs.FilterEventTypesDialog
@ -70,9 +71,6 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
// just get a reference to the database to make sure it is created properly
dbHelper
checkWhatsNewDialog()
calendar_fab.beVisibleIf(config.storedView != YEARLY_VIEW)
calendar_fab.setOnClickListener {
@ -92,6 +90,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
refreshCalDAVCalendars(false)
}
swipe_refresh_layout.setOnRefreshListener {
refreshCalDAVCalendars(false)
}
if (!checkViewIntents()) {
return
}
@ -129,6 +131,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
search_placeholder_2.setTextColor(config.textColor)
calendar_fab.setColors(config.textColor, getAdjustedPrimaryColor(), config.backgroundColor)
search_holder.background = ColorDrawable(config.backgroundColor)
checkSwipeRefreshAvailability()
}
override fun onPause() {
@ -183,6 +186,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
override fun onBackPressed() {
swipe_refresh_layout.isRefreshing = false
checkSwipeRefreshAvailability()
if (currentFragments.size > 1) {
removeTopFragment()
} else {
@ -251,12 +256,14 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun checkOpenIntents(): Boolean {
val dayCodeToOpen = intent.getStringExtra(DAY_CODE) ?: ""
val openMonth = intent.getBooleanExtra(OPEN_MONTH, false)
intent.removeExtra(OPEN_MONTH)
val viewToOpen = intent.getIntExtra(VIEW_TO_OPEN, DAILY_VIEW)
intent.removeExtra(VIEW_TO_OPEN)
intent.removeExtra(DAY_CODE)
if (dayCodeToOpen.isNotEmpty()) {
calendar_fab.beVisible()
config.storedView = if (openMonth) MONTHLY_VIEW else DAILY_VIEW
if (viewToOpen != LAST_VIEW) {
config.storedView = viewToOpen
}
updateViewPager(dayCodeToOpen)
return true
}
@ -337,6 +344,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun showFilterDialog() {
FilterEventTypesDialog(this) {
refreshViewPager()
updateWidgets()
}
}
@ -368,6 +376,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
if (showCalDAVRefreshToast) {
toast(R.string.refreshing_complete)
}
runOnUiThread {
swipe_refresh_layout.isRefreshing = false
}
}
}, CALDAV_SYNC_DELAY)
}
@ -527,6 +538,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun updateView(view: Int) {
calendar_fab.beVisibleIf(view != YEARLY_VIEW)
config.storedView = view
checkSwipeRefreshAvailability()
updateViewPager()
if (goToTodayButton?.isVisible == true) {
shouldGoToTodayBeVisible = false
@ -578,8 +590,11 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
val bundle = Bundle()
bundle.putString(DAY_CODE, Formatter.getDayCodeFromDateTime(dateTime))
fragment.arguments = bundle
supportFragmentManager.beginTransaction().add(R.id.fragments_holder, fragment).commitNow()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
try {
supportFragmentManager.beginTransaction().add(R.id.fragments_holder, fragment).commitNow()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
} catch (e: Exception) {
}
}
private fun getThisWeekDateTime(): String {
@ -612,7 +627,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun refreshViewPager() {
runOnUiThread {
if (!isActivityDestroyed()) {
if (!isDestroyed) {
currentFragments.last().refreshEvents()
}
}
@ -695,7 +710,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
private fun launchAbout() {
val licenses = LICENSE_JODA or LICENSE_STETHO or LICENSE_MULTISELECT or LICENSE_LEAK_CANARY
val licenses = LICENSE_JODA or LICENSE_STETHO
val faqItems = arrayListOf(
FAQItem(R.string.faq_1_title_commons, R.string.faq_1_text_commons),
@ -737,6 +752,13 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
}
private fun checkSwipeRefreshAvailability() {
swipe_refresh_layout.isEnabled = config.caldavSync && config.pullToRefresh && config.storedView != WEEKLY_VIEW
if (!swipe_refresh_layout.isEnabled) {
swipe_refresh_layout.isRefreshing = false
}
}
// only used at active search
override fun refreshItems() {
searchQueryChanged(mLatestSearchQuery)

View File

@ -5,7 +5,7 @@ import android.view.Menu
import android.view.MenuItem
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.adapters.ManageEventTypesAdapter
import com.simplemobiletools.calendar.dialogs.UpdateEventTypeDialog
import com.simplemobiletools.calendar.dialogs.EditEventTypeDialog
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.interfaces.DeleteEventTypesListener
import com.simplemobiletools.calendar.models.EventType
@ -24,7 +24,7 @@ class ManageEventTypesActivity : SimpleActivity(), DeleteEventTypesListener {
}
private fun showEventTypeDialog(eventType: EventType? = null) {
UpdateEventTypeDialog(this, eventType?.copy()) {
EditEventTypeDialog(this, eventType?.copy()) {
getEventTypes()
}
}

View File

@ -7,7 +7,10 @@ import android.os.Bundle
import android.text.TextUtils
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.dialogs.SelectCalendarsDialog
import com.simplemobiletools.calendar.extensions.*
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.getSyncedCalDAVCalendars
import com.simplemobiletools.calendar.extensions.updateWidgets
import com.simplemobiletools.calendar.helpers.*
import com.simplemobiletools.calendar.models.EventType
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
@ -35,7 +38,6 @@ class SettingsActivity : SimpleActivity() {
setContentView(R.layout.activity_settings)
res = resources
mStoredPrimaryColor = config.primaryColor
setupCaldavSync()
}
override fun onResume() {
@ -60,6 +62,9 @@ class SettingsActivity : SimpleActivity() {
setupUseSameSnooze()
setupLoopReminders()
setupSnoozeTime()
setupCaldavSync()
setupManageSyncedCalendars()
setupPullToRefresh()
setupDefaultReminder()
setupDefaultReminder1()
setupDefaultReminder2()
@ -67,6 +72,7 @@ class SettingsActivity : SimpleActivity() {
setupDisplayPastEvents()
setupFontSize()
setupCustomizeWidgetColors()
setupViewToOpenFromListWidget()
setupDimEvents()
updateTextColors(settings_holder)
checkPrimaryColor()
@ -159,7 +165,18 @@ class SettingsActivity : SimpleActivity() {
}
}
}
}
private fun setupPullToRefresh() {
settings_caldav_pull_to_refresh_holder.beVisibleIf(config.caldavSync)
settings_caldav_pull_to_refresh.isChecked = config.pullToRefresh
settings_caldav_pull_to_refresh_holder.setOnClickListener {
settings_caldav_pull_to_refresh.toggle()
config.pullToRefresh = settings_caldav_pull_to_refresh.isChecked
}
}
private fun setupManageSyncedCalendars() {
settings_manage_synced_calendars_holder.beVisibleIf(config.caldavSync)
settings_manage_synced_calendars_holder.setOnClickListener {
showCalendarPicker()
@ -173,6 +190,7 @@ class SettingsActivity : SimpleActivity() {
settings_caldav_sync.isChecked = false
config.caldavSync = false
settings_manage_synced_calendars_holder.beGone()
settings_caldav_pull_to_refresh_holder.beGone()
config.getSyncedCalendarIdsAsList().forEach {
CalDAVHandler(applicationContext).deleteCalDAVCalendarEvents(it.toLong())
}
@ -190,6 +208,7 @@ class SettingsActivity : SimpleActivity() {
}
settings_manage_synced_calendars_holder.beVisibleIf(newCalendarIds.isNotEmpty())
settings_caldav_pull_to_refresh_holder.beVisibleIf(newCalendarIds.isNotEmpty())
settings_caldav_sync.isChecked = newCalendarIds.isNotEmpty()
config.caldavSync = newCalendarIds.isNotEmpty()
if (settings_caldav_sync.isChecked) {
@ -481,7 +500,6 @@ class SettingsActivity : SimpleActivity() {
config.fontSize = it as Int
settings_font_size.text = getFontSizeText()
updateWidgets()
updateListWidget()
}
}
}
@ -501,6 +519,34 @@ class SettingsActivity : SimpleActivity() {
}
}
private fun setupViewToOpenFromListWidget() {
settings_list_widget_view_to_open.text = getDefaultViewText()
settings_list_widget_view_to_open_holder.setOnClickListener {
val items = arrayListOf(
RadioItem(DAILY_VIEW, res.getString(R.string.daily_view)),
RadioItem(WEEKLY_VIEW, res.getString(R.string.weekly_view)),
RadioItem(MONTHLY_VIEW, res.getString(R.string.monthly_view)),
RadioItem(YEARLY_VIEW, res.getString(R.string.yearly_view)),
RadioItem(EVENTS_LIST_VIEW, res.getString(R.string.simple_event_list)),
RadioItem(LAST_VIEW, res.getString(R.string.last_view)))
RadioGroupDialog(this@SettingsActivity, items, config.listWidgetViewToOpen) {
config.listWidgetViewToOpen = it as Int
settings_list_widget_view_to_open.text = getDefaultViewText()
updateWidgets()
}
}
}
private fun getDefaultViewText() = getString(when (config.listWidgetViewToOpen) {
DAILY_VIEW -> R.string.daily_view
WEEKLY_VIEW -> R.string.weekly_view
MONTHLY_VIEW -> R.string.monthly_view
YEARLY_VIEW -> R.string.yearly_view
EVENTS_LIST_VIEW -> R.string.simple_event_list
else -> R.string.last_view
})
private fun setupDimEvents() {
settings_dim_past_events.isChecked = config.dimPastEvents
settings_dim_past_events_holder.setOnClickListener {

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.activities
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import androidx.appcompat.app.AppCompatActivity
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.rescheduleReminder

View File

@ -1,10 +1,7 @@
package com.simplemobiletools.calendar.activities
import android.content.Intent
import com.simplemobiletools.calendar.helpers.DAY_CODE
import com.simplemobiletools.calendar.helpers.EVENT_ID
import com.simplemobiletools.calendar.helpers.EVENT_OCCURRENCE_TS
import com.simplemobiletools.calendar.helpers.OPEN_MONTH
import com.simplemobiletools.calendar.helpers.*
import com.simplemobiletools.commons.activities.BaseSplashActivity
class SplashActivity : BaseSplashActivity() {
@ -12,7 +9,7 @@ class SplashActivity : BaseSplashActivity() {
when {
intent.extras?.containsKey(DAY_CODE) == true -> Intent(this, MainActivity::class.java).apply {
putExtra(DAY_CODE, intent.getStringExtra(DAY_CODE))
putExtra(OPEN_MONTH, intent.getBooleanExtra(OPEN_MONTH, false))
putExtra(VIEW_TO_OPEN, intent.getIntExtra(VIEW_TO_OPEN, LAST_VIEW))
startActivity(this)
}
intent.extras?.containsKey(EVENT_ID) == true -> Intent(this, MainActivity::class.java).apply {

View File

@ -89,7 +89,7 @@ class WidgetMonthlyConfigureActivity : SimpleActivity(), MonthlyCalendar {
config_bg_seekbar.progress = (mBgAlpha * 100).toInt()
updateBgColor()
MonthlyCalendarImpl(this, applicationContext).updateMonthlyCalendar(DateTime().withDayOfMonth(1), false)
MonthlyCalendarImpl(this, applicationContext).updateMonthlyCalendar(DateTime().withDayOfMonth(1))
}
private fun saveConfig() {

View File

@ -38,12 +38,6 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
when (id) {
R.id.cab_share -> shareEvents()
@ -55,6 +49,10 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = events.getOrNull(position)?.id
override fun getItemKeyPosition(key: Int) = events.indexOfFirst { it.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyRecyclerViewAdapter.ViewHolder {
val layoutId = when (viewType) {
ITEM_EVENT -> R.layout.event_item_day_view
@ -65,10 +63,10 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val event = events[position]
val view = holder.bindView(event, true, true) { itemView, layoutPosition ->
holder.bindView(event, true, true) { itemView, layoutPosition ->
setupView(itemView, event)
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = events.size
@ -76,8 +74,18 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
override fun getItemViewType(position: Int): Int {
val event = events[position]
val detailField = if (replaceDescriptionWithLocation) event.location else event.description
return if (event.startTS == event.endTS && detailField.isEmpty()) {
return if (detailField.isNotEmpty()) {
ITEM_EVENT
} else if (event.startTS == event.endTS) {
ITEM_EVENT_SIMPLE
} else if (event.getIsAllDay()) {
val startCode = Formatter.getDayCodeFromTS(event.startTS)
val endCode = Formatter.getDayCodeFromTS(event.endTS)
if (startCode == endCode) {
ITEM_EVENT_SIMPLE
} else {
ITEM_EVENT
}
} else {
ITEM_EVENT
}
@ -85,6 +93,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
private fun setupView(view: View, event: Event) {
view.apply {
event_item_frame.isSelected = selectedKeys.contains(event.id)
event_item_title.text = event.title
event_item_description?.text = if (replaceDescriptionWithLocation) event.location else event.description
event_item_start.text = if (event.getIsAllDay()) allDayString else Formatter.getTimeFromTS(context, event.startTS)
@ -95,7 +104,7 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
val startCode = Formatter.getDayCodeFromTS(event.startTS)
val endCode = Formatter.getDayCodeFromTS(event.endTS)
event_item_end.apply {
event_item_end?.apply {
text = Formatter.getTimeFromTS(context, event.endTS)
if (startCode != endCode) {
if (event.getIsAllDay()) {
@ -121,35 +130,24 @@ class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, r
}
}
private fun shareEvents() {
val eventIds = ArrayList<Int>(selectedPositions.size)
selectedPositions.forEach {
eventIds.add(events[it].id)
}
activity.shareEvents(eventIds.distinct())
}
private fun shareEvents() = activity.shareEvents(selectedKeys.distinct())
private fun askConfirmDelete() {
val eventIds = ArrayList<Int>(selectedPositions.size)
val timestamps = ArrayList<Int>(selectedPositions.size)
val eventsToDelete = ArrayList<Event>(selectedPositions.size)
selectedPositions.forEach {
val event = events[it]
eventsToDelete.add(event)
eventIds.add(event.id)
timestamps.add(event.startTS)
}
val eventIds = selectedKeys.toMutableList()
val eventsToDelete = events.filter { selectedKeys.contains(it.id) }
val timestamps = eventsToDelete.map { it.startTS }
val positions = getSelectedItemPositions()
val hasRepeatableEvent = eventsToDelete.any { it.repeatInterval > 0 }
DeleteEventDialog(activity, eventIds, hasRepeatableEvent) {
DeleteEventDialog(activity, eventIds, hasRepeatableEvent) { it ->
events.removeAll(eventsToDelete)
val nonRepeatingEventIDs = eventsToDelete.filter { it.repeatInterval == 0 }.map { it.id.toString() }.toTypedArray()
val nonRepeatingEventIDs = eventsToDelete.asSequence().filter { it.repeatInterval == 0 }.map { it.id.toString() }.toList().toTypedArray()
activity.dbHelper.deleteEvents(nonRepeatingEventIDs, true)
val repeatingEventIDs = eventsToDelete.filter { it.repeatInterval != 0 }.map { it.id }
val repeatingEventIDs = eventsToDelete.asSequence().filter { it.repeatInterval != 0 }.map { it.id }.toList()
activity.handleEventDeleting(repeatingEventIDs, timestamps, it)
removeSelectedItems()
removeSelectedItems(positions)
}
}
}

View File

@ -38,6 +38,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
private var currentItemsHash = listItems.hashCode()
init {
setupDragListener(true)
var firstNonPastSectionIndex = -1
listItems.forEachIndexed { index, listItem ->
if (firstNonPastSectionIndex == -1 && listItem is ListSection) {
@ -58,12 +59,6 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
when (id) {
R.id.cab_share -> shareEvents()
@ -75,6 +70,10 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
override fun getIsItemSelectable(position: Int) = listItems[position] is ListEvent
override fun getItemSelectionKey(position: Int) = (listItems.getOrNull(position) as? ListEvent)?.id
override fun getItemKeyPosition(key: Int) = listItems.indexOfFirst { (it as? ListEvent)?.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyRecyclerViewAdapter.ViewHolder {
val layoutId = when (viewType) {
ITEM_EVENT -> R.layout.event_list_item
@ -86,14 +85,14 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val listItem = listItems[position]
val view = holder.bindView(listItem, true, allowLongClick) { itemView, layoutPosition ->
holder.bindView(listItem, true, allowLongClick) { itemView, layoutPosition ->
if (listItem is ListSection) {
setupListSection(itemView, listItem, position)
} else if (listItem is ListEvent) {
setupListEvent(itemView, listItem)
}
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = listItems.size
@ -101,8 +100,18 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
override fun getItemViewType(position: Int) = if (listItems[position] is ListEvent) {
val event = listItems[position] as ListEvent
val detailField = if (replaceDescription) event.location else event.description
if (event.startTS == event.endTS && detailField.isEmpty()) {
if (detailField.isNotEmpty()) {
ITEM_EVENT
} else if (event.startTS == event.endTS) {
ITEM_EVENT_SIMPLE
} else if (event.isAllDay) {
val startCode = Formatter.getDayCodeFromTS(event.startTS)
val endCode = Formatter.getDayCodeFromTS(event.endTS)
if (startCode == endCode) {
ITEM_EVENT_SIMPLE
} else {
ITEM_EVENT
}
} else {
ITEM_EVENT
}
@ -127,6 +136,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
private fun setupListEvent(view: View, listEvent: ListEvent) {
view.apply {
event_item_frame.isSelected = selectedKeys.contains(listEvent.id)
event_item_title.text = listEvent.title
event_item_description?.text = if (replaceDescription) listEvent.location else listEvent.description
event_item_start.text = if (listEvent.isAllDay) allDayString else Formatter.getTimeFromTS(context, listEvent.startTS)
@ -185,30 +195,12 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
}
}
private fun shareEvents() {
val eventIds = ArrayList<Int>(selectedPositions.size)
selectedPositions.forEach {
val item = listItems[it]
if (item is ListEvent) {
eventIds.add(item.id)
}
}
activity.shareEvents(eventIds.distinct())
}
private fun shareEvents() = activity.shareEvents(selectedKeys.distinct())
private fun askConfirmDelete() {
val eventIds = ArrayList<Int>(selectedPositions.size)
val timestamps = ArrayList<Int>(selectedPositions.size)
val eventsToDelete = ArrayList<ListEvent>(selectedPositions.size)
selectedPositions.sortedDescending().forEach {
val item = listItems[it]
if (item is ListEvent) {
eventIds.add(item.id)
timestamps.add(item.startTS)
eventsToDelete.add(item)
}
}
val eventIds = selectedKeys.toMutableList()
val eventsToDelete = listItems.filter { selectedKeys.contains((it as? ListEvent)?.id) } as List<ListEvent>
val timestamps = eventsToDelete.mapNotNull { (it as? ListEvent)?.startTS }
val hasRepeatableEvent = eventsToDelete.any { it.isRepeatable }
DeleteEventDialog(activity, eventIds, hasRepeatableEvent) {

View File

@ -41,8 +41,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
if (type == ITEM_EVENT) {
val event = events[position] as ListEvent
val detailField = if (replaceDescription) event.location else event.description
val layout = if (event.startTS == event.endTS && detailField.isEmpty()) R.layout.event_list_item_widget_simple else R.layout.event_list_item_widget
val layout = getItemViewLayout(event)
remoteView = RemoteViews(context.packageName, layout)
setupListEvent(remoteView, event)
} else {
@ -53,6 +52,25 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
return remoteView
}
private fun getItemViewLayout(event: ListEvent): Int {
val detailField = if (replaceDescription) event.location else event.description
return if (detailField.isNotEmpty()) {
R.layout.event_list_item_widget
} else if (event.startTS == event.endTS) {
R.layout.event_list_item_widget_simple
} else if (event.isAllDay) {
val startCode = Formatter.getDayCodeFromTS(event.startTS)
val endCode = Formatter.getDayCodeFromTS(event.endTS)
if (startCode == endCode) {
R.layout.event_list_item_widget_simple
} else {
R.layout.event_list_item_widget
}
} else {
R.layout.event_list_item_widget
}
}
private fun setupListEvent(remoteView: RemoteViews, item: ListEvent) {
var curTextColor = textColor
remoteView.apply {
@ -116,6 +134,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
Intent().apply {
putExtra(DAY_CODE, item.code)
putExtra(VIEW_TO_OPEN, context.config.listWidgetViewToOpen)
setOnClickFillInIntent(event_section_title, this)
}
}
@ -137,7 +156,7 @@ class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteVi
mediumFontSize = context.config.getFontSize()
val fromTS = DateTime().seconds() - context.config.displayPastEvents * 60
val toTS = DateTime().plusYears(1).seconds()
context.dbHelper.getEventsInBackground(fromTS, toTS) {
context.dbHelper.getEventsInBackground(fromTS, toTS, applyTypeFilter = true) {
val listItems = ArrayList<ListItem>(it.size)
val replaceDescription = context.config.replaceDescription
val sorted = it.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))

View File

@ -1,87 +1,69 @@
package com.simplemobiletools.calendar.adapters
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.models.EventType
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.setFillWithStroke
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import kotlinx.android.synthetic.main.filter_event_type_view.view.*
import java.util.*
class FilterEventTypeAdapter(val activity: SimpleActivity, val eventTypes: List<EventType>, val displayEventTypes: Set<String>) :
RecyclerView.Adapter<FilterEventTypeAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>()
private val selectedKeys = HashSet<Int>()
init {
eventTypes.forEachIndexed { index, eventType ->
if (displayEventTypes.contains(eventType.id.toString())) {
selectedPositions.add(index)
selectedKeys.add(eventType.id)
}
}
}
private fun toggleItemSelection(select: Boolean, pos: Int) {
private fun toggleItemSelection(select: Boolean, eventType: EventType, pos: Int) {
if (select) {
if (itemViews[pos] != null) {
selectedPositions.add(pos)
}
selectedKeys.add(eventType.id)
} else {
selectedPositions.remove(pos)
selectedKeys.remove(eventType.id)
}
itemViews[pos]?.filter_event_type_checkbox?.isChecked = select
notifyItemChanged(pos)
}
private val adapterListener = object : MyAdapterListener {
override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
toggleItemSelection(select, position)
}
override fun getSelectedPositions() = selectedPositions
override fun itemLongClicked(position: Int) {}
}
fun getSelectedItemsSet(): HashSet<String> {
val selectedItemsSet = HashSet<String>(selectedPositions.size)
selectedPositions.forEach { selectedItemsSet.add(eventTypes[it].id.toString()) }
return selectedItemsSet
}
fun getSelectedItemsSet() = selectedKeys.asSequence().map { it.toString() }.toHashSet()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.filter_event_type_view, parent, false)
return ViewHolder(view, adapterListener, activity)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val eventType = eventTypes[position]
itemViews.put(position, holder.bindView(eventType))
toggleItemSelection(selectedPositions.contains(position), position)
holder.bindView(eventType)
}
override fun getItemCount() = eventTypes.size
class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(eventType: EventType): View {
val isSelected = selectedKeys.contains(eventType.id)
itemView.apply {
filter_event_type_checkbox.isChecked = isSelected
filter_event_type_checkbox.setColors(activity.config.textColor, activity.getAdjustedPrimaryColor(), activity.config.backgroundColor)
filter_event_type_checkbox.text = eventType.getDisplayTitle()
filter_event_type_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
filter_event_type_holder.setOnClickListener { viewClicked(!filter_event_type_checkbox.isChecked) }
filter_event_type_holder.setOnClickListener { viewClicked(!isSelected, eventType) }
}
return itemView
}
private fun viewClicked(select: Boolean) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition)
private fun viewClicked(select: Boolean, eventType: EventType) {
toggleItemSelection(select, eventType, adapterPosition)
}
}
}

View File

@ -31,12 +31,6 @@ class ManageEventTypesAdapter(activity: SimpleActivity, val eventTypes: ArrayLis
override fun prepareActionMode(menu: Menu) {}
override fun prepareItemSelection(viewHolder: ViewHolder) {}
override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) {
viewHolder?.itemView?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
when (id) {
R.id.cab_delete -> askConfirmDelete()
@ -47,20 +41,29 @@ class ManageEventTypesAdapter(activity: SimpleActivity, val eventTypes: ArrayLis
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = eventTypes.getOrNull(position)?.id
override fun getItemKeyPosition(key: Int) = eventTypes.indexOfFirst { it.id == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_event_type, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val eventType = eventTypes[position]
val view = holder.bindView(eventType, true, true) { itemView, layoutPosition ->
holder.bindView(eventType, true, true) { itemView, layoutPosition ->
setupView(itemView, eventType)
}
bindViewHolder(holder, position, view)
bindViewHolder(holder)
}
override fun getItemCount() = eventTypes.size
private fun getItemWithKey(key: Int): EventType? = eventTypes.firstOrNull { it.id == key }
private fun getSelectedItems() = eventTypes.filter { selectedKeys.contains(it.id) } as ArrayList<EventType>
private fun setupView(view: View, eventType: EventType) {
view.apply {
event_item_frame.isSelected = selectedKeys.contains(eventType.id)
event_type_title.text = eventType.getDisplayTitle()
event_type_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
event_type_title.setTextColor(textColor)
@ -68,8 +71,7 @@ class ManageEventTypesAdapter(activity: SimpleActivity, val eventTypes: ArrayLis
}
private fun askConfirmDelete() {
val eventTypes = ArrayList<EventType>(selectedPositions.size)
selectedPositions.forEach { eventTypes.add(this.eventTypes[it]) }
val eventTypes = eventTypes.filter { selectedKeys.contains(it.id) } as ArrayList<EventType>
if (activity.dbHelper.doEventTypesContainEvent(eventTypes)) {
val MOVE_EVENTS = 0
@ -90,25 +92,22 @@ class ManageEventTypesAdapter(activity: SimpleActivity, val eventTypes: ArrayLis
}
private fun deleteEventTypes(deleteEvents: Boolean) {
val eventTypesToDelete = ArrayList<EventType>(selectedPositions.size)
val eventTypesToDelete = getSelectedItems()
for (pos in selectedPositions) {
if (eventTypes[pos].id == DBHelper.REGULAR_EVENT_TYPE_ID) {
for (key in selectedKeys) {
val type = getItemWithKey(key) ?: continue
if (type.id == DBHelper.REGULAR_EVENT_TYPE_ID) {
activity.toast(R.string.cannot_delete_default_type)
selectedPositions.remove(pos)
toggleItemSelection(false, pos)
eventTypesToDelete.remove(type)
toggleItemSelection(false, getItemKeyPosition(type.id))
break
}
}
selectedPositions.sortedDescending().forEach {
val eventType = eventTypes[it]
eventTypesToDelete.add(eventType)
}
eventTypes.removeAll(eventTypesToDelete)
if (listener?.deleteEventTypes(eventTypesToDelete, deleteEvents) == true) {
removeSelectedItems()
val positions = getSelectedItemPositions()
eventTypes.removeAll(eventTypesToDelete)
removeSelectedItems(positions)
}
}
}

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.adapters
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.util.SparseArray
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import com.simplemobiletools.calendar.fragments.DayFragment
import com.simplemobiletools.calendar.helpers.DAY_CODE
import com.simplemobiletools.calendar.interfaces.NavigationListener

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.adapters
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.util.SparseArray
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import com.simplemobiletools.calendar.fragments.MonthFragment
import com.simplemobiletools.calendar.helpers.DAY_CODE
import com.simplemobiletools.calendar.interfaces.NavigationListener

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.adapters
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.util.SparseArray
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import com.simplemobiletools.calendar.fragments.WeekFragment
import com.simplemobiletools.calendar.helpers.WEEK_START_TIMESTAMP
import com.simplemobiletools.calendar.interfaces.WeekFragmentListener

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.adapters
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.util.SparseArray
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import com.simplemobiletools.calendar.fragments.YearFragment
import com.simplemobiletools.calendar.helpers.YEAR_LABEL

View File

@ -1,8 +1,8 @@
package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.helpers.DAY
import com.simplemobiletools.calendar.helpers.MONTH
@ -22,7 +22,7 @@ class CustomEventRepeatIntervalDialog(val activity: Activity, val callback: (sec
view.dialog_radio_view.check(R.id.dialog_radio_days)
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialogInterface, i -> confirmRepeatInterval() })
.setPositiveButton(R.string.ok) { dialogInterface, i -> confirmRepeatInterval() }
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this) {

View File

@ -1,8 +1,8 @@
package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.helpers.DELETE_ALL_OCCURRENCES
import com.simplemobiletools.calendar.helpers.DELETE_FUTURE_OCCURRENCES
@ -28,7 +28,7 @@ class DeleteEventDialog(val activity: Activity, eventIds: List<Int>, hasRepeatab
}
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.yes, { dialog, which -> dialogConfirmed(view as ViewGroup) })
.setPositiveButton(R.string.yes) { dialog, which -> dialogConfirmed(view as ViewGroup) }
.setNegativeButton(R.string.no, null)
.create().apply {
activity.setupDialogStuff(view, this)

View File

@ -1,8 +1,8 @@
package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.support.v7.app.AlertDialog
import android.widget.ImageView
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
@ -11,7 +11,7 @@ import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.*
import kotlinx.android.synthetic.main.dialog_event_type.view.*
class UpdateEventTypeDialog(val activity: Activity, var eventType: EventType? = null, val callback: (eventType: EventType) -> Unit) {
class EditEventTypeDialog(val activity: Activity, var eventType: EventType? = null, val callback: (eventType: EventType) -> Unit) {
var isNewEvent = eventType == null
init {

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.dialogs
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.commons.extensions.hideKeyboard

View File

@ -1,8 +1,8 @@
package com.simplemobiletools.calendar.dialogs
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.adapters.FilterEventTypeAdapter
@ -17,11 +17,11 @@ class ExportEventsDialog(val activity: SimpleActivity, val path: String, val cal
init {
val view = (activity.layoutInflater.inflate(R.layout.dialog_export_events, null) as ViewGroup).apply {
export_events_folder.text = activity.humanizePath(path)
export_events_filename.setText("events_${activity.getCurrentFormattedDateTime()}")
export_events_filename.setText("${activity.getString(R.string.events)}_${activity.getCurrentFormattedDateTime()}")
activity.dbHelper.getEventTypes {
val eventTypes = HashSet<String>()
it.mapTo(eventTypes, { it.id.toString() })
it.mapTo(eventTypes) { it.id.toString() }
activity.runOnUiThread {
export_events_types_list.adapter = FilterEventTypeAdapter(activity, it, eventTypes)

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.calendar.dialogs
import android.support.v7.app.AlertDialog
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.adapters.FilterEventTypeAdapter
@ -19,7 +19,7 @@ class FilterEventTypesDialog(val activity: SimpleActivity, val callback: () -> U
view.filter_event_types_list.adapter = FilterEventTypeAdapter(activity, eventTypes, displayEventTypes)
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialogInterface, i -> confirmEventTypes() })
.setPositiveButton(R.string.ok) { dialogInterface, i -> confirmEventTypes() }
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this, R.string.filter_events_by_type)

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.dialogs
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.config

View File

@ -1,10 +1,9 @@
package com.simplemobiletools.calendar.dialogs
import android.annotation.SuppressLint
import android.app.Activity
import android.app.DatePickerDialog
import android.support.v7.app.AlertDialog
import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.seconds
@ -13,7 +12,6 @@ import com.simplemobiletools.calendar.helpers.getNowSeconds
import com.simplemobiletools.commons.extensions.getDialogTheme
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.value
import com.simplemobiletools.commons.helpers.isLollipopPlus
import kotlinx.android.synthetic.main.dialog_repeat_limit_type_picker.view.*
import org.joda.time.DateTime
import java.util.*
@ -25,14 +23,18 @@ class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Int,
init {
view = activity.layoutInflater.inflate(R.layout.dialog_repeat_limit_type_picker, null).apply {
repeat_type_date.setOnClickListener { showRepetitionLimitDialog() }
repeat_type_forever.setOnClickListener { callback(0); dialog.dismiss() }
repeat_type_count.setOnClickListener { dialog_radio_view.check(R.id.repeat_type_x_times) }
repeat_type_forever.setOnClickListener {
callback(0)
dialog.dismiss()
}
}
view.dialog_radio_view.check(getCheckedItem())
if (repeatLimit in 1..startTS)
if (repeatLimit in 1..startTS) {
repeatLimit = startTS
}
updateRepeatLimitText()
@ -80,16 +82,12 @@ class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Int,
dialog.dismiss()
}
@SuppressLint("NewApi")
private fun showRepetitionLimitDialog() {
val repeatLimitDateTime = Formatter.getDateTimeFromTS(if (repeatLimit != 0) repeatLimit else getNowSeconds())
val datepicker = DatePickerDialog(activity, activity.getDialogTheme(), repetitionLimitDateSetListener, repeatLimitDateTime.year,
repeatLimitDateTime.monthOfYear - 1, repeatLimitDateTime.dayOfMonth)
if (isLollipopPlus()) {
datepicker.datePicker.firstDayOfWeek = if (activity.config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
}
datepicker.datePicker.firstDayOfWeek = if (activity.config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
datepicker.show()
}

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.support.v7.app.AlertDialog
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.commons.extensions.setupDialogStuff

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.dialogs
import android.support.v7.app.AlertDialog
import android.support.v7.widget.SwitchCompat
import android.text.TextUtils
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SwitchCompat
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.config
@ -33,7 +33,7 @@ class SelectCalendarsDialog(val activity: SimpleActivity, val callback: () -> Un
}
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialogInterface, i -> confirmSelection() })
.setPositiveButton(R.string.ok) { dialogInterface, i -> confirmSelection() }
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this, R.string.select_caldav_calendars)

View File

@ -2,10 +2,10 @@ package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.graphics.Color
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.RadioGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
@ -29,6 +29,11 @@ class SelectEventCalendarDialog(val activity: Activity, val calendars: List<CalD
activity.dbHelper.getEventTypes {
activity.runOnUiThread {
calendars.forEach {
val localEventType = activity.dbHelper.getEventTypeWithCalDAVCalendarId(it.id)
if (localEventType != null) {
it.color = localEventType.color
}
addRadioButton(it.getFullTitle(), it.id, it.color)
}
addRadioButton(activity.getString(R.string.store_locally_only), STORED_LOCALLY_ONLY, Color.TRANSPARENT)
@ -51,8 +56,9 @@ class SelectEventCalendarDialog(val activity: Activity, val calendars: List<CalD
id = typeId
}
if (color != Color.TRANSPARENT)
if (typeId != STORED_LOCALLY_ONLY) {
view.dialog_radio_color.setFillWithStroke(color, activity.config.backgroundColor)
}
view.setOnClickListener { viewClicked(typeId) }
radioGroup.addView(view, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))

View File

@ -1,18 +1,18 @@
package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.graphics.Color
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.RadioGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.helpers.CalDAVHandler
import com.simplemobiletools.calendar.models.EventType
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.setFillWithStroke
import com.simplemobiletools.commons.extensions.setupDialogStuff
import kotlinx.android.synthetic.main.dialog_select_radio_group.view.*
import kotlinx.android.synthetic.main.dialog_select_event_type_color.view.*
import kotlinx.android.synthetic.main.radio_button_with_color.view.*
class SelectEventTypeColorDialog(val activity: Activity, val eventType: EventType, val callback: (color: Int) -> Unit) {
@ -22,8 +22,11 @@ class SelectEventTypeColorDialog(val activity: Activity, val eventType: EventTyp
private val colors = CalDAVHandler(activity.applicationContext).getAvailableCalDAVCalendarColors(eventType)
init {
val view = activity.layoutInflater.inflate(R.layout.dialog_select_radio_group, null) as ViewGroup
radioGroup = view.dialog_radio_group
val view = activity.layoutInflater.inflate(R.layout.dialog_select_event_type_color, null) as ViewGroup
radioGroup = view.dialog_select_event_type_color_radio
view.dialog_select_event_type_other_value.setOnClickListener {
showCustomColorPicker()
}
colors.forEachIndexed { index, value ->
addRadioButton(index, value)
@ -33,21 +36,25 @@ class SelectEventTypeColorDialog(val activity: Activity, val eventType: EventTyp
dialog = AlertDialog.Builder(activity)
.create().apply {
activity.setupDialogStuff(view, this)
if (colors.isEmpty()) {
showCustomColorPicker()
}
}
}
private fun addRadioButton(colorKey: Int, color: Int) {
val view = activity.layoutInflater.inflate(R.layout.radio_button_with_color, null)
(view.dialog_radio_button as RadioButton).apply {
text = String.format("#%06X", 0xFFFFFF and color)
text = if (color == 0) activity.getString(R.string.transparent) else String.format("#%06X", 0xFFFFFF and color)
isChecked = color == eventType.color
id = colorKey
}
if (color != Color.TRANSPARENT)
view.dialog_radio_color.setFillWithStroke(color, activity.config.backgroundColor)
view.setOnClickListener { viewClicked(colorKey) }
view.dialog_radio_color.setFillWithStroke(color, activity.config.backgroundColor)
view.setOnClickListener {
viewClicked(colorKey)
}
radioGroup.addView(view, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
}
@ -58,4 +65,13 @@ class SelectEventTypeColorDialog(val activity: Activity, val eventType: EventTyp
callback(colors[colorKey])
dialog?.dismiss()
}
private fun showCustomColorPicker() {
ColorPickerDialog(activity, activity.config.primaryColor) { wasPositivePressed, color ->
if (wasPositivePressed) {
callback(color)
}
dialog?.dismiss()
}
}
}

View File

@ -2,9 +2,9 @@ package com.simplemobiletools.calendar.dialogs
import android.app.Activity
import android.graphics.Color
import android.support.v7.app.AlertDialog
import android.view.ViewGroup
import android.widget.RadioGroup
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
@ -72,7 +72,7 @@ class SelectEventTypeDialog(val activity: Activity, val currEventType: Int, val
}
if (eventType.id == NEW_TYPE_ID) {
UpdateEventTypeDialog(activity) {
EditEventTypeDialog(activity) {
callback(it)
activity.hideKeyboard()
dialog?.dismiss()

View File

@ -55,9 +55,9 @@ fun Activity.showEventRepeatIntervalDialog(curSeconds: Int, callback: (minutes:
}
val items = ArrayList<RadioItem>(seconds.size + 1)
seconds.mapIndexedTo(items, { index, value ->
seconds.mapIndexedTo(items) { index, value ->
RadioItem(index, getRepetitionText(value), value)
})
}
var selectedIndex = 0
seconds.forEachIndexed { index, value ->

View File

@ -14,13 +14,13 @@ import android.media.AudioAttributes
import android.net.Uri
import android.os.Bundle
import android.provider.CalendarContract
import android.support.v4.app.AlarmManagerCompat
import android.support.v4.app.NotificationCompat
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.app.AlarmManagerCompat
import androidx.core.app.NotificationCompat
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.EventActivity
import com.simplemobiletools.calendar.activities.SimpleActivity
@ -85,7 +85,7 @@ fun Context.scheduleNextEventReminder(event: Event, dbHelper: DBHelper, activity
val now = getNowSeconds()
val reminderSeconds = event.getReminders().reversed().map { it * 60 }
dbHelper.getEvents(now, now + YEAR, event.id) {
dbHelper.getEvents(now, now + YEAR, event.id, false) {
if (it.isNotEmpty()) {
for (curEvent in it) {
for (curReminder in reminderSeconds) {
@ -146,11 +146,6 @@ fun Context.getRepetitionText(seconds: Int) = when (seconds) {
}
}
fun Context.getFilteredEvents(events: List<Event>): ArrayList<Event> {
val displayEventTypes = config.displayEventTypes
return events.filter { displayEventTypes.contains(it.eventType.toString()) } as ArrayList<Event>
}
fun Context.notifyRunningEvents() {
dbHelper.getRunningEvents().filter { it.getReminders().isNotEmpty() }.forEach {
notifyEvent(it)
@ -453,7 +448,7 @@ fun Context.handleEventDeleting(eventIds: List<Int>, timestamps: List<Int>, acti
}
}
DELETE_ALL_OCCURRENCES -> {
val eventIDs = Array(eventIds.size, { i -> (eventIds[i].toString()) })
val eventIDs = Array(eventIds.size) { i -> (eventIds[i].toString()) }
dbHelper.deleteEvents(eventIDs, true)
}
}

View File

@ -2,20 +2,19 @@ package com.simplemobiletools.calendar.fragments
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.DatePicker
import android.widget.RelativeLayout
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.EventActivity
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.adapters.DayEventsAdapter
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.getFilteredEvents
import com.simplemobiletools.calendar.helpers.DAY_CODE
import com.simplemobiletools.calendar.helpers.EVENT_ID
import com.simplemobiletools.calendar.helpers.EVENT_OCCURRENCE_TS
@ -106,21 +105,20 @@ class DayFragment : Fragment() {
fun updateCalendar() {
val startTS = Formatter.getDayStartTS(mDayCode)
val endTS = Formatter.getDayEndTS(mDayCode)
context?.dbHelper?.getEvents(startTS, endTS) {
context?.dbHelper?.getEvents(startTS, endTS, applyTypeFilter = true) {
receivedEvents(it)
}
}
private fun receivedEvents(events: List<Event>) {
val filtered = context?.getFilteredEvents(events) ?: ArrayList()
val newHash = filtered.hashCode()
val newHash = events.hashCode()
if (newHash == lastHash || !isAdded) {
return
}
lastHash = newHash
val replaceDescription = context!!.config.replaceDescription
val sorted = ArrayList<Event>(filtered.sortedWith(compareBy({ !it.getIsAllDay() }, { it.startTS }, { it.endTS }, { it.title }, {
val sorted = ArrayList<Event>(events.sortedWith(compareBy({ !it.getIsAllDay() }, { it.startTS }, { it.endTS }, { it.title }, {
if (replaceDescription) it.location else it.description
})))

View File

@ -2,10 +2,10 @@ package com.simplemobiletools.calendar.fragments
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.v4.view.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.MainActivity
import com.simplemobiletools.calendar.adapters.MyDayPagerAdapter

View File

@ -76,7 +76,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
maxFetchedTS = DateTime().plusMonths(6).seconds()
}
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) {
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS, applyTypeFilter = true) {
if (it.size >= MIN_EVENTS_TRESHOLD) {
receivedEvents(it, false)
} else {
@ -84,7 +84,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
minFetchedTS -= FETCH_INTERVAL
maxFetchedTS += FETCH_INTERVAL
}
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) {
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS, applyTypeFilter = true) {
mEvents = it
receivedEvents(mEvents, false, !wereInitialEventsAdded)
}
@ -98,7 +98,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
return
}
mEvents = context!!.getFilteredEvents(events)
mEvents = events
val listItems = context!!.getEventListItems(mEvents)
activity?.runOnUiThread {
@ -150,7 +150,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private fun fetchPreviousPeriod() {
val oldMinFetchedTS = minFetchedTS - 1
minFetchedTS -= FETCH_INTERVAL
context!!.dbHelper.getEvents(minFetchedTS, oldMinFetchedTS) {
context!!.dbHelper.getEvents(minFetchedTS, oldMinFetchedTS, applyTypeFilter = true) {
mEvents.addAll(0, it)
receivedEvents(mEvents, false)
}
@ -159,7 +159,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private fun fetchNextPeriod(scrollAfterUpdating: Boolean) {
val oldMaxFetchedTS = maxFetchedTS + 1
maxFetchedTS += FETCH_INTERVAL
context!!.dbHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) {
context!!.dbHelper.getEvents(oldMaxFetchedTS, maxFetchedTS, applyTypeFilter = true) {
mEvents.addAll(it)
receivedEvents(mEvents, scrollAfterUpdating)
}

View File

@ -3,8 +3,8 @@ package com.simplemobiletools.calendar.fragments
import android.content.Context
import android.content.res.Resources
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.appcompat.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

View File

@ -2,10 +2,10 @@ package com.simplemobiletools.calendar.fragments
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.v4.view.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.MainActivity
import com.simplemobiletools.calendar.adapters.MyMonthPagerAdapter

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.calendar.fragments
import android.support.v4.app.Fragment
import androidx.fragment.app.Fragment
abstract class MyFragmentHolder : Fragment() {
abstract fun goToToday()

View File

@ -5,17 +5,19 @@ import android.content.res.Resources
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.SparseIntArray
import android.view.*
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.EventActivity
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.getFilteredEvents
import com.simplemobiletools.calendar.extensions.seconds
import com.simplemobiletools.calendar.helpers.*
import com.simplemobiletools.calendar.helpers.Formatter
@ -61,6 +63,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
lateinit var mScrollView: MyScrollView
lateinit var mCalendar: WeeklyCalendarImpl
lateinit var mRes: Resources
lateinit var mConfig: Config
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -68,12 +71,13 @@ class WeekFragment : Fragment(), WeeklyCalendar {
it.map { eventTypeColors.put(it.id, it.color) }
}
mRowHeight = context!!.resources.getDimension(R.dimen.weekly_view_row_height)
minScrollY = (mRowHeight * context!!.config.startWeeklyAt).toInt()
mRes = context!!.resources
mConfig = context!!.config
mRowHeight = mRes.getDimension(R.dimen.weekly_view_row_height)
minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt()
mWeekTimestamp = arguments!!.getInt(WEEK_START_TIMESTAMP)
dimPastEvents = context!!.config.dimPastEvents
dimPastEvents = mConfig.dimPastEvents
primaryColor = context!!.getAdjustedPrimaryColor()
mRes = resources
allDayRows.add(HashSet())
mCalendar = WeeklyCalendarImpl(this, context!!)
}
@ -97,11 +101,6 @@ class WeekFragment : Fragment(), WeeklyCalendar {
return mView
}
override fun onPause() {
super.onPause()
wasExtraHeightAdded = true
}
override fun onResume() {
super.onResume()
setupDayLabels()
@ -112,8 +111,8 @@ class WeekFragment : Fragment(), WeeklyCalendar {
return@onGlobalLayout
}
minScrollY = (mRowHeight * context!!.config.startWeeklyAt).toInt()
maxScrollY = (mRowHeight * context!!.config.endWeeklyAt).toInt()
minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt()
maxScrollY = (mRowHeight * mConfig.endWeeklyAt).toInt()
val bounds = Rect()
week_events_holder.getGlobalVisibleRect(bounds)
@ -125,6 +124,16 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
}
override fun onPause() {
super.onPause()
wasExtraHeightAdded = true
}
override fun onDestroyView() {
super.onDestroyView()
mWasDestroyed = true
}
override fun setMenuVisibility(menuVisible: Boolean) {
super.setMenuVisibility(menuVisible)
isFragmentVisible = menuVisible
@ -140,11 +149,11 @@ class WeekFragment : Fragment(), WeeklyCalendar {
private fun setupDayLabels() {
var curDay = Formatter.getDateTimeFromTS(mWeekTimestamp)
val textColor = context!!.config.textColor
val textColor = mConfig.textColor
val todayCode = Formatter.getDayCodeFromDateTime(DateTime())
for (i in 0..6) {
val dayCode = Formatter.getDayCodeFromDateTime(curDay)
val dayLetters = mRes.getStringArray(R.array.week_day_letters).toList() as ArrayList<String>
val dayLetters = mRes.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
val dayLetter = dayLetters[curDay.dayOfWeek - 1]
mView.findViewById<TextView>(mRes.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply {
@ -187,7 +196,6 @@ class WeekFragment : Fragment(), WeeklyCalendar {
selectedGrid?.animation?.cancel()
selectedGrid?.beGone()
//val rowHeight = resources.getDimension(R.dimen.weekly_view_row_height)
val hour = (event.y / mRowHeight).toInt()
selectedGrid = (inflater.inflate(R.layout.week_grid_item, null, false) as ImageView).apply {
view.addView(this)
@ -215,25 +223,13 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
override fun updateWeeklyCalendar(events: ArrayList<Event>) {
if (context == null) {
return
}
val newEvents = context!!.getFilteredEvents(events)
val newHash = newEvents.hashCode()
if (newHash == lastHash) {
val newHash = events.hashCode()
if (newHash == lastHash || mWasDestroyed || context == null) {
return
}
lastHash = newHash
this.events = newEvents
updateEvents()
}
private fun updateEvents() {
if (mWasDestroyed) {
return
}
this.events = events
activity!!.runOnUiThread {
if (context != null && activity != null && isAdded) {
@ -256,7 +252,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt()
var hadAllDayEvent = false
val replaceDescription = context!!.config.replaceDescription
val replaceDescription = mConfig.replaceDescription
val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))
for (event in sorted) {
if (event.getIsAllDay() || Formatter.getDayCodeFromTS(event.startTS) != Formatter.getDayCodeFromTS(event.endTS)) {
@ -265,7 +261,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
} else {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
val dayOfWeek = startDateTime.plusDays(if (context!!.config.isSundayFirst) 1 else 0).dayOfWeek - 1
val dayOfWeek = startDateTime.plusDays(if (mConfig.isSundayFirst) 1 else 0).dayOfWeek - 1
val layout = getColumnWithId(dayOfWeek)
val startMinutes = startDateTime.minuteOfDay
@ -320,7 +316,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
applyColorFilter(primaryColor)
mView.week_events_holder.addView(this, 0)
val extraWidth = (todayColumn.width * 0.3).toInt()
val markerHeight = resources.getDimension(R.dimen.weekly_view_now_height).toInt()
val markerHeight = mRes.getDimension(R.dimen.weekly_view_now_height).toInt()
(layoutParams as RelativeLayout.LayoutParams).apply {
width = todayColumn.width + extraWidth
height = markerHeight
@ -332,14 +328,11 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
private fun checkTopHolderHeight() {
mView.week_top_holder.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
mView.week_top_holder.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (isFragmentVisible && activity != null) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
}
mView.week_top_holder.onGlobalLayout {
if (isFragmentVisible && activity != null && !mWasDestroyed) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
}
})
}
}
private fun addAllDayEvent(event: Event) {
@ -363,7 +356,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
val daysCnt = Days.daysBetween(Formatter.getDateTimeFromTS(minTS).toLocalDate(), Formatter.getDateTimeFromTS(maxTS).toLocalDate()).days
val startDateTimeInWeek = Formatter.getDateTimeFromTS(minTS)
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (context!!.config.isSundayFirst) 0 else 1) % 7
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (mConfig.isSundayFirst) 0 else 1) % 7
var doesEventFit: Boolean
val cnt = allDayRows.size - 1
var wasEventHandled = false
@ -417,12 +410,8 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
private fun calculateExtraHeight() {
mView.week_top_holder.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (activity == null)
return
mView.week_top_holder.viewTreeObserver.removeOnGlobalLayoutListener(this)
mView.week_top_holder.onGlobalLayout {
if (activity != null && !mWasDestroyed) {
if (isFragmentVisible) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
}
@ -432,12 +421,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
wasExtraHeightAdded = true
}
}
})
}
override fun onDestroyView() {
super.onDestroyView()
mWasDestroyed = true
}
}
private fun getColumnWithId(id: Int) = mView.findViewById<ViewGroup>(mRes.getIdentifier("week_column_$id", "id", context!!.packageName))

View File

@ -2,11 +2,11 @@ package com.simplemobiletools.calendar.fragments
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.v4.view.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.MainActivity
import com.simplemobiletools.calendar.adapters.MyWeekPagerAdapter
@ -67,11 +67,9 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
weekHolder!!.week_view_view_pager.apply {
adapter = weeklyAdapter
addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
currentWeekTS = weekTSs[position]

View File

@ -2,7 +2,7 @@ package com.simplemobiletools.calendar.fragments
import android.content.res.Resources
import android.os.Bundle
import android.support.v4.app.Fragment
import androidx.fragment.app.Fragment
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View

View File

@ -2,7 +2,7 @@ package com.simplemobiletools.calendar.fragments
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.v4.view.ViewPager
import androidx.viewpager.widget.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

View File

@ -30,7 +30,6 @@ class CalDAVHandler(val context: Context) {
title = calendar.displayName
caldavDisplayName = calendar.displayName
caldavEmail = calendar.accountName
color = calendar.color
context.dbHelper.updateLocalEventType(this)
}
@ -81,14 +80,13 @@ class CalDAVHandler(val context: Context) {
return calendars
}
fun updateCalDAVCalendar(eventType: EventType): Boolean {
fun updateCalDAVCalendar(eventType: EventType) {
val uri = CalendarContract.Calendars.CONTENT_URI
val values = fillCalendarContentValues(eventType)
val newUri = ContentUris.withAppendedId(uri, eventType.caldavCalendarId.toLong())
return try {
context.contentResolver.update(newUri, values, null, null) == 1
try {
context.contentResolver.update(newUri, values, null, null)
} catch (e: IllegalArgumentException) {
false
}
}
@ -119,53 +117,6 @@ class CalDAVHandler(val context: Context) {
return -1
}
// it doesnt work properly, needs better SyncAdapter handling
private fun insertNewColor(eventType: EventType): Int {
val maxId = getMaxColorId(eventType) + 1
val values = ContentValues().apply {
put(CalendarContract.Colors.COLOR_KEY, maxId)
put(CalendarContract.Colors.COLOR, eventType.color)
put(CalendarContract.Colors.ACCOUNT_NAME, eventType.caldavEmail)
put(CalendarContract.Colors.ACCOUNT_TYPE, "com.google")
put(CalendarContract.Colors.COLOR_TYPE, CalendarContract.Colors.TYPE_CALENDAR)
}
val uri = CalendarContract.Colors.CONTENT_URI.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, eventType.caldavEmail)
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google")
.build()
return if (context.contentResolver.insert(uri, values) != null) {
maxId
} else {
0
}
}
private fun getMaxColorId(eventType: EventType): Int {
val uri = CalendarContract.Colors.CONTENT_URI
val projection = arrayOf(CalendarContract.Colors.COLOR_KEY, CalendarContract.Colors.COLOR)
val selection = "${CalendarContract.Colors.COLOR_TYPE} = ? AND ${CalendarContract.Colors.ACCOUNT_NAME} = ?"
val selectionArgs = arrayOf(CalendarContract.Colors.TYPE_CALENDAR.toString(), eventType.caldavEmail)
var maxId = 1
var cursor: Cursor? = null
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor != null && cursor.moveToFirst()) {
do {
maxId = Math.max(maxId, cursor.getIntValue(CalendarContract.Colors.COLOR_KEY))
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
return maxId
}
fun getAvailableCalDAVCalendarColors(eventType: EventType): ArrayList<Int> {
val colors = SparseIntArray()
val uri = CalendarContract.Colors.CONTENT_URI
@ -309,9 +260,7 @@ class CalDAVHandler(val context: Context) {
}
}
eventIdsToDelete.forEach {
context.dbHelper.deleteEvents(eventIdsToDelete.toTypedArray(), false)
}
context.dbHelper.deleteEvents(eventIdsToDelete.toTypedArray(), false)
}
fun insertCalDAVEvent(event: Event) {

View File

@ -52,7 +52,7 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getInt(VIEW, MONTHLY_VIEW)
set(view) = prefs.edit().putInt(VIEW, view).apply()
var lastEventReminderMinutes: Int
var lastEventReminderMinutes1: Int
get() = prefs.getInt(LAST_EVENT_REMINDER_MINUTES, 10)
set(lastEventReminderMinutes) = prefs.edit().putInt(LAST_EVENT_REMINDER_MINUTES, lastEventReminderMinutes).apply()
@ -76,6 +76,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getInt(FONT_SIZE, FONT_SIZE_MEDIUM)
set(size) = prefs.edit().putInt(FONT_SIZE, size).apply()
var listWidgetViewToOpen: Int
get() = prefs.getInt(LIST_WIDGET_VIEW_TO_OPEN, DAILY_VIEW)
set(viewToOpenFromListWidget) = prefs.edit().putInt(LIST_WIDGET_VIEW_TO_OPEN, viewToOpenFromListWidget).apply()
var caldavSync: Boolean
get() = prefs.getBoolean(CALDAV_SYNC, false)
set(caldavSync) {
@ -158,4 +162,8 @@ class Config(context: Context) : BaseConfig(context) {
var defaultReminder3: Int
get() = prefs.getInt(DEFAULT_REMINDER_3, REMINDER_OFF)
set(defaultReminder3) = prefs.edit().putInt(DEFAULT_REMINDER_3, defaultReminder3).apply()
var pullToRefresh: Boolean
get() = prefs.getBoolean(PULL_TO_REFRESH, false)
set(pullToRefresh) = prefs.edit().putBoolean(PULL_TO_REFRESH, pullToRefresh).apply()
}

View File

@ -14,13 +14,14 @@ const val WEEK_START_TIMESTAMP = "week_start_timestamp"
const val NEW_EVENT_SET_HOUR_DURATION = "new_event_set_hour_duration"
const val WEEK_START_DATE_TIME = "week_start_date_time"
const val CALDAV = "Caldav"
const val OPEN_MONTH = "open_month"
const val VIEW_TO_OPEN = "view_to_open"
const val MONTHLY_VIEW = 1
const val YEARLY_VIEW = 2
const val EVENTS_LIST_VIEW = 3
const val WEEKLY_VIEW = 4
const val DAILY_VIEW = 5
const val LAST_VIEW = 6
const val REMINDER_OFF = -1
@ -46,6 +47,7 @@ const val LAST_EVENT_REMINDER_MINUTES_2 = "reminder_minutes_2"
const val LAST_EVENT_REMINDER_MINUTES_3 = "reminder_minutes_3"
const val DISPLAY_EVENT_TYPES = "display_event_types"
const val FONT_SIZE = "font_size"
const val LIST_WIDGET_VIEW_TO_OPEN = "list_widget_view_to_open"
const val CALDAV_SYNC = "caldav_sync"
const val CALDAV_SYNCED_CALENDAR_IDS = "caldav_synced_calendar_ids"
const val LAST_USED_CALDAV_CALENDAR = "last_used_caldav_calendar"
@ -62,6 +64,7 @@ const val USE_PREVIOUS_EVENT_REMINDERS = "use_previous_event_reminders"
const val DEFAULT_REMINDER_1 = "default_reminder_1"
const val DEFAULT_REMINDER_2 = "default_reminder_2"
const val DEFAULT_REMINDER_3 = "default_reminder_3"
const val PULL_TO_REFRESH = "pull_to_refresh"
// repeat_rule for monthly and yearly repetition
const val REPEAT_SAME_DAY = 1 // i.e. 25th every month, or 3rd june (if yearly repetition)

View File

@ -320,15 +320,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
}
fun updateEventType(eventType: EventType): Int {
return if (eventType.caldavCalendarId != 0) {
if (CalDAVHandler(context).updateCalDAVCalendar(eventType)) {
updateLocalEventType(eventType)
} else {
-1
}
} else {
updateLocalEventType(eventType)
if (eventType.caldavCalendarId != 0) {
CalDAVHandler(context).updateCalDAVCalendar(eventType)
}
return updateLocalEventType(eventType)
}
fun updateLocalEventType(eventType: EventType): Int {
@ -573,7 +569,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
}
fun deleteEventTypes(eventTypes: ArrayList<EventType>, deleteEvents: Boolean, callback: (deletedCnt: Int) -> Unit) {
var deleteIds = eventTypes.filter { it.caldavCalendarId == 0 }.map { it.id }
var deleteIds = eventTypes.asSequence().filter { it.caldavCalendarId == 0 }.map { it.id }.toList()
deleteIds = deleteIds.filter { it != DBHelper.REGULAR_EVENT_TYPE_ID } as ArrayList<Int>
val deletedSet = HashSet<String>()
@ -606,7 +602,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
val selectionArgs = arrayOf(eventTypeId.toString())
val cursor = getEventsCursor(selection, selectionArgs)
val events = fillEvents(cursor)
val eventIDs = Array(events.size, { i -> (events[i].id.toString()) })
val eventIDs = Array(events.size) { i -> (events[i].id.toString()) }
deleteEvents(eventIDs, true)
}
@ -681,37 +677,58 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
}.start()
}
fun getEvents(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
fun getEvents(fromTS: Int, toTS: Int, eventId: Int = -1, applyTypeFilter: Boolean = false, callback: (events: ArrayList<Event>) -> Unit) {
Thread {
getEventsInBackground(fromTS, toTS, eventId, callback)
getEventsInBackground(fromTS, toTS, eventId, applyTypeFilter, callback)
}.start()
}
fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
val events = ArrayList<Event>()
fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Int = -1, applyTypeFilter: Boolean, callback: (events: ArrayList<Event>) -> Unit) {
var events = ArrayList<Event>()
var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS NULL AND $COL_START_TS != 0"
if (eventId != -1)
selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isNotEmpty()) {
val types = TextUtils.join(",", displayEventTypes)
selection += " AND $COL_EVENT_TYPE IN ($types)"
}
}
val selectionArgs = arrayOf(toTS.toString(), fromTS.toString())
val cursor = getEventsCursor(selection, selectionArgs)
events.addAll(fillEvents(cursor))
events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId))
events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId, applyTypeFilter))
events.addAll(getAllDayEvents(fromTS, eventId))
events.addAll(getAllDayEvents(fromTS, eventId, applyTypeFilter))
val filtered = events.distinct().filterNot { it.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(it.startTS).toInt()) } as ArrayList<Event>
callback(filtered)
events = events
.asSequence()
.distinct()
.filterNot { it.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(it.startTS).toInt()) }
.toMutableList() as ArrayList<Event>
callback(events)
}
fun getRepeatableEventsFor(fromTS: Int, toTS: Int, eventId: Int = -1): List<Event> {
fun getRepeatableEventsFor(fromTS: Int, toTS: Int, eventId: Int = -1, applyTypeFilter: Boolean = false): List<Event> {
val newEvents = ArrayList<Event>()
// get repeatable events
var selection = "$COL_REPEAT_INTERVAL != 0 AND $COL_START_TS <= $toTS AND $COL_START_TS != 0"
if (eventId != -1)
selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isNotEmpty()) {
val types = TextUtils.join(",", displayEventTypes)
selection += " AND $COL_EVENT_TYPE IN ($types)"
}
}
val events = getEvents(selection)
val startTimes = SparseIntArray(events.size)
events.forEach {
@ -792,19 +809,27 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
return events
}
private fun getAllDayEvents(fromTS: Int, eventId: Int = -1): List<Event> {
private fun getAllDayEvents(fromTS: Int, eventId: Int = -1, applyTypeFilter: Boolean = false): List<Event> {
val events = ArrayList<Event>()
var selection = "($COL_FLAGS & $FLAG_ALL_DAY) != 0"
if (eventId != -1)
selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
if (applyTypeFilter) {
val displayEventTypes = context.config.displayEventTypes
if (displayEventTypes.isNotEmpty()) {
val types = TextUtils.join(",", displayEventTypes)
selection += " AND $COL_EVENT_TYPE IN ($types)"
}
}
val dayCode = Formatter.getDayCodeFromTS(fromTS)
val cursor = getEventsCursor(selection)
events.addAll(fillEvents(cursor).filter { dayCode == Formatter.getDayCodeFromTS(it.startTS) })
return events
}
// check if its the proper week, for events repeating by x weeks
// check if its the proper week, for events repeating every x weeks
private fun isOnProperWeek(event: Event, startTimes: SparseIntArray): Boolean {
val initialWeekOfYear = Formatter.getDateTimeFromTS(startTimes[event.id]).weekOfWeekyear
val currentWeekOfYear = Formatter.getDateTimeFromTS(event.startTS).weekOfWeekyear
@ -959,7 +984,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
}
fun getEventTypesSync(): ArrayList<EventType> {
val eventTypes = ArrayList<EventType>(4)
val eventTypes = ArrayList<EventType>()
val cols = arrayOf(COL_TYPE_ID, COL_TYPE_TITLE, COL_TYPE_COLOR, COL_TYPE_CALDAV_CALENDAR_ID, COL_TYPE_CALDAV_DISPLAY_NAME, COL_TYPE_CALDAV_EMAIL)
var cursor: Cursor? = null
try {

View File

@ -15,7 +15,7 @@ object Formatter {
const val TIME_PATTERN = "HHmmss"
private const val DAY_PATTERN = "d"
private const val DAY_OF_WEEK_PATTERN = "EEE"
private const val LONGEST_PATTERN = "MMMM dd YYYY (EEEE)"
private const val LONGEST_PATTERN = "MMMM d YYYY (EEEE)"
private const val PATTERN_TIME_12 = "hh:mm a"
private const val PATTERN_TIME_24 = "HH:mm"
@ -26,7 +26,7 @@ object Formatter {
val dateTime = getDateTimeFromCode(dayCode)
val day = dateTime.toString(DAY_PATTERN)
val year = dateTime.toString(YEAR_PATTERN)
val monthIndex = Integer.valueOf(dayCode.substring(4, 6))!!
val monthIndex = Integer.valueOf(dayCode.substring(4, 6))
var month = getMonthName(context, monthIndex)
if (shortMonth)
month = month.substring(0, Math.min(month.length, 3))

View File

@ -140,8 +140,8 @@ class IcsImporter(val activity: SimpleActivity) {
val eventType = eventTypes.firstOrNull { it.id == curEventTypeId }
val source = if (calDAVCalendarId == 0 || eventType?.isSyncedEventType() == false) SOURCE_IMPORTED_ICS else "$CALDAV-$calDAVCalendarId"
val event = Event(0, curStart, curEnd, curTitle, curDescription, curReminderMinutes.getOrElse(0, { -1 }),
curReminderMinutes.getOrElse(1, { -1 }), curReminderMinutes.getOrElse(2, { -1 }), curRepeatInterval,
val event = Event(0, curStart, curEnd, curTitle, curDescription, curReminderMinutes.getOrElse(0) { -1 },
curReminderMinutes.getOrElse(1) { -1 }, curReminderMinutes.getOrElse(2) { -1 }, curRepeatInterval,
curImportId, curFlags, curRepeatLimit, curRepeatRule, curEventTypeId, lastUpdated = curLastModified,
source = source, location = curLocation)

View File

@ -3,7 +3,6 @@ package com.simplemobiletools.calendar.helpers
import android.content.Context
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.getFilteredEvents
import com.simplemobiletools.calendar.extensions.seconds
import com.simplemobiletools.calendar.interfaces.MonthlyCalendar
import com.simplemobiletools.calendar.models.DayMonthly
@ -12,22 +11,20 @@ import org.joda.time.DateTime
import java.util.*
import kotlin.collections.ArrayList
class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context) {
class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) {
private val DAYS_CNT = 42
private val YEAR_PATTERN = "YYYY"
private val mToday: String = DateTime().toString(Formatter.DAYCODE_PATTERN)
private var mEvents = ArrayList<Event>()
private var mFilterEventTypes = true
lateinit var mTargetDate: DateTime
fun updateMonthlyCalendar(targetDate: DateTime, filterEventTypes: Boolean = true) {
mFilterEventTypes = filterEventTypes
fun updateMonthlyCalendar(targetDate: DateTime) {
mTargetDate = targetDate
val startTS = mTargetDate.minusDays(7).seconds()
val endTS = mTargetDate.plusDays(43).seconds()
mContext.dbHelper.getEvents(startTS, endTS) {
context.dbHelper.getEvents(startTS, endTS, applyTypeFilter = true) {
gotEvents(it)
}
}
@ -40,7 +37,7 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context)
val days = ArrayList<DayMonthly>(DAYS_CNT)
val currMonthDays = mTargetDate.dayOfMonth().maximumValue
var firstDayIndex = mTargetDate.withDayOfMonth(1).dayOfWeek
if (!mContext.config.isSundayFirst)
if (!context.config.isSundayFirst)
firstDayIndex -= 1
val prevMonthDays = mTargetDate.minusMonths(1).dayOfMonth().maximumValue
@ -79,13 +76,13 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context)
if (markDaysWithEvents) {
markDaysWithEvents(days)
} else {
mCallback.updateMonthlyCalendar(mContext, monthName, days, false, mTargetDate)
callback.updateMonthlyCalendar(context, monthName, days, false, mTargetDate)
}
}
// it works more often than not, dont touch
private fun markDaysWithEvents(days: ArrayList<DayMonthly>) {
mContext.dbHelper.getEventTypes {
context.dbHelper.getEventTypes {
val dayEvents = HashMap<String, ArrayList<Event>>()
mEvents.forEach {
val startDateTime = Formatter.getDateTimeFromTS(it.startTS)
@ -110,7 +107,7 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context)
days.filter { dayEvents.keys.contains(it.code) }.forEach {
it.dayEvents = dayEvents[it.code]!!
}
mCallback.updateMonthlyCalendar(mContext, monthName, days, true, mTargetDate)
callback.updateMonthlyCalendar(context, monthName, days, true, mTargetDate)
}
}
@ -121,7 +118,7 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context)
private val monthName: String
get() {
var month = Formatter.getMonthName(mContext, mTargetDate.monthOfYear)
var month = Formatter.getMonthName(context, mTargetDate.monthOfYear)
val targetYear = mTargetDate.toString(YEAR_PATTERN)
if (targetYear != DateTime().toString(YEAR_PATTERN)) {
month += " $targetYear"
@ -130,12 +127,7 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context)
}
private fun gotEvents(events: ArrayList<Event>) {
mEvents = if (mFilterEventTypes) {
mContext.getFilteredEvents(events)
} else {
events
}
mEvents = events
getDays(true)
}
}

View File

@ -18,7 +18,7 @@ import org.joda.time.DateTime
class MyWidgetListProvider : AppWidgetProvider() {
private val NEW_EVENT = "new_event"
private val LAUNCH_TODAY = "launch_today"
private val LAUNCH_CAL = "launch_cal"
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
performUpdate(context)
@ -44,7 +44,7 @@ class MyWidgetListProvider : AppWidgetProvider() {
views.setImageViewBitmap(R.id.widget_event_new_event, context.resources.getColoredBitmap(R.drawable.ic_plus, textColor))
setupIntent(context, views, NEW_EVENT, R.id.widget_event_new_event)
setupIntent(context, views, LAUNCH_TODAY, R.id.widget_event_list_today)
setupIntent(context, views, LAUNCH_CAL, R.id.widget_event_list_today)
Intent(context, WidgetService::class.java).apply {
data = Uri.parse(this.toUri(Intent.URI_INTENT_SCHEME))
@ -74,14 +74,15 @@ class MyWidgetListProvider : AppWidgetProvider() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
NEW_EVENT -> context.launchNewEventIntent()
LAUNCH_TODAY -> launchDayActivity(context)
LAUNCH_CAL -> launchCalenderInDefaultView(context)
else -> super.onReceive(context, intent)
}
}
private fun launchDayActivity(context: Context) {
private fun launchCalenderInDefaultView(context: Context) {
(context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply {
putExtra(DAY_CODE, Formatter.getDayCodeFromDateTime(DateTime()))
putExtra(VIEW_TO_OPEN, context.config.listWidgetViewToOpen)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(this)
}

View File

@ -49,7 +49,7 @@ class MyWidgetMonthlyProvider : AppWidgetProvider() {
private fun setupAppOpenIntent(context: Context, views: RemoteViews, id: Int, dayCode: String) {
(context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply {
putExtra(DAY_CODE, dayCode)
putExtra(OPEN_MONTH, true)
putExtra(VIEW_TO_OPEN, MONTHLY_VIEW)
val pendingIntent = PendingIntent.getActivity(context, Integer.parseInt(dayCode.substring(0, 6)), this, 0)
views.setOnClickPendingIntent(id, pendingIntent)
}

View File

@ -7,15 +7,14 @@ import com.simplemobiletools.calendar.models.Event
import com.simplemobiletools.commons.helpers.WEEK_SECONDS
import java.util.*
class WeeklyCalendarImpl(val mCallback: WeeklyCalendar, val mContext: Context) {
class WeeklyCalendarImpl(val callback: WeeklyCalendar, val context: Context) {
var mEvents = ArrayList<Event>()
fun updateWeeklyCalendar(weekStartTS: Int) {
val startTS = weekStartTS
val endTS = startTS + WEEK_SECONDS
mContext.dbHelper.getEvents(startTS, endTS) {
val endTS = weekStartTS + WEEK_SECONDS
context.dbHelper.getEvents(weekStartTS, endTS, applyTypeFilter = true) {
mEvents = it
mCallback.updateWeeklyCalendar(it)
callback.updateWeeklyCalendar(it)
}
}
}

View File

@ -3,7 +3,6 @@ package com.simplemobiletools.calendar.helpers
import android.content.Context
import android.util.SparseArray
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.getFilteredEvents
import com.simplemobiletools.calendar.extensions.seconds
import com.simplemobiletools.calendar.interfaces.YearlyCalendar
import com.simplemobiletools.calendar.models.DayYearly
@ -17,16 +16,15 @@ class YearlyCalendarImpl(val callback: YearlyCalendar, val context: Context, val
val startDateTime = DateTime().withTime(0, 0, 0, 0).withDate(year, 1, 1)
val startTS = startDateTime.seconds()
val endTS = startDateTime.plusYears(1).minusSeconds(1).seconds()
context.dbHelper.getEvents(startTS, endTS) {
context.dbHelper.getEvents(startTS, endTS, applyTypeFilter = true) {
gotEvents(it)
}
}
private fun gotEvents(events: MutableList<Event>) {
val filtered = context.getFilteredEvents(events)
val arr = SparseArray<ArrayList<DayYearly>>(12)
filtered.forEach {
events.forEach {
val startDateTime = Formatter.getDateTimeFromTS(it.startTS)
markDay(arr, startDateTime, it)
@ -41,7 +39,7 @@ class YearlyCalendarImpl(val callback: YearlyCalendar, val context: Context, val
}
}
}
callback.updateYearlyCalendar(arr, filtered.hashCode())
callback.updateYearlyCalendar(arr, events.hashCode())
}
private fun markDay(arr: SparseArray<ArrayList<DayYearly>>, dateTime: DateTime, event: Event) {

View File

@ -1,7 +1,7 @@
package com.simplemobiletools.calendar.models
data class CalDAVCalendar(val id: Int, val displayName: String, val accountName: String, val accountType: String, val ownerName: String,
val color: Int, val accessLevel: Int) {
var color: Int, val accessLevel: Int) {
fun canWrite() = accessLevel >= 500
fun getFullTitle() = "$displayName ($accountName)"

View File

@ -4,9 +4,12 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.simplemobiletools.calendar.extensions.recheckCalDAVCalendars
import com.simplemobiletools.calendar.extensions.updateWidgets
class CalDAVSyncReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
context.recheckCalDAVCalendars {}
context.recheckCalDAVCalendars {
context.updateWidgets()
}
}
}

View File

@ -32,6 +32,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
private var paint: Paint
private var eventTitlePaint: TextPaint
private var gridPaint: Paint
private var config = context.config
private var dayWidth = 0f
private var dayHeight = 0f
private var primaryColor = 0
@ -54,9 +55,9 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
init {
primaryColor = context.getAdjustedPrimaryColor()
textColor = context.config.textColor
showWeekNumbers = context.config.showWeekNumbers
dimPastEvents = context.config.dimPastEvents
textColor = config.textColor
showWeekNumbers = config.showWeekNumbers
dimPastEvents = config.dimPastEvents
smallPadding = resources.displayMetrics.density.toInt()
val normalTextSize = resources.getDimensionPixelSize(R.dimen.normal_text_size)
@ -86,7 +87,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
fun updateDays(newDays: ArrayList<DayMonthly>) {
days = newDays
showWeekNumbers = context.config.showWeekNumbers
showWeekNumbers = config.showWeekNumbers
horizontalOffset = if (showWeekNumbers) eventTitleHeight * 2 else 0
initWeekDayLetters()
setupCurrentDayOfWeekIndex()
@ -111,7 +112,8 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
}
}
allEvents = allEvents.sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.startDayIndex }, { it.title })).toMutableList() as ArrayList<MonthViewEvent>
allEvents = allEvents.asSequence().sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.startDayIndex }, { it.title }))
.toMutableList() as ArrayList<MonthViewEvent>
}
override fun onDraw(canvas: Canvas) {
@ -119,7 +121,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
dayVerticalOffsets.clear()
measureDaySize(canvas)
if (context.config.showGrid) {
if (config.showGrid) {
drawGrid(canvas)
}
@ -149,7 +151,9 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
}
}
drawEvents(canvas)
for (event in allEvents) {
drawEvent(event, canvas)
}
}
private fun drawGrid(canvas: Canvas) {
@ -188,7 +192,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
val weekDays = days.subList(i * 7, i * 7 + 7)
weekNumberPaint.color = if (weekDays.any { it.isToday }) primaryColor else textColor
// fourth day of the week matters
// fourth day of the week determines the week of the year number
val weekOfYear = days.getOrNull(i * 7 + 3)?.weekOfYear ?: 1
val id = "$weekOfYear:"
val yPos = i * dayHeight + weekDaysLetterHeight
@ -203,12 +207,6 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
maxEventsPerDay = availableHeightForEvents / eventTitleHeight
}
private fun drawEvents(canvas: Canvas) {
for (event in allEvents) {
drawEvent(event, canvas)
}
}
private fun drawEvent(event: MonthViewEvent, canvas: Canvas) {
val verticalOffset = dayVerticalOffsets[event.startDayIndex]
val xPos = event.startDayIndex % 7 * dayWidth + horizontalOffset
@ -302,8 +300,8 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
}
private fun initWeekDayLetters() {
dayLetters = context.resources.getStringArray(R.array.week_day_letters).toList() as ArrayList<String>
if (context.config.isSundayFirst) {
dayLetters = context.resources.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
if (config.isSundayFirst) {
dayLetters.moveLastItemToFront()
}
}
@ -315,7 +313,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
}
currDayOfWeek = DateTime().dayOfWeek
if (context.config.isSundayFirst) {
if (config.isSundayFirst) {
currDayOfWeek %= 7
} else {
currDayOfWeek--

View File

@ -15,11 +15,11 @@ class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : F
private var dayWidth = 0f
private var dayHeight = 0f
private var weekDaysLetterHeight = 0
private var horizontalOffset = 0
private var wereViewsAdded = false
private var days = ArrayList<DayMonthly>()
private var inflater: LayoutInflater
private var monthView: MonthView
private var horizontalOffset = 0
private var dayClickCallback: ((day: DayMonthly) -> Unit)? = null
constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)

View File

@ -69,9 +69,9 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie
super.onDraw(canvas)
if (dayWidth == 0f) {
dayWidth = if (isLandscape) {
(canvas.width / 9).toFloat()
width / 9f
} else {
(canvas.width / 7).toFloat()
width / 7f
}
}

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/day_coordinator"
@ -22,4 +22,4 @@
app:backgroundTint="@color/color_primary"
app:rippleColor="@color/pressed_item_foreground"/>
</android.support.design.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -17,8 +17,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:hint="@string/title"
android:inputType="textCapSentences"
android:maxLength="180"
@ -45,15 +45,15 @@
<ImageView
android:id="@+id/event_show_on_map"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/event_location"
android:layout_alignBottom="@+id/event_location"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/event_location"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:src="@drawable/ic_place"/>
@ -64,8 +64,8 @@
android:layout_height="wrap_content"
android:layout_below="@+id/event_location"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:autoLink="all"
android:gravity="top"
android:hint="@string/description"
@ -80,8 +80,8 @@
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/event_description"
android:layout_marginBottom="@dimen/normal_margin"
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginBottom="@dimen/normal_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
@ -89,11 +89,11 @@
android:id="@+id/event_time_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/event_all_day"
android:layout_alignTop="@+id/event_all_day"
android:layout_below="@+id/event_description_divider"
android:layout_marginLeft="@dimen/normal_margin"
android:layout_alignTop="@+id/event_all_day"
android:layout_alignBottom="@+id/event_all_day"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginLeft="@dimen/normal_margin"
android:alpha="0.8"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_clock"/>
@ -102,17 +102,17 @@
android:id="@+id/event_all_day"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/event_description_divider"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/event_description_divider"
android:layout_marginEnd="@dimen/normal_margin"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/normal_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginEnd="@dimen/normal_margin"
android:layout_marginRight="@dimen/normal_margin"
android:layout_toEndOf="@+id/event_time_image"
android:layout_toRightOf="@+id/event_time_image"
android:paddingBottom="@dimen/normal_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:text="@string/all_day"
android:textSize="@dimen/day_text_size"
app:switchPadding="@dimen/small_margin"/>
@ -121,14 +121,14 @@
android:id="@+id/event_start_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_all_day"
android:layout_alignStart="@+id/event_all_day"
android:layout_below="@+id/event_time_image"
android:layout_alignStart="@+id/event_all_day"
android:layout_alignLeft="@+id/event_all_day"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="January 1 1970"/>
@ -136,9 +136,9 @@
android:id="@+id/event_start_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/event_time_image"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/event_time_image"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
@ -148,14 +148,14 @@
android:id="@+id/event_end_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_all_day"
android:layout_alignStart="@+id/event_all_day"
android:layout_below="@+id/event_start_date"
android:layout_alignStart="@+id/event_all_day"
android:layout_alignLeft="@+id/event_all_day"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
tools:text="January 1 1970"/>
@ -163,9 +163,9 @@
android:id="@+id/event_end_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/event_start_time"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/event_start_time"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"
@ -176,8 +176,8 @@
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/event_end_date"
android:layout_marginBottom="@dimen/medium_margin"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
@ -185,11 +185,11 @@
android:id="@+id/event_reminder_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/event_reminder_1"
android:layout_alignTop="@+id/event_reminder_1"
android:layout_below="@+id/event_date_time_divider"
android:layout_marginLeft="@dimen/normal_margin"
android:layout_alignTop="@+id/event_reminder_1"
android:layout_alignBottom="@+id/event_reminder_1"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginLeft="@dimen/normal_margin"
android:alpha="0.8"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_bell"/>
@ -199,26 +199,26 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/event_date_time_divider"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:layout_toEndOf="@+id/event_reminder_image"
android:layout_toRightOf="@+id/event_reminder_image"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:textSize="@dimen/day_text_size"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_reminder_1"
android:layout_alignStart="@+id/event_reminder_1"
android:layout_below="@+id/event_reminder_1"
android:layout_alignStart="@+id/event_reminder_1"
android:layout_alignLeft="@+id/event_reminder_1"
android:alpha="0.4"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/add_another_reminder"
android:textSize="@dimen/day_text_size"
android:visibility="gone"/>
@ -227,13 +227,13 @@
android:id="@+id/event_reminder_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_reminder_1"
android:layout_alignStart="@+id/event_reminder_1"
android:layout_below="@+id/event_reminder_2"
android:layout_alignStart="@+id/event_reminder_1"
android:layout_alignLeft="@+id/event_reminder_1"
android:alpha="0.4"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/add_another_reminder"
android:textSize="@dimen/day_text_size"
android:visibility="gone"/>
@ -243,8 +243,8 @@
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/event_reminder_3"
android:layout_marginBottom="@dimen/medium_margin"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
@ -252,11 +252,11 @@
android:id="@+id/event_repetition_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/event_repetition"
android:layout_alignTop="@+id/event_repetition"
android:layout_below="@+id/event_date_time_divider"
android:layout_marginLeft="@dimen/normal_margin"
android:layout_alignTop="@+id/event_repetition"
android:layout_alignBottom="@+id/event_repetition"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginLeft="@dimen/normal_margin"
android:alpha="0.8"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_repeat"/>
@ -266,22 +266,22 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/event_reminder_divider"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:layout_toEndOf="@+id/event_repetition_image"
android:layout_toRightOf="@+id/event_repetition_image"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/normal_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size"/>
<RelativeLayout
android:id="@+id/event_repetition_rule_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_repetition"
android:layout_alignStart="@+id/event_repetition"
android:layout_below="@+id/event_repetition"
android:layout_alignStart="@+id/event_repetition"
android:layout_alignLeft="@+id/event_repetition"
android:background="?attr/selectableItemBackground"
android:visibility="gone">
@ -290,8 +290,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_on"
android:textSize="@dimen/day_text_size"/>
@ -314,9 +314,9 @@
android:id="@+id/event_repetition_limit_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/event_repetition"
android:layout_alignStart="@+id/event_repetition"
android:layout_below="@+id/event_repetition_rule_holder"
android:layout_alignStart="@+id/event_repetition"
android:layout_alignLeft="@+id/event_repetition"
android:background="?attr/selectableItemBackground"
android:visibility="gone">
@ -324,11 +324,11 @@
android:id="@+id/event_repetition_limit_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/event_repetition_limit"
android:layout_toStartOf="@+id/event_repetition_limit"
android:layout_toLeftOf="@+id/event_repetition_limit"
android:clickable="false"
android:paddingBottom="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_till"
android:textSize="@dimen/day_text_size"/>
@ -357,11 +357,11 @@
android:id="@+id/event_caldav_calendar_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/event_caldav_calendar_holder"
android:layout_alignTop="@+id/event_caldav_calendar_holder"
android:layout_below="@+id/event_repetition_divider"
android:layout_marginLeft="@dimen/normal_margin"
android:layout_alignTop="@+id/event_caldav_calendar_holder"
android:layout_alignBottom="@+id/event_caldav_calendar_holder"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginLeft="@dimen/normal_margin"
android:alpha="0.8"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_calendar"
@ -381,12 +381,12 @@
android:id="@+id/event_caldav_calendar_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:ellipsize="end"
android:maxLines="1"
android:paddingBottom="@dimen/tiny_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingBottom="@dimen/tiny_margin"
android:textSize="@dimen/day_text_size"
tools:text="My calendar"/>
@ -395,14 +395,25 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/event_caldav_calendar_name"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:ellipsize="end"
android:maxLines="1"
android:paddingBottom="@dimen/medium_margin"
android:textSize="@dimen/meta_text_size"
tools:text="hello@simplemobiletools.com"/>
<ImageView
android:id="@+id/event_caldav_calendar_color"
android:layout_width="@dimen/color_sample_size"
android:layout_height="@dimen/color_sample_size"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:clickable="false"/>
</RelativeLayout>
<ImageView
@ -418,11 +429,11 @@
android:id="@+id/event_type_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/event_type_holder"
android:layout_alignTop="@+id/event_type_holder"
android:layout_below="@+id/event_caldav_calendar_divider"
android:layout_marginLeft="@dimen/normal_margin"
android:layout_alignTop="@+id/event_type_holder"
android:layout_alignBottom="@+id/event_type_holder"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginLeft="@dimen/normal_margin"
android:alpha="0.8"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_color"/>
@ -433,6 +444,7 @@
android:layout_height="wrap_content"
android:layout_below="@+id/event_caldav_calendar_divider"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:layout_toEndOf="@+id/event_type_image"
android:layout_toRightOf="@+id/event_type_image"
android:background="?attr/selectableItemBackground">
@ -441,12 +453,12 @@
android:id="@+id/event_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginLeft="@dimen/small_margin"
android:layout_marginRight="@dimen/medium_margin"
android:layout_marginStart="@dimen/small_margin"
android:layout_toLeftOf="@+id/event_type_color"
android:paddingBottom="@dimen/normal_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size"/>
<ImageView
@ -467,7 +479,6 @@
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/event_type_holder"
android:layout_marginTop="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
</RelativeLayout>

View File

@ -1,15 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/calendar_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragments_holder"
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragments_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.simplemobiletools.commons.views.MyFloatingActionButton
android:id="@+id/calendar_fab"
@ -65,4 +72,4 @@
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -17,18 +17,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_purchase_thank_you"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/purchase_simple_thank_you"/>
</RelativeLayout>
@ -39,18 +39,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_customize_colors_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/customize_colors"/>
</RelativeLayout>
@ -61,18 +61,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_event_types_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/manage_event_types"/>
</RelativeLayout>
@ -83,10 +83,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_english"
@ -94,8 +94,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_english_language"/>
</RelativeLayout>
@ -106,10 +106,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_hour_format"
@ -117,8 +117,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_24_hour_time_format"/>
</RelativeLayout>
@ -129,10 +129,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_sunday_first"
@ -140,8 +140,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/sunday_first"/>
</RelativeLayout>
@ -152,10 +152,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_avoid_whats_new"
@ -163,8 +163,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/avoid_whats_new"/>
</RelativeLayout>
@ -180,8 +180,8 @@
android:id="@+id/reminders_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/event_reminders"
android:textAllCaps="true"
@ -193,10 +193,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_vibrate"
@ -204,8 +204,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/vibrate"/>
</RelativeLayout>
@ -216,10 +216,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_loop_reminders"
@ -227,8 +227,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/loop_reminders"/>
</RelativeLayout>
@ -239,18 +239,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_reminder_sound_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_reminder_sound"
android:layout_toStartOf="@+id/settings_reminder_sound"
android:layout_toLeftOf="@+id/settings_reminder_sound"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/reminder_sound"/>
@ -273,18 +273,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_reminder_audio_stream_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_reminder_audio_stream"
android:layout_toStartOf="@+id/settings_reminder_audio_stream"
android:layout_toLeftOf="@+id/settings_reminder_audio_stream"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/reminder_stream"/>
@ -308,10 +308,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_same_snooze"
@ -319,8 +319,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_same_snooze"/>
</RelativeLayout>
@ -331,18 +331,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_snooze_time_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_snooze_time"
android:layout_toStartOf="@+id/settings_snooze_time"
android:layout_toLeftOf="@+id/settings_snooze_time"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/snooze_time"/>
@ -366,10 +366,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_use_last_event_reminders"
@ -377,8 +377,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/use_last_event_reminders"/>
</RelativeLayout>
@ -389,18 +389,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_reminder_1_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_default_reminder_1"
android:layout_toStartOf="@+id/settings_default_reminder_1"
android:layout_toLeftOf="@+id/settings_default_reminder_1"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/default_reminder_1"/>
@ -424,18 +424,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_reminder_2_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_default_reminder_2"
android:layout_toStartOf="@+id/settings_default_reminder_2"
android:layout_toLeftOf="@+id/settings_default_reminder_2"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/default_reminder_2"/>
@ -459,18 +459,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_reminder_3_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_default_reminder_3"
android:layout_toStartOf="@+id/settings_default_reminder_3"
android:layout_toLeftOf="@+id/settings_default_reminder_3"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/default_reminder_3"/>
@ -499,8 +499,8 @@
android:id="@+id/caldav_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/caldav"
android:textAllCaps="true"
@ -512,10 +512,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_caldav_sync"
@ -523,21 +523,44 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/caldav_sync"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_caldav_pull_to_refresh_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.MySwitchCompat
android:id="@+id/settings_caldav_pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/enable_pull_to_refresh"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_manage_synced_calendars_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/bigger_margin"
android:visibility="gone">
<com.simplemobiletools.commons.views.MyTextView
@ -562,8 +585,8 @@
android:id="@+id/weekly_view_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/weekly_view"
android:textAllCaps="true"
@ -575,18 +598,18 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_start_weekly_at_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_start_weekly_at"
android:layout_toStartOf="@+id/settings_start_weekly_at"
android:layout_toLeftOf="@+id/settings_start_weekly_at"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/start_day_at"/>
@ -609,18 +632,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_end_weekly_at_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_end_weekly_at"
android:layout_toStartOf="@+id/settings_end_weekly_at"
android:layout_toLeftOf="@+id/settings_end_weekly_at"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/end_day_at"/>
@ -649,8 +672,8 @@
android:id="@+id/monthly_view_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/monthly_view"
android:textAllCaps="true"
@ -662,10 +685,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_week_numbers"
@ -673,8 +696,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/week_numbers"/>
</RelativeLayout>
@ -684,10 +707,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_grid"
@ -695,8 +718,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/show_a_grid"/>
</RelativeLayout>
@ -712,8 +735,8 @@
android:id="@+id/simple_event_list_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/event_lists"
android:textAllCaps="true"
@ -725,10 +748,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_replace_description"
@ -736,8 +759,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/replace_description_with_location"/>
</RelativeLayout>
@ -747,18 +770,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_display_past_events_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_display_past_events"
android:layout_toStartOf="@+id/settings_display_past_events"
android:layout_toLeftOf="@+id/settings_display_past_events"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/display_past_events"/>
@ -787,8 +810,8 @@
android:id="@+id/widgets_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/widgets"
android:textAllCaps="true"
@ -799,18 +822,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/settings_font_size"
android:layout_toStartOf="@+id/settings_font_size"
android:layout_toLeftOf="@+id/settings_font_size"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/font_size"/>
@ -828,23 +851,57 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_list_widget_view_to_open_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_list_widget_view_to_open_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_list_widget_view_to_open"
android:layout_toLeftOf="@+id/settings_list_widget_view_to_open"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/view_to_open_from_widget"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_list_widget_view_to_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/small_margin"
android:layout_marginRight="@dimen/small_margin"
android:background="@null"
android:clickable="false"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_customize_widget_colors_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_customize_widget_colors_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/customize_widget_colors"/>
</RelativeLayout>
@ -860,8 +917,8 @@
android:id="@+id/events_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/events"
android:textAllCaps="true"
@ -873,10 +930,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/activity_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_dim_past_events"
@ -884,8 +941,8 @@
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingLeft="@dimen/medium_margin"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/dim_past_events"/>
</RelativeLayout>
@ -895,10 +952,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingBottom="@dimen/bigger_margin"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin">
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_delete_all_events"

View File

@ -12,8 +12,8 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin">
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/export_events_folder_label"
@ -26,11 +26,11 @@
android:id="@+id/export_events_folder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_margin"
android:layout_marginLeft="@dimen/activity_margin"
android:paddingBottom="@dimen/small_margin"
android:layout_marginBottom="@dimen/activity_margin"
android:paddingTop="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingTop="@dimen/small_margin"/>
android:paddingBottom="@dimen/small_margin"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/export_events_filename_label"
@ -43,18 +43,18 @@
android:id="@+id/export_events_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_margin"
android:layout_marginLeft="@dimen/activity_margin"
android:paddingRight="@dimen/small_margin"
android:layout_marginBottom="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingRight="@dimen/small_margin"
android:textSize="@dimen/normal_text_size"/>
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/export_events_checkbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/small_margin"
android:paddingTop="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:text="@string/export_past_events_too"/>
<LinearLayout
@ -68,8 +68,8 @@
android:id="@+id/export_events_divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginBottom="@dimen/medium_margin"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
@ -80,7 +80,7 @@
android:text="@string/include_event_types"
android:textSize="@dimen/smaller_text_size"/>
<android.support.v7.widget.RecyclerView
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/export_events_types_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
<com.simplemobiletools.commons.views.MyRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/filter_event_types_list"

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_select_event_type_color_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/dialog_select_event_type_other_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/dialog_select_event_type_other_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/big_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/select_a_different_caldav_color"
android:textSize="@dimen/normal_text_size"/>
<ImageView
android:id="@+id/dialog_select_event_type_other_divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/dialog_select_event_type_other_value"
android:background="@color/divider_grey"
android:importantForAccessibility="no"/>
<RadioGroup
android:id="@+id/dialog_select_event_type_color_radio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/dialog_select_event_type_other_divider"
android:paddingLeft="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin"/>
</RelativeLayout>
</ScrollView>

View File

@ -5,7 +5,7 @@
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"/>
<item
android:id="@+id/go_to_today"

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Təqvimi dəyişmək alınmadı</string>
<string name="syncing">Sinxronlaşdırılır…</string>
<string name="synchronization_completed">Sinxronlaşma bitdi</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">C\'hwitadenn en ur embann an deiziataer</string>
<string name="syncing">O c\'houbredañ…</string>
<string name="synchronization_completed">Echuet gant ar goubredañ</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -25,7 +25,7 @@
<string name="end_before_start">Konec události nemůže být dříve než začátek</string>
<string name="event_added">Událost úspěšně přidána</string>
<string name="event_updated">Událost úspěšně změněna</string>
<string name="filter_events_by_type">Filtrovat události podle typu</string>
<string name="filter_events_by_type">Filtrovat události</string>
<string name="please_fill_location">Vyplňte prosím místo, které se zobrazí na mapě</string>
<string name="public_event_notification_text">Událost právě nastává</string>
@ -86,27 +86,27 @@
<string name="birthdays_added">Narozeniny byly úspěšně přidány</string>
<!-- Anniversaries -->
<string name="anniversaries">Anniversaries</string>
<string name="add_anniversaries">Add contact anniversaries</string>
<string name="no_anniversaries">No anniversaries have been found</string>
<string name="anniversaries_added">Anniversaries added successfully</string>
<string name="anniversaries">Výročí</string>
<string name="add_anniversaries">Přidat výročí</string>
<string name="no_anniversaries">Žádné výročí nebylo nalezeno</string>
<string name="anniversaries_added">Výročí bylo úspěšně přidáno</string>
<!-- Event Reminders -->
<string name="reminder">Připomenutí</string>
<string name="reminder">Připomínka</string>
<string name="before">před</string>
<string name="add_another_reminder">Přidat další připomenutí</string>
<string name="event_reminders">Event reminders</string>
<string name="add_another_reminder">Přidat další připomínku</string>
<string name="event_reminders">Připomínky událostí</string>
<!-- Export / Import -->
<string name="import_events">Import událostí</string>
<string name="export_events">Export událostí</string>
<string name="import_events_from_ics">Importovat kalendář ze souboru .ics</string>
<string name="export_events_to_ics">Exportovat kalendář do souboru .ics</string>
<string name="default_event_type">Defaultní typ události</string>
<string name="export_past_events_too">Export i minulých událostí</string>
<string name="default_event_type">Přednastavený typ události</string>
<string name="export_past_events_too">Exportovat i uplynulé události</string>
<string name="include_event_types">Zahrnout typy událostí</string>
<string name="filename_without_ics">Název souboru (bez .ics)</string>
<string name="override_event_types">Override event types in the file</string>
<string name="override_event_types">Přepsat typ události v souboru</string>
<!-- Event details -->
<string name="title">Název</string>
@ -141,8 +141,8 @@
<!-- Settings -->
<string name="manage_event_types">Správa typů událostí</string>
<string name="start_day_at">Počátek dne v</string>
<string name="end_day_at">Konec dne v</string>
<string name="start_day_at">Počátek dne</string>
<string name="end_day_at">Konec dne</string>
<string name="week_numbers">Zobrazovat číslo týdne</string>
<string name="vibrate">Vibrovat</string>
<string name="reminder_sound">Tón oznámení</string>
@ -155,19 +155,21 @@
<string name="replace_description_with_location">Nahradit popis udalosti lokací</string>
<string name="delete_all_events">Smazat všechny události</string>
<string name="delete_all_events_confirmation">Opravdu chcete smazat všechny události? Typy událostí a ostatní nastavení zůstanou neporušené.</string>
<string name="show_a_grid">Zobrazit mřížku</string>
<string name="show_a_grid">Zobrazovat mřížku</string>
<string name="loop_reminders">Připomínat až do vypnutí</string>
<string name="dim_past_events">Smazat minulé události</string>
<string name="events">Události</string>
<string name="reminder_stream">Zvuk upomínky</string>
<string name="system_stream">Systémový</string>
<string name="system_stream">Systém</string>
<string name="alarm_stream">Budík</string>
<string name="notification_stream">Notifikace</string>
<string name="ring_stream">Zvonek</string>
<string name="use_last_event_reminders">Use the last events\' reminders as the default for new event</string>
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="ring_stream">Vyzvánění</string>
<string name="use_last_event_reminders">Použij poslední připomenutou událost jako výchozí pro novou událost</string>
<string name="default_reminder_1">Výchozí připomenutí 1</string>
<string name="default_reminder_2">Výchozí připomenutí 2</string>
<string name="default_reminder_3">Výchozí připomenutí 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Editování kalendáře se nezdařilo</string>
<string name="syncing">Synchronizuji…</string>
<string name="synchronization_completed">Synchronizace dokončena</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
@ -202,15 +205,15 @@
<string name="sample_title_5">na kafe</string>
<!-- FAQ -->
<string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
<string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
long press the given event type and delete it by selecting the trashbin.</string>
<string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
<string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
<string name="faq_3_title">I see the visual reminders, but hear no audio. What can I do?</string>
<string name="faq_3_text">Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings,
pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted.</string>
<string name="faq_1_title">Jak mohu odstranit svátky importované přes tlačítko \"Přidat svátek\"?</string>
<string name="faq_1_text">Svátky vytvořené touto cestou jsou vloženy s novým typem události \"Svátky\". Odstranit jej můžete přes: Nastavení -> Správa typů událostí ->
dlouze podržte daný typ události a stisknete tlačítko s ikonou koše pro odstranění.</string>
<string name="faq_2_title">Mohu synchronizovat své události přes Google Kalendář nebo přes jinou službu podporující CalDav?</string>
<string name="faq_2_text">Ano, zapnutím \"CalDAV sync\" v nastavení aplikace a vybráním kalendáře se kterým se chcete synchronizovat. Budete ovšem potřebovat nějakou aplikaci třetí strany pro samotné synchronizovaní mezi zařízením a servery.
Pokud chcete synchronizovat Google kalendář, tak oficiální aplikace Google toto zvládne. Pro jiné kalendáře potřebujete synchronizační adaptér třetí strany, například DAVdroid.</string>
<string name="faq_3_title">Vizuálně vidím připomínku, ale neslyším žádný zvuk. Co mám dělat?</string>
<string name="faq_3_text">Nejenom zobrazování aktuální připomínky, ale i přehrávání zvuku je dost ovlivněno operačním systémem. Pokud neslyšíte žádný zvuk, zkuste jít do nastavení aplikace,
vyberte: \"Zvuk upomínky\" a změňte na něco jiného. Pokud zvuk stále nefunguje, zkontrolujte zda není zvuk vypnut v nastavení vašeho systému.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Påmindelse 1</string>
<string name="default_reminder_2">Påmindelse 2</string>
<string name="default_reminder_3">Påmindelse 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Redigering af kalenderen mislykkedes</string>
<string name="syncing">Synkroniserer…</string>
<string name="synchronization_completed">Synkronisering gennemført</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Standarderinnerung 1</string>
<string name="default_reminder_2">Standarderinnerung 2</string>
<string name="default_reminder_3">Standarderinnerung 3</string>
<string name="view_to_open_from_widget">Standardansicht</string>
<string name="last_view">Letzte Ansicht</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Ändern des Kalenders fehlgeschlagen</string>
<string name="syncing">Wird synchronisiert…</string>
<string name="synchronization_completed">Synchronisation erfolgreich</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Η επεξεργασία του ημερολογίου απέτυχε</string>
<string name="syncing">Συγχρονισμός…</string>
<string name="synchronization_completed">Ο συγχρονισμός ολοκληρώθηκε</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Edición de calendario fallida</string>
<string name="syncing">Sincronizando…</string>
<string name="synchronization_completed">Sincronización completa</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Édition du calendrier échouée</string>
<string name="syncing">Synchronisation…</string>
<string name="synchronization_completed">Synchronisation terminée</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Fallou a edición do calendario</string>
<string name="syncing">Sincronizando…</string>
<string name="synchronization_completed">Sincronización completa</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -169,6 +169,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -181,6 +183,7 @@
<string name="editing_calendar_failed">Editing calendar failed</string>
<string name="syncing">Syncing…</string>
<string name="synchronization_completed">Sync completed</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Uređivanje kalendara nije uspjelo</string>
<string name="syncing">Sinkronizacija…</string>
<string name="synchronization_completed">Sinkronizacija završena</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Editing calendar failed</string>
<string name="syncing">Syncing…</string>
<string name="synchronization_completed">Sync completed</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -19,15 +19,15 @@
<string name="event">Evento</string>
<string name="edit_event">Modifica evento</string>
<string name="new_event">Nuovo evento</string>
<string name="create_new_event">Create a new event</string>
<string name="duplicate_event">Duplicate event</string>
<string name="create_new_event">Crea un nuovo evento</string>
<string name="duplicate_event">Duplica evento</string>
<string name="title_empty">Il titolo non può essere vuoto</string>
<string name="end_before_start">L\'evento non può terminare prima del suo inizio</string>
<string name="end_before_start">L\'evento non può terminare prima del suo ianizio</string>
<string name="event_added">Evento aggiunto correttamente</string>
<string name="event_updated">Evento aggiornato correttamente</string>
<string name="filter_events_by_type">Filtra eventi per tipologia</string>
<string name="please_fill_location">Please fill in a location to be shown on a map</string>
<string name="public_event_notification_text">An event is upcoming</string>
<string name="please_fill_location">Riempire la posizione per essere mostrata su una mappa</string>
<string name="public_event_notification_text">Un evento è imminente</string>
<!-- Event Repetition -->
<string name="repetition">Ripeti</string>
@ -44,24 +44,24 @@
<string name="event_is_repeatable">L\'evento è ripetibile</string>
<string name="selection_contains_repetition">La selezione contiene eventi ripetuti</string>
<string name="delete_one_only">Elimina solamente l\'occorenza selezionata</string>
<string name="delete_future_occurrences">Delete this and all future occurrences</string>
<string name="delete_future_occurrences">Rimuovi questo e tutte le future occorrenze</string>
<string name="delete_all_occurrences">Elimina tutte le occorrenze</string>
<string name="update_one_only">Aggiorna solamente l\'occorenza selezionata</string>
<string name="update_all_occurrences">Aggiorna tutte le occorenze</string>
<string name="repeat_till_date">Ripeti fino a una data</string>
<string name="stop_repeating_after_x">Stop repeating after x occurrences</string>
<string name="stop_repeating_after_x">Smetti di ripetere dopo x occorrenze</string>
<string name="repeat_forever">Ripeti per sempre</string>
<string name="times">volte</string>
<string name="repeat">Ripeti</string>
<string name="repeat_on">Repeat on</string>
<string name="repeat_on">Ripeti</string>
<string name="every_day">Ogni giorno</string>
<string name="selected_days">On selected days</string>
<string name="the_same_day">Lo stesso giorno</string>
<string name="the_last_day">L\'ultimo giorno</string>
<string name="repeat_on_the_same_day_monthly">Ripeti lo stesso giorno ogni mese </string>
<string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
<string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
<string name="repeat_every_m">Repeat every</string>
<string name="repeat_on_the_last_day_monthly">Ripeti l\'ultimo giorno del mese</string>
<string name="repeat_on_the_same_day_yearly">Ripeti lo stesso giorno ogni anno</string>
<string name="repeat_every_m">Ripeti ogni</string>
<string name="every_m">Tutti</string>
<string name="first_m">primo</string>
<string name="second_m">secondo</string>
@ -106,13 +106,13 @@
<string name="export_past_events_too">Esporta anche eventi passati</string>
<string name="include_event_types">Includi tipi evento</string>
<string name="filename_without_ics">Nome file (senza .ics)</string>
<string name="override_event_types">Override event types in the file</string>
<string name="override_event_types">Sovrascrivi i tipi di eventi nel file</string>
<!-- Event details -->
<string name="title">Titolo</string>
<string name="location">Posizione</string>
<string name="description">Descrizione</string>
<string name="all_day">All-day</string>
<string name="all_day">Tutto il giorno</string>
<!-- Weekly view -->
<string name="week">Settimana</string>
@ -126,8 +126,8 @@
<string name="regular_event">Evento regolare</string>
<string name="cannot_delete_default_type">Il tipo di evento predefinito non può essere cancellato</string>
<string name="select_event_type">Seleziona un tipo di evento</string>
<string name="move_events_into_default">Move affected events into the default event type</string>
<string name="remove_affected_events">Permanently remove affected events</string>
<string name="move_events_into_default">Muovi gli eventi segnati con il tipo di eventi predefinito</string>
<string name="remove_affected_events">Rimuovi in maniera permanente gli eventi segnati</string>
<string name="unsync_caldav_calendar">Per rimuovere un calendario CalDAV devi desincronizzarlo</string>
<!-- Holidays -->
@ -141,92 +141,95 @@
<!-- Settings -->
<string name="manage_event_types">Gestisci tipi evento</string>
<string name="start_day_at">Start day at</string>
<string name="end_day_at">End day at</string>
<string name="start_day_at">Il giorno inizia alle</string>
<string name="end_day_at">Il giorno finisce alle</string>
<string name="week_numbers">Mostra numero settimane</string>
<string name="vibrate">Vibrate on reminder notification</string>
<string name="vibrate">Vibra per le notifiche di promemoria</string>
<string name="reminder_sound">Suoneria promemoria</string>
<string name="no_ringtone_picker">No app capable of setting ringtone found</string>
<string name="no_ringtone_selected">None</string>
<string name="no_ringtone_picker">Non è stata trovata nessuna applicazione per impostare la suoneria</string>
<string name="no_ringtone_selected">Nessuna</string>
<string name="day_end_before_start">Il giorno non può finire prima che cominci</string>
<string name="caldav_sync">CalDAV sync</string>
<string name="event_lists">Event lists</string>
<string name="caldav_sync">Sincronizzazione CalDAV</string>
<string name="event_lists">Liste degli eventi</string>
<string name="display_past_events">Mostra eventi passati</string>
<string name="replace_description_with_location">Sostituisci la descrizione con la posizione</string>
<string name="delete_all_events">Cancella tutti gli eventi</string>
<string name="delete_all_events_confirmation">Vuoi cancellare tutti gli eventi? Questo lascerà i tuoi tipi evento e le altre impostazioni invariate.</string>
<string name="show_a_grid">Show a grid</string>
<string name="loop_reminders">Loop reminders until dismissed</string>
<string name="dim_past_events">Dim past events</string>
<string name="events">Events</string>
<string name="reminder_stream">Audio stream used by reminders</string>
<string name="system_stream">System</string>
<string name="alarm_stream">Alarm</string>
<string name="notification_stream">Notification</string>
<string name="ring_stream">Ring</string>
<string name="use_last_event_reminders">Use the last events\' reminders as the default for new event</string>
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="show_a_grid">Mostra una griglia</string>
<string name="loop_reminders">Manda in loop i promemoria finchè non vengono rimossi</string>
<string name="dim_past_events">Rimuovi gli eventi passati</string>
<string name="events">Eventi</string>
<string name="reminder_stream">Canale audio utilizzato per i promomemoria</string>
<string name="system_stream">Sistema</string>
<string name="alarm_stream">Allarme</string>
<string name="notification_stream">Notitica</string>
<string name="ring_stream">Squillo</string>
<string name="use_last_event_reminders">Utilizza l\'ultimo promemoria come predefinito per nuovi eventi</string>
<string name="default_reminder_1">Promemoria predefinito 1</string>
<string name="default_reminder_2">Promemoria predefinito 2</string>
<string name="default_reminder_3">Promemoria predefinito 3</string>
<string name="view_to_open_from_widget">Vista da aprire dalla lista degli eventi del widget</string>
<string name="last_view">Ultima vista</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
<string name="select_caldav_calendars">Select calendars to sync</string>
<string name="manage_synced_calendars">Manage synced calendars</string>
<string name="store_locally_only">Store locally only</string>
<string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
<string name="refreshing">Refreshing…</string>
<string name="refreshing_complete">Refreshing complete</string>
<string name="editing_calendar_failed">Editing calendar failed</string>
<string name="syncing">Syncing…</string>
<string name="synchronization_completed">Sync completed</string>
<string name="select_caldav_calendars">Seleziona un calendario da sincronizzare</string>
<string name="manage_synced_calendars">Gestisci i calendari sincronizzati</string>
<string name="store_locally_only">Salva solamente in locale</string>
<string name="refresh_caldav_calendars">Aggiorna i calendari CalDAV</string>
<string name="refreshing">Aggiornamento in corso…</string>
<string name="refreshing_complete">Aggiornamento completato</string>
<string name="editing_calendar_failed">Impossibile modificare il calendario</string>
<string name="syncing">Sincronizzazione in corso…</string>
<string name="synchronization_completed">Sincronizzazione completata</string>
<string name="select_a_different_caldav_color">Seleziona un colore differente (potrebbe essere applicato solamente in locale)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">Monday</string>
<string name="tuesday_alt">Tuesday</string>
<string name="wednesday_alt">Wednesday</string>
<string name="thursday_alt">Thursday</string>
<string name="friday_alt">Friday</string>
<string name="saturday_alt">Saturday</string>
<string name="sunday_alt">Sunday</string>
<string name="monday_alt">Lunedì</string>
<string name="tuesday_alt">Martedì</string>
<string name="wednesday_alt">Mercoledì</string>
<string name="thursday_alt">Giovedì</string>
<string name="friday_alt">Venerdì</string>
<string name="saturday_alt">Sabato</string>
<string name="sunday_alt">Domenica</string>
<!-- List widget config example events -->
<string name="sample_title_1">Workout</string>
<string name="sample_description_1">Leg day</string>
<string name="sample_title_2">Meeting with John</string>
<string name="sample_description_2">In Rockstone garden</string>
<string name="sample_title_3">Library</string>
<string name="sample_title_4">Lunch with Mary</string>
<string name="sample_description_4">In the Plaza</string>
<string name="sample_title_5">Coffee time</string>
<string name="sample_title_1">Allenamento</string>
<string name="sample_description_1">Gambe</string>
<string name="sample_title_2">Incontro con Giovanni</string>
<string name="sample_description_2">Nel giardino di Milano</string>
<string name="sample_title_3">Liberia</string>
<string name="sample_title_4">Pranzo con Maria</string>
<string name="sample_description_4">Nel ristorante Magione</string>
<string name="sample_title_5">Pausa caffè</string>
<!-- FAQ -->
<string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
<string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
long press the given event type and delete it by selecting the trashbin.</string>
<string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
<string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
<string name="faq_3_title">I see the visual reminders, but hear no audio. What can I do?</string>
<string name="faq_3_text">Not just displaying the actual reminder, but playing the audio is hugely affected by the system too. If you can\'t hear any sound, try going in the app settings,
pressing the \"Audio stream used by reminders\" option and changing it to a different value. If it still won\'t work, check your sound settings, if the particular stream isn\'t muted.</string>
<string name="faq_1_title">Come posso rimuovere i le festività importate tramite il pulsante \"Aggiungi festività\"?</string>
<string name="faq_1_text">Le festività create in questo modo sono inseriti in eventi di tipo \"Festività\". Puoi andare in Impostazioni -> Gestisci tipi di eventi,
tenere premuto sul tipo desiderato ed eliminaro selezionando il cestino.</string>
<string name="faq_2_title">Posso sincronizzare i miei eventi tramite Google Calendar, od altri servizi che supportano CalDAV?</string>
<string name="faq_2_text">Sì, basta commutare l\'opzione \"Sincronizzazione CalDAV\" nelle impostazioni dell\'applicazione e selezionare i calendari da sincronizzare. Comunque è necessaria un\'applicazione di terze parti per gestire la sincronizzazione tra dispositivo e server.
In caso si voglia sincronizzare con Google Calendar, la loro applicazione ufficiale effettua questo lavoro. Per altri calendari è necessario un adattatore di terze parti, per esempio DAVdroid.</string>
<string name="faq_3_title">Visualizzo i promemoria, ma non sento l\'audio. Cosa posso fare?</string>
<string name="faq_3_text">Non solo visualizzare l\'attuale promemoria, ma anche riprodurre l\'audio è un lavoro prettamente del sistema. Se non senti alcun suono, prova ad andare nelle impostazioni dell\'applicazione,
premi l\'opzione \"Canale audio utilizzato per il promemoria\" e cambia il canale. Se ancora non funziona, controlla le tue impostazioni dell\'audio, in particolare se il canale è stato mutato.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">A simple calendar with events, customizable widget and no ads.</string>
<string name="app_short_description">Un semplice calendario con eventi, widget personalizzabili e senza pubblicità.</string>
<string name="app_long_description">
A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
Un semplice calendario con l\'opzione di sincronizzazione CalDAV. Puoi facilmente creare eventi ricorrenti ed impostare promemoria, mostra anche il numero di settimana.
Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
Contiene una vista mensile ed un widget con la lista degli eventi, con il colore del testo personalizzabile, come per la trasparenza ed il colore dello sfondo,
Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
Non contiene pubblicità o permessi non necessari. È completamente opensource, fornisce anche colori personalizzabili.
The Storage permission is needed only for exporting or importing events from .ics files.
Il permesso di archiviazione è necesario solamente per esportare od importare venti da file .ics.
The Contacts permission is used only at importing contact birthdays and anniversaries.
Il permesso dei contatti è usato solamente per importare i compleanni e gli anniversari.
This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
Questa applicazione è solamente una di una serie. Puoi trovare le altre su https://www.simplemobiletools.com
</string>
<!--

View File

@ -169,6 +169,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -181,6 +183,7 @@
<string name="editing_calendar_failed">Editing calendar failed</string>
<string name="syncing">Syncing…</string>
<string name="synchronization_completed">Sync completed</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">カレンダーを編集できませんでした</string>
<string name="syncing">同期中…</string>
<string name="synchronization_completed">同期が完了しました</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">변경 실패</string>
<string name="syncing">동기화중…</string>
<string name="synchronization_completed">동기화 완료</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Kalendoriaus redagavimas nepavyko</string>
<string name="syncing">Sinchronizuojama…</string>
<string name="synchronization_completed">Sinchronizacija baigta</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Redigering av kalender feilet</string>
<string name="syncing">Synkroniserer…</string>
<string name="synchronization_completed">Synkronisering fullført</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Standaardherinnering 1</string>
<string name="default_reminder_2">Standaardherinnering 2</string>
<string name="default_reminder_3">Standaardherinnering 3</string>
<string name="view_to_open_from_widget">Weergave bij openen vanuit widget met afsprakenlijst</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Agenda bijwerken mislukt</string>
<string name="syncing">Synchroniseren…</string>
<string name="synchronization_completed">Synchroniseren voltooid</string>
<string name="select_a_different_caldav_color">Kies een andere kleur (mogelijk alleen voor dit apparaat)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Redigering av kalender feilet</string>
<string name="syncing">Synkroniserer…</string>
<string name="synchronization_completed">Synkronisering fullført</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Edytowanie kalendarza nie powiodło się</string>
<string name="syncing">Synchronizowanie…</string>
<string name="synchronization_completed">Synchronizacja zakończona</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">A edição do calendário falhou</string>
<string name="syncing">Sincronizando…</string>
<string name="synchronization_completed">Sincronização completa</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -164,10 +164,12 @@
<string name="alarm_stream">Alarme</string>
<string name="notification_stream">Notificação</string>
<string name="ring_stream">Toque</string>
<string name="use_last_event_reminders">Use the last events\' reminders as the default for new event</string>
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="use_last_event_reminders">Utilize os lembretes dos últimos eventos como definição para os novos eventos</string>
<string name="default_reminder_1">Lembrete 1</string>
<string name="default_reminder_2">Lembrete 2</string>
<string name="default_reminder_3">Lembrete 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Falha ao editar o calendário</string>
<string name="syncing">A sincronizar…</string>
<string name="synchronization_completed">Sincronização terminada</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Напоминание по умолчанию 1</string>
<string name="default_reminder_2">Напоминание по умолчанию 2</string>
<string name="default_reminder_3">Напоминание по умолчанию 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Не удалось изменить календарь</string>
<string name="syncing">Синхронизация…</string>
<string name="synchronization_completed">Синхронизация завершена</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Predvolená pripomienka 1</string>
<string name="default_reminder_2">Predvolená pripomienka 2</string>
<string name="default_reminder_3">Predvolená pripomienka 3</string>
<string name="view_to_open_from_widget">Otvoriť pohľad po kliknutí na widget so zoznamom udalostí</string>
<string name="last_view">Posledný pohľad</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Úprava kalendára zlyhala</string>
<string name="syncing">Synchronizujem…</string>
<string name="synchronization_completed">Synchronizácia ukončená</string>
<string name="select_a_different_caldav_color">Zvoliť inú farbu (možno bude aplikovaná iba lokálne)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Det gick inte att redigera kalendern</string>
<string name="syncing">Synkroniserar…</string>
<string name="synchronization_completed">Synkroniseringen är klar</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Takvim düzenlenme başarısız</string>
<string name="syncing">Senkronize ediliyor…</string>
<string name="synchronization_completed">Senkronizasyon tamamlandı</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="ArrowStyle">
<item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
</style>
<style name="MonthStyle">
<item name="android:background">?android:attr/selectableItemBackground</item>
</style>
</resources>

View File

@ -49,7 +49,7 @@
<string name="update_one_only">只更新選擇的事件</string>
<string name="update_all_occurrences">更新全部事件</string>
<string name="repeat_till_date">重複直到某日</string>
<string name="stop_repeating_after_x">Stop repeating after x occurrences</string>
<string name="stop_repeating_after_x">經過x次後停止重複</string>
<string name="repeat_forever">永遠重複</string>
<string name="times"></string>
<string name="repeat">重複</string>
@ -164,10 +164,12 @@
<string name="alarm_stream">鬧鐘</string>
<string name="notification_stream">通知</string>
<string name="ring_stream">鈴聲</string>
<string name="use_last_event_reminders">Use the last events\' reminders as the default for new event</string>
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="use_last_event_reminders">使用最後活動的提醒作為新活動的預設</string>
<string name="default_reminder_1">預設提醒1</string>
<string name="default_reminder_2">預設提醒2</string>
<string name="default_reminder_3">預設提醒3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">編輯行事曆失敗</string>
<string name="syncing">同步中…</string>
<string name="synchronization_completed">同步完成</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

View File

@ -168,6 +168,8 @@
<string name="default_reminder_1">Default reminder 1</string>
<string name="default_reminder_2">Default reminder 2</string>
<string name="default_reminder_3">Default reminder 3</string>
<string name="view_to_open_from_widget">View to open from the event list widget</string>
<string name="last_view">Last view</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -180,6 +182,7 @@
<string name="editing_calendar_failed">Editing calendar failed</string>
<string name="syncing">Syncing…</string>
<string name="synchronization_completed">Sync completed</string>
<string name="select_a_different_caldav_color">Select a different color (might be applied locally only)</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->

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