Add task repetition

This commit is contained in:
Naveen
2022-07-17 14:05:12 +05:30
parent 085d16d908
commit 84ab2f7806
4 changed files with 404 additions and 59 deletions

View File

@@ -12,6 +12,8 @@ import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.simplemobiletools.calendar.pro.R import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.dialogs.ReminderWarningDialog import com.simplemobiletools.calendar.pro.dialogs.ReminderWarningDialog
import com.simplemobiletools.calendar.pro.dialogs.RepeatLimitTypePickerDialog
import com.simplemobiletools.calendar.pro.dialogs.RepeatRuleWeeklyDialog
import com.simplemobiletools.calendar.pro.dialogs.SelectEventTypeDialog import com.simplemobiletools.calendar.pro.dialogs.SelectEventTypeDialog
import com.simplemobiletools.calendar.pro.extensions.* import com.simplemobiletools.calendar.pro.extensions.*
import com.simplemobiletools.calendar.pro.helpers.* import com.simplemobiletools.calendar.pro.helpers.*
@@ -20,24 +22,31 @@ import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.calendar.pro.models.EventType import com.simplemobiletools.calendar.pro.models.EventType
import com.simplemobiletools.calendar.pro.models.Reminder import com.simplemobiletools.calendar.pro.models.Reminder
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.EVERY_DAY_BIT
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.RadioItem
import kotlinx.android.synthetic.main.activity_task.* import kotlinx.android.synthetic.main.activity_task.*
import org.joda.time.DateTime import org.joda.time.DateTime
import java.util.* import java.util.*
import kotlin.math.pow
class TaskActivity : SimpleActivity() { class TaskActivity : SimpleActivity() {
private var mEventTypeId = REGULAR_EVENT_TYPE_ID private var mEventTypeId = REGULAR_EVENT_TYPE_ID
private lateinit var mTaskDateTime: DateTime private lateinit var mTaskDateTime: DateTime
private lateinit var mTask: Event private lateinit var mTask: Event
private var mIsAllDayEvent = false
private var mIsAllDayEvent = false
private var mReminder1Minutes = REMINDER_OFF private var mReminder1Minutes = REMINDER_OFF
private var mReminder2Minutes = REMINDER_OFF private var mReminder2Minutes = REMINDER_OFF
private var mReminder3Minutes = REMINDER_OFF private var mReminder3Minutes = REMINDER_OFF
private var mReminder1Type = REMINDER_NOTIFICATION private var mReminder1Type = REMINDER_NOTIFICATION
private var mReminder2Type = REMINDER_NOTIFICATION private var mReminder2Type = REMINDER_NOTIFICATION
private var mReminder3Type = REMINDER_NOTIFICATION private var mReminder3Type = REMINDER_NOTIFICATION
private var mRepeatInterval = 0
private var mRepeatLimit = 0L
private var mRepeatRule = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -103,6 +112,10 @@ class TaskActivity : SimpleActivity() {
putInt(REMINDER_1_MINUTES, mReminder1Minutes) putInt(REMINDER_1_MINUTES, mReminder1Minutes)
putInt(REMINDER_2_MINUTES, mReminder2Minutes) putInt(REMINDER_2_MINUTES, mReminder2Minutes)
putInt(REMINDER_3_MINUTES, mReminder3Minutes) putInt(REMINDER_3_MINUTES, mReminder3Minutes)
putInt(REPEAT_INTERVAL, mRepeatInterval)
putInt(REPEAT_RULE, mRepeatRule)
putLong(REPEAT_LIMIT, mRepeatLimit)
} }
} }
@@ -122,11 +135,14 @@ class TaskActivity : SimpleActivity() {
mReminder1Minutes = getInt(REMINDER_1_MINUTES) mReminder1Minutes = getInt(REMINDER_1_MINUTES)
mReminder2Minutes = getInt(REMINDER_2_MINUTES) mReminder2Minutes = getInt(REMINDER_2_MINUTES)
mReminder3Minutes = getInt(REMINDER_3_MINUTES) mReminder3Minutes = getInt(REMINDER_3_MINUTES)
mRepeatInterval = getInt(REPEAT_INTERVAL)
mRepeatRule = getInt(REPEAT_RULE)
mRepeatLimit = getLong(REPEAT_LIMIT)
} }
updateEventType() updateEventType()
updateDateText() updateTexts()
updateTimeText()
} }
private fun gotTask(savedInstanceState: Bundle?, localEventType: EventType?, task: Event?) { private fun gotTask(savedInstanceState: Bundle?, localEventType: EventType?, task: Event?) {
@@ -167,9 +183,12 @@ class TaskActivity : SimpleActivity() {
task_date.setOnClickListener { setupDate() } task_date.setOnClickListener { setupDate() }
task_time.setOnClickListener { setupTime() } task_time.setOnClickListener { setupTime() }
event_type_holder.setOnClickListener { showEventTypeDialog() } task_type_holder.setOnClickListener { showEventTypeDialog() }
task_repetition.setOnClickListener { showRepeatIntervalDialog() }
task_repetition_rule_holder.setOnClickListener { showRepetitionRuleDialog() }
task_repetition_limit_holder.setOnClickListener { showRepetitionTypePicker() }
event_reminder_1.setOnClickListener { task_reminder_1.setOnClickListener {
handleNotificationAvailability { handleNotificationAvailability {
if (config.wasAlarmWarningShown) { if (config.wasAlarmWarningShown) {
showReminder1Dialog() showReminder1Dialog()
@@ -182,14 +201,12 @@ class TaskActivity : SimpleActivity() {
} }
} }
event_reminder_2.setOnClickListener { showReminder2Dialog() } task_reminder_2.setOnClickListener { showReminder2Dialog() }
event_reminder_3.setOnClickListener { showReminder3Dialog() } task_reminder_3.setOnClickListener { showReminder3Dialog() }
if (savedInstanceState == null) { if (savedInstanceState == null) {
updateEventType() updateEventType()
updateDateText() updateTexts()
updateTimeText()
updateReminderTexts()
} }
} }
@@ -205,12 +222,16 @@ class TaskActivity : SimpleActivity() {
mReminder1Type = mTask.reminder1Type mReminder1Type = mTask.reminder1Type
mReminder2Type = mTask.reminder2Type mReminder2Type = mTask.reminder2Type
mReminder3Type = mTask.reminder3Type mReminder3Type = mTask.reminder3Type
mRepeatInterval = mTask.repeatInterval
mRepeatLimit = mTask.repeatLimit
mRepeatRule = mTask.repeatRule
task_title.setText(mTask.title) task_title.setText(mTask.title)
task_description.setText(mTask.description) task_description.setText(mTask.description)
task_all_day.isChecked = mTask.getIsAllDay() task_all_day.isChecked = mTask.getIsAllDay()
toggleAllDay(mTask.getIsAllDay()) toggleAllDay(mTask.getIsAllDay())
setupMarkCompleteButton() setupMarkCompleteButton()
checkRepeatTexts(mRepeatInterval)
} }
private fun setupNewTask() { private fun setupNewTask() {
@@ -278,6 +299,10 @@ class TaskActivity : SimpleActivity() {
reminder2Type = mReminder2Type reminder2Type = mReminder2Type
reminder3Minutes = mReminder3Minutes reminder3Minutes = mReminder3Minutes
reminder3Type = mReminder3Type reminder3Type = mReminder3Type
repeatInterval = mRepeatInterval
repeatLimit = if (repeatInterval == 0) 0 else mRepeatLimit
repeatRule = mRepeatRule
} }
ensureBackgroundThread { ensureBackgroundThread {
@@ -354,6 +379,13 @@ class TaskActivity : SimpleActivity() {
updateTimeText() updateTimeText()
} }
private fun updateTexts() {
updateDateText()
updateTimeText()
updateReminderTexts()
updateRepetitionText()
}
private fun updateDateText() { private fun updateDateText() {
task_date.text = Formatter.getDate(this, mTaskDateTime) task_date.text = Formatter.getDate(this, mTaskDateTime)
} }
@@ -405,12 +437,12 @@ class TaskActivity : SimpleActivity() {
} }
private fun updateReminder1Text() { private fun updateReminder1Text() {
event_reminder_1.text = getFormattedMinutes(mReminder1Minutes) task_reminder_1.text = getFormattedMinutes(mReminder1Minutes)
} }
private fun updateReminder2Text() { private fun updateReminder2Text() {
event_reminder_2.apply { task_reminder_2.apply {
beGoneIf(event_reminder_2.isGone() && mReminder1Minutes == REMINDER_OFF) beGoneIf(task_reminder_2.isGone() && mReminder1Minutes == REMINDER_OFF)
if (mReminder2Minutes == REMINDER_OFF) { if (mReminder2Minutes == REMINDER_OFF) {
text = resources.getString(R.string.add_another_reminder) text = resources.getString(R.string.add_another_reminder)
alpha = 0.4f alpha = 0.4f
@@ -422,8 +454,8 @@ class TaskActivity : SimpleActivity() {
} }
private fun updateReminder3Text() { private fun updateReminder3Text() {
event_reminder_3.apply { task_reminder_3.apply {
beGoneIf(event_reminder_3.isGone() && (mReminder2Minutes == REMINDER_OFF || mReminder1Minutes == REMINDER_OFF)) beGoneIf(task_reminder_3.isGone() && (mReminder2Minutes == REMINDER_OFF || mReminder1Minutes == REMINDER_OFF))
if (mReminder3Minutes == REMINDER_OFF) { if (mReminder3Minutes == REMINDER_OFF) {
text = resources.getString(R.string.add_another_reminder) text = resources.getString(R.string.add_another_reminder)
alpha = 0.4f alpha = 0.4f
@@ -495,8 +527,8 @@ class TaskActivity : SimpleActivity() {
val eventType = eventTypesDB.getEventTypeWithId(mEventTypeId) val eventType = eventTypesDB.getEventTypeWithId(mEventTypeId)
if (eventType != null) { if (eventType != null) {
runOnUiThread { runOnUiThread {
event_type.text = eventType.title task_type.text = eventType.title
event_type_color.setFillWithStroke(eventType.color, getProperBackgroundColor()) task_type_color.setFillWithStroke(eventType.color, getProperBackgroundColor())
} }
} }
} }
@@ -506,9 +538,226 @@ class TaskActivity : SimpleActivity() {
updateTextColors(task_scrollview) updateTextColors(task_scrollview)
val textColor = getProperTextColor() val textColor = getProperTextColor()
arrayOf( arrayOf(
task_time_image, event_reminder_image, event_type_image task_time_image, task_reminder_image, task_type_image
).forEach { ).forEach {
it.applyColorFilter(textColor) it.applyColorFilter(textColor)
} }
} }
private fun showRepeatIntervalDialog() {
showEventRepeatIntervalDialog(mRepeatInterval) {
setRepeatInterval(it)
}
}
private fun setRepeatInterval(interval: Int) {
mRepeatInterval = interval
updateRepetitionText()
checkRepeatTexts(interval)
when {
mRepeatInterval.isXWeeklyRepetition() -> setRepeatRule(2.0.pow((mTaskDateTime.dayOfWeek - 1).toDouble()).toInt())
mRepeatInterval.isXMonthlyRepetition() -> setRepeatRule(REPEAT_SAME_DAY)
mRepeatInterval.isXYearlyRepetition() -> setRepeatRule(REPEAT_SAME_DAY)
}
}
private fun checkRepeatTexts(limit: Int) {
task_repetition_limit_holder.beGoneIf(limit == 0)
checkRepetitionLimitText()
task_repetition_rule_holder.beVisibleIf(mRepeatInterval.isXWeeklyRepetition() || mRepeatInterval.isXMonthlyRepetition() || mRepeatInterval.isXYearlyRepetition())
checkRepetitionRuleText()
}
private fun showRepetitionTypePicker() {
hideKeyboard()
RepeatLimitTypePickerDialog(this, mRepeatLimit, mTaskDateTime.seconds()) {
setRepeatLimit(it)
}
}
private fun setRepeatLimit(limit: Long) {
mRepeatLimit = limit
checkRepetitionLimitText()
}
private fun checkRepetitionLimitText() {
task_repetition_limit.text = when {
mRepeatLimit == 0L -> {
task_repetition_limit_label.text = getString(R.string.repeat)
resources.getString(R.string.forever)
}
mRepeatLimit > 0 -> {
task_repetition_limit_label.text = getString(R.string.repeat_till)
val repeatLimitDateTime = Formatter.getDateTimeFromTS(mRepeatLimit)
Formatter.getFullDate(this, repeatLimitDateTime)
}
else -> {
task_repetition_limit_label.text = getString(R.string.repeat)
"${-mRepeatLimit} ${getString(R.string.times)}"
}
}
}
private fun showRepetitionRuleDialog() {
hideKeyboard()
when {
mRepeatInterval.isXWeeklyRepetition() -> RepeatRuleWeeklyDialog(this, mRepeatRule) {
setRepeatRule(it)
}
mRepeatInterval.isXMonthlyRepetition() -> {
val items = getAvailableMonthlyRepetitionRules()
RadioGroupDialog(this, items, mRepeatRule) {
setRepeatRule(it as Int)
}
}
mRepeatInterval.isXYearlyRepetition() -> {
val items = getAvailableYearlyRepetitionRules()
RadioGroupDialog(this, items, mRepeatRule) {
setRepeatRule(it as Int)
}
}
}
}
private fun getAvailableMonthlyRepetitionRules(): ArrayList<RadioItem> {
val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_monthly)))
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
if (isLastWeekDayOfMonth()) {
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
}
if (isLastDayOfTheMonth()) {
items.add(RadioItem(REPEAT_LAST_DAY, getString(R.string.repeat_on_the_last_day_monthly)))
}
return items
}
private fun getAvailableYearlyRepetitionRules(): ArrayList<RadioItem> {
val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_yearly)))
items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
if (isLastWeekDayOfMonth()) {
items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
}
return items
}
private fun isLastDayOfTheMonth() = mTaskDateTime.dayOfMonth == mTaskDateTime.dayOfMonth().withMaximumValue().dayOfMonth
private fun isLastWeekDayOfMonth() = mTaskDateTime.monthOfYear != mTaskDateTime.plusDays(7).monthOfYear
private fun getRepeatXthDayString(includeBase: Boolean, repeatRule: Int): String {
val dayOfWeek = mTaskDateTime.dayOfWeek
val base = getBaseString(dayOfWeek)
val order = getOrderString(repeatRule)
val dayString = getDayString(dayOfWeek)
return if (includeBase) {
"$base $order $dayString"
} else {
val everyString = getString(if (isMaleGender(mTaskDateTime.dayOfWeek)) R.string.every_m else R.string.every_f)
"$everyString $order $dayString"
}
}
private fun getBaseString(day: Int): String {
return getString(
if (isMaleGender(day)) {
R.string.repeat_every_m
} else {
R.string.repeat_every_f
}
)
}
private fun isMaleGender(day: Int) = day == 1 || day == 2 || day == 4 || day == 5
private fun getOrderString(repeatRule: Int): String {
val dayOfMonth = mTaskDateTime.dayOfMonth
var order = (dayOfMonth - 1) / 7 + 1
if (isLastWeekDayOfMonth() && repeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST) {
order = -1
}
val isMale = isMaleGender(mTaskDateTime.dayOfWeek)
return getString(
when (order) {
1 -> if (isMale) R.string.first_m else R.string.first_f
2 -> if (isMale) R.string.second_m else R.string.second_f
3 -> if (isMale) R.string.third_m else R.string.third_f
4 -> if (isMale) R.string.fourth_m else R.string.fourth_f
5 -> if (isMale) R.string.fifth_m else R.string.fifth_f
else -> if (isMale) R.string.last_m else R.string.last_f
}
)
}
private fun getDayString(day: Int): String {
return getString(
when (day) {
1 -> R.string.monday_alt
2 -> R.string.tuesday_alt
3 -> R.string.wednesday_alt
4 -> R.string.thursday_alt
5 -> R.string.friday_alt
6 -> R.string.saturday_alt
else -> R.string.sunday_alt
}
)
}
private fun getRepeatXthDayInMonthString(includeBase: Boolean, repeatRule: Int): String {
val weekDayString = getRepeatXthDayString(includeBase, repeatRule)
val monthString = resources.getStringArray(R.array.in_months)[mTaskDateTime.monthOfYear - 1]
return "$weekDayString $monthString"
}
private fun setRepeatRule(rule: Int) {
mRepeatRule = rule
checkRepetitionRuleText()
if (rule == 0) {
setRepeatInterval(0)
}
}
private fun checkRepetitionRuleText() {
when {
mRepeatInterval.isXWeeklyRepetition() -> {
task_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getSelectedDaysString(mRepeatRule)
}
mRepeatInterval.isXMonthlyRepetition() -> {
val repeatString = if (mRepeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST || mRepeatRule == REPEAT_ORDER_WEEKDAY)
R.string.repeat else R.string.repeat_on
task_repetition_rule_label.text = getString(repeatString)
task_repetition_rule.text = getMonthlyRepetitionRuleText()
}
mRepeatInterval.isXYearlyRepetition() -> {
val repeatString = if (mRepeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST || mRepeatRule == REPEAT_ORDER_WEEKDAY)
R.string.repeat else R.string.repeat_on
task_repetition_rule_label.text = getString(repeatString)
task_repetition_rule.text = getYearlyRepetitionRuleText()
}
}
}
private fun getMonthlyRepetitionRuleText() = when (mRepeatRule) {
REPEAT_SAME_DAY -> getString(R.string.the_same_day)
REPEAT_LAST_DAY -> getString(R.string.the_last_day)
else -> getRepeatXthDayString(false, mRepeatRule)
}
private fun getYearlyRepetitionRuleText() = when (mRepeatRule) {
REPEAT_SAME_DAY -> getString(R.string.the_same_day)
else -> getRepeatXthDayInMonthString(false, mRepeatRule)
}
private fun updateRepetitionText() {
task_repetition.text = getRepetitionText(mRepeatInterval)
}
} }

View File

@@ -285,7 +285,6 @@ class EventsHelper(val context: Context) {
} else { } else {
try { try {
val typesList = context.config.getDisplayEventTypessAsList() val typesList = context.config.getDisplayEventTypessAsList()
events.addAll(eventsDB.getTasksFromTo(fromTS, toTS, typesList))
events.addAll(eventsDB.getOneTimeEventsFromToWithTypes(toTS, fromTS, typesList).toMutableList() as ArrayList<Event>) events.addAll(eventsDB.getOneTimeEventsFromToWithTypes(toTS, fromTS, typesList).toMutableList() as ArrayList<Event>)
} catch (e: Exception) { } catch (e: Exception) {
@@ -364,13 +363,13 @@ class EventsHelper(val context: Context) {
if (displayEventTypes.isEmpty()) { if (displayEventTypes.isEmpty()) {
return ArrayList() return ArrayList()
} else { } else {
eventsDB.getRepeatableEventsFromToWithTypes(toTS, context.config.getDisplayEventTypessAsList()).toMutableList() as ArrayList<Event> eventsDB.getRepeatableEventsOrTasksWithTypes(toTS, context.config.getDisplayEventTypessAsList()).toMutableList() as ArrayList<Event>
} }
} else { } else {
if (eventId == -1L) { if (eventId == -1L) {
eventsDB.getRepeatableEventsFromToWithTypes(toTS).toMutableList() as ArrayList<Event> eventsDB.getRepeatableEventsOrTasksWithTypes(toTS).toMutableList() as ArrayList<Event>
} else { } else {
eventsDB.getRepeatableEventFromToWithId(eventId, toTS).toMutableList() as ArrayList<Event> eventsDB.getRepeatableEventsOrTasksWithId(eventId, toTS).toMutableList() as ArrayList<Event>
} }
} }

View File

@@ -42,14 +42,14 @@ interface EventsDao {
@Query("SELECT * FROM events WHERE end_ts > :toTS AND repeat_interval = 0 AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT") @Query("SELECT * FROM events WHERE end_ts > :toTS AND repeat_interval = 0 AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT")
fun getOneTimeFutureEventsWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event> fun getOneTimeFutureEventsWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event>
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND repeat_interval != 0 AND type = $TYPE_EVENT") @Query("SELECT * FROM events WHERE start_ts <= :toTS AND repeat_interval != 0 AND (type = $TYPE_EVENT OR type = $TYPE_TASK)")
fun getRepeatableEventsFromToWithTypes(toTS: Long): List<Event> fun getRepeatableEventsOrTasksWithTypes(toTS: Long): List<Event>
@Query("SELECT * FROM events WHERE id = :id AND start_ts <= :toTS AND repeat_interval != 0 AND type = $TYPE_EVENT") @Query("SELECT * FROM events WHERE id = :id AND start_ts <= :toTS AND repeat_interval != 0 AND (type = $TYPE_EVENT OR type = $TYPE_TASK)")
fun getRepeatableEventFromToWithId(id: Long, toTS: Long): List<Event> fun getRepeatableEventsOrTasksWithId(id: Long, toTS: Long): List<Event>
@Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT") @Query("SELECT * FROM events WHERE start_ts <= :toTS AND start_ts != 0 AND repeat_interval != 0 AND event_type IN (:eventTypeIds) AND (type = $TYPE_EVENT OR type = $TYPE_TASK)")
fun getRepeatableEventsFromToWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event> fun getRepeatableEventsOrTasksWithTypes(toTS: Long, eventTypeIds: List<Long>): List<Event>
@Query("SELECT * FROM events WHERE repeat_interval != 0 AND (repeat_limit == 0 OR repeat_limit > :currTS) AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT") @Query("SELECT * FROM events WHERE repeat_interval != 0 AND (repeat_limit == 0 OR repeat_limit > :currTS) AND event_type IN (:eventTypeIds) AND type = $TYPE_EVENT")
fun getRepeatableFutureEventsWithTypes(currTS: Long, eventTypeIds: List<Long>): List<Event> fun getRepeatableFutureEventsWithTypes(currTS: Long, eventTypeIds: List<Long>): List<Event>
@@ -106,10 +106,10 @@ interface EventsDao {
@Query("UPDATE events SET import_id = :importId, source = :source WHERE id = :id AND type = $TYPE_EVENT") @Query("UPDATE events SET import_id = :importId, source = :source WHERE id = :id AND type = $TYPE_EVENT")
fun updateEventImportIdAndSource(importId: String, source: String, id: Long) fun updateEventImportIdAndSource(importId: String, source: String, id: Long)
@Query("UPDATE events SET repeat_limit = :repeatLimit WHERE id = :id AND type = $TYPE_EVENT") @Query("UPDATE events SET repeat_limit = :repeatLimit WHERE id = :id AND (type = $TYPE_EVENT OR type = $TYPE_TASK)")
fun updateEventRepetitionLimit(repeatLimit: Long, id: Long) fun updateEventRepetitionLimit(repeatLimit: Long, id: Long)
@Query("UPDATE events SET repetition_exceptions = :repetitionExceptions WHERE id = :id AND type = $TYPE_EVENT") @Query("UPDATE events SET repetition_exceptions = :repetitionExceptions WHERE id = :id AND (type = $TYPE_EVENT OR type = $TYPE_TASK)")
fun updateEventRepetitionExceptions(repetitionExceptions: String, id: Long) fun updateEventRepetitionExceptions(repetitionExceptions: String, id: Long)
@Query("UPDATE events SET flags = :newFlags WHERE id = :id") @Query("UPDATE events SET flags = :newFlags WHERE id = :id")

View File

@@ -114,7 +114,7 @@
tools:text="00:00" /> tools:text="00:00" />
<ImageView <ImageView
android:id="@+id/event_date_time_divider" android:id="@+id/task_date_time_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_below="@+id/task_date" android:layout_below="@+id/task_date"
@@ -124,23 +124,23 @@
android:importantForAccessibility="no" /> android:importantForAccessibility="no" />
<ImageView <ImageView
android:id="@+id/event_reminder_image" android:id="@+id/task_reminder_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@+id/event_date_time_divider" android:layout_below="@+id/task_date_time_divider"
android:layout_alignTop="@+id/event_reminder_1" android:layout_alignTop="@+id/task_reminder_1"
android:layout_alignBottom="@+id/event_reminder_1" android:layout_alignBottom="@+id/task_reminder_1"
android:layout_marginStart="@dimen/normal_margin" android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin" android:padding="@dimen/medium_margin"
android:src="@drawable/ic_bell_vector" /> android:src="@drawable/ic_bell_vector" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_1" android:id="@+id/task_reminder_1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/event_date_time_divider" android:layout_below="@+id/task_date_time_divider"
android:layout_marginStart="@dimen/small_margin" android:layout_marginStart="@dimen/small_margin"
android:layout_toEndOf="@+id/event_reminder_image" android:layout_toEndOf="@+id/task_reminder_image"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:ellipsize="end" android:ellipsize="end"
android:lines="1" android:lines="1"
@@ -152,11 +152,11 @@
tools:text="@string/add_another_reminder" /> tools:text="@string/add_another_reminder" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_2" android:id="@+id/task_reminder_2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/event_reminder_1" android:layout_below="@+id/task_reminder_1"
android:layout_alignStart="@+id/event_reminder_1" android:layout_alignStart="@+id/task_reminder_1"
android:alpha="0.4" android:alpha="0.4"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:ellipsize="end" android:ellipsize="end"
@@ -171,11 +171,11 @@
tools:text="@string/add_another_reminder" /> tools:text="@string/add_another_reminder" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_reminder_3" android:id="@+id/task_reminder_3"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/event_reminder_2" android:layout_below="@+id/task_reminder_2"
android:layout_alignStart="@+id/event_reminder_1" android:layout_alignStart="@+id/task_reminder_1"
android:alpha="0.4" android:alpha="0.4"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:ellipsize="end" android:ellipsize="end"
@@ -190,49 +190,146 @@
tools:text="@string/add_another_reminder" /> tools:text="@string/add_another_reminder" />
<ImageView <ImageView
android:id="@+id/event_caldav_calendar_divider" android:id="@+id/task_caldav_calendar_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_below="@+id/event_reminder_3" android:layout_below="@+id/task_reminder_3"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin" android:layout_marginBottom="@dimen/medium_margin"
android:background="@color/divider_grey" android:background="@color/divider_grey"
android:importantForAccessibility="no" /> android:importantForAccessibility="no" />
<ImageView <ImageView
android:id="@+id/event_type_image" android:id="@+id/task_repetition_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@+id/event_caldav_calendar_divider" android:layout_below="@+id/task_caldav_calendar_divider"
android:layout_alignTop="@+id/event_type_holder" android:layout_alignTop="@+id/task_repetition"
android:layout_alignBottom="@+id/event_type_holder" android:layout_alignBottom="@+id/task_repetition"
android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin"
android:src="@drawable/ic_repeat_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/task_repetition"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/task_caldav_calendar_divider"
android:layout_marginStart="@dimen/small_margin"
android:layout_toEndOf="@+id/task_repetition_image"
android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size"
tools:text="@string/no_repetition" />
<RelativeLayout
android:id="@+id/task_repetition_rule_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/task_repetition"
android:layout_alignStart="@+id/task_repetition"
android:background="?attr/selectableItemBackground"
android:visibility="gone">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/task_repetition_rule_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_on"
android:textSize="@dimen/day_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/task_repetition_rule"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_toEndOf="@+id/task_repetition_rule_label"
android:clickable="false"
android:gravity="end"
android:padding="@dimen/activity_margin"
android:text="@string/every_day"
android:textSize="@dimen/day_text_size" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/task_repetition_limit_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/task_repetition_rule_holder"
android:layout_alignStart="@+id/task_repetition"
android:background="?attr/selectableItemBackground"
android:visibility="gone">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/task_repetition_limit_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@+id/task_repetition_limit"
android:clickable="false"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/repeat_till"
android:textSize="@dimen/day_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/task_repetition_limit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:clickable="false"
android:padding="@dimen/activity_margin"
android:text="@string/forever"
android:textSize="@dimen/day_text_size" />
</RelativeLayout>
<ImageView
android:id="@+id/task_repetition_divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@+id/task_repetition_limit_holder"
android:layout_marginTop="@dimen/medium_margin"
android:background="@color/divider_grey"
android:importantForAccessibility="no" />
<ImageView
android:id="@+id/task_type_image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/task_repetition_divider"
android:layout_alignTop="@+id/task_type_holder"
android:layout_alignBottom="@+id/task_type_holder"
android:layout_marginStart="@dimen/normal_margin" android:layout_marginStart="@dimen/normal_margin"
android:padding="@dimen/medium_margin" android:padding="@dimen/medium_margin"
android:src="@drawable/ic_color_vector" /> android:src="@drawable/ic_color_vector" />
<RelativeLayout <RelativeLayout
android:id="@+id/event_type_holder" android:id="@+id/task_type_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/event_caldav_calendar_divider" android:layout_below="@+id/task_repetition_divider"
android:layout_marginTop="@dimen/medium_margin" android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin" android:layout_marginBottom="@dimen/medium_margin"
android:layout_toEndOf="@+id/event_type_image" android:layout_toEndOf="@+id/task_type_image"
android:background="?attr/selectableItemBackground"> android:background="?attr/selectableItemBackground">
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/event_type" android:id="@+id/task_type"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/small_margin" android:layout_marginStart="@dimen/small_margin"
android:layout_marginEnd="@dimen/medium_margin" android:layout_marginEnd="@dimen/medium_margin"
android:layout_toStartOf="@+id/event_type_color" android:layout_toStartOf="@+id/task_type_color"
android:paddingTop="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin"
android:paddingBottom="@dimen/normal_margin" android:paddingBottom="@dimen/normal_margin"
android:textSize="@dimen/day_text_size" /> android:textSize="@dimen/day_text_size" />
<ImageView <ImageView
android:id="@+id/event_type_color" android:id="@+id/task_type_color"
android:layout_width="@dimen/color_sample_size" android:layout_width="@dimen/color_sample_size"
android:layout_height="@dimen/color_sample_size" android:layout_height="@dimen/color_sample_size"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
@@ -243,10 +340,10 @@
</RelativeLayout> </RelativeLayout>
<ImageView <ImageView
android:id="@+id/event_type_divider" android:id="@+id/task_type_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1px" android:layout_height="1px"
android:layout_below="@+id/event_type_holder" android:layout_below="@+id/task_type_holder"
android:background="@color/divider_grey" android:background="@color/divider_grey"
android:importantForAccessibility="no" /> android:importantForAccessibility="no" />
@@ -255,7 +352,7 @@
style="@style/ColoredButtonStyle" style="@style/ColoredButtonStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/event_type_divider" android:layout_below="@+id/task_type_divider"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/activity_margin" android:layout_marginTop="@dimen/activity_margin"
android:text="@string/mark_completed" android:text="@string/mark_completed"