diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt index 0f5a74c07..de3f32938 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt @@ -181,7 +181,7 @@ class EventActivity : SimpleActivity(), DBHelper.EventUpdateListener { description = newDescription reminderMinutes = mReminderMinutes repeatInterval = mRepeatInterval - flags = if (event_all_day.isChecked) (mEvent.flags or FLAG_ALL_DAY) else (mEvent.flags xor FLAG_ALL_DAY) + flags = if (event_all_day.isChecked) (mEvent.flags or FLAG_ALL_DAY) else (mEvent.flags.removeFlag(FLAG_ALL_DAY)) } if (mEvent.id == 0) { diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt index ad0f5100e..f38a9f720 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt @@ -14,7 +14,7 @@ import android.widget.SeekBar import android.widget.TextView import com.simplemobiletools.calendar.R import com.simplemobiletools.calendar.extensions.config -import com.simplemobiletools.calendar.extensions.removeUnderlineFlag +import com.simplemobiletools.calendar.extensions.removeFlag import com.simplemobiletools.calendar.helpers.LOW_ALPHA import com.simplemobiletools.calendar.helpers.MonthlyCalendarImpl import com.simplemobiletools.calendar.helpers.MyWidgetMonthlyProvider @@ -171,7 +171,7 @@ class WidgetMonthlyConfigureActivity : AppCompatActivity(), MonthlyCalendar { text = day.value.toString() setTextColor(curTextColor) - paintFlags = if (day.hasEvent) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeUnderlineFlag()) + paintFlags = if (day.hasEvent) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeFlag(Paint.UNDERLINE_TEXT_FLAG)) background = if (day.isToday) todayCircle else null } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt index 348b1f14e..149e2631f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt @@ -1,8 +1,4 @@ package com.simplemobiletools.calendar.extensions -import android.graphics.Paint - -// TODO: how to do "flags & ~Paint.UNDERLINE_TEXT_FLAG" in kotlin? -fun Int.removeUnderlineFlag(): Int { - return this - (if (this and Paint.UNDERLINE_TEXT_FLAG == Paint.UNDERLINE_TEXT_FLAG) Paint.UNDERLINE_TEXT_FLAG else 0) -} +// TODO: how to do "flags & ~flag" in kotlin? +fun Int.removeFlag(flag: Int) = this - (if (this and flag != 0) flag else 0) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt index b7f332a0d..b9a74abaf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt @@ -17,7 +17,7 @@ import com.simplemobiletools.calendar.R import com.simplemobiletools.calendar.activities.DayActivity import com.simplemobiletools.calendar.extensions.config import com.simplemobiletools.calendar.extensions.getAppropriateTheme -import com.simplemobiletools.calendar.extensions.removeUnderlineFlag +import com.simplemobiletools.calendar.extensions.removeFlag import com.simplemobiletools.calendar.helpers.* import com.simplemobiletools.calendar.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.interfaces.NavigationListener @@ -187,7 +187,7 @@ class MonthFragment : Fragment(), MonthlyCalendar { setTextColor(curTextColor) setOnClickListener { openDay(day.code) } - paintFlags = if (day.hasEvent) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeUnderlineFlag()) + paintFlags = if (day.hasEvent) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeFlag(Paint.UNDERLINE_TEXT_FLAG)) background = if (day.isToday) todayCircle else null } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt index 4cf34ee24..779f212b2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt @@ -10,6 +10,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver +import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView import com.simplemobiletools.calendar.R @@ -24,6 +25,7 @@ import com.simplemobiletools.calendar.views.MyScrollView import kotlinx.android.synthetic.main.fragment_week.* import kotlinx.android.synthetic.main.fragment_week.view.* import org.joda.time.DateTime +import org.joda.time.Days import kotlin.comparisons.compareBy class WeekFragment : Fragment(), WeeklyCalendar { @@ -33,6 +35,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { private var minScrollY = -1 private var maxScrollY = -1 private var mWasDestroyed = false + private var primaryColor = 0 lateinit var mView: View lateinit var mCalendar: WeeklyCalendarImpl lateinit var mRes: Resources @@ -41,6 +44,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { mRowHeight = (context.resources.getDimension(R.dimen.weekly_view_row_height)).toInt() minScrollY = mRowHeight * context.config.startWeeklyAt mWeekTimestamp = arguments.getInt(WEEK_START_TIMESTAMP) + primaryColor = context.config.primaryColor mView = inflater.inflate(R.layout.fragment_week, container, false).apply { week_events_scrollview.setOnScrollviewListener(object : MyScrollView.ScrollViewListener { @@ -104,7 +108,7 @@ class WeekFragment : Fragment(), WeeklyCalendar { val dayLetter = getDayLetter(curDay.dayOfWeek) (mView.findViewById(mRes.getIdentifier("week_day_label_$i", "id", context.packageName)) as TextView).apply { text = "$dayLetter\n${curDay.dayOfMonth}" - setTextColor(if (todayCode == dayCode) context.config.primaryColor else textColor) + setTextColor(if (todayCode == dayCode) primaryColor else textColor) } curDay = curDay.plusDays(1) } @@ -139,38 +143,73 @@ class WeekFragment : Fragment(), WeeklyCalendar { val fullHeight = mRes.getDimension(R.dimen.weekly_view_events_height) val minuteHeight = fullHeight / (24 * 60) val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt() - val eventColor = context.config.primaryColor val sideMargin = mRes.displayMetrics.density.toInt() (0..6).map { getColumnWithId(it) } .forEach { activity.runOnUiThread { it.removeAllViews() } } + activity.runOnUiThread { mView.week_all_day_holder.removeAllViews() } + val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { it.description })) for (event in sorted) { - val startDateTime = Formatter.getDateTimeFromTS(event.startTS).plusDays(if (context.config.isSundayFirst) 1 else 0) - val endDateTime = Formatter.getDateTimeFromTS(event.endTS) - val dayOfWeek = startDateTime.dayOfWeek - 1 - val layout = getColumnWithId(dayOfWeek) + if (event.isAllDay()) { + addAllDayEvent(event) + } else { + val startDateTime = Formatter.getDateTimeFromTS(event.startTS).plusDays(if (context.config.isSundayFirst) 1 else 0) + val endDateTime = Formatter.getDateTimeFromTS(event.endTS) + val dayOfWeek = startDateTime.dayOfWeek - 1 + val layout = getColumnWithId(dayOfWeek) - val startMinutes = startDateTime.minuteOfDay - val duration = endDateTime.minuteOfDay - startMinutes + val startMinutes = startDateTime.minuteOfDay + val duration = endDateTime.minuteOfDay - startMinutes - (LayoutInflater.from(context).inflate(R.layout.week_event_marker, null, false) as TextView).apply { - background = ColorDrawable(eventColor) - text = event.title - activity.runOnUiThread { - layout.addView(this) - (layoutParams as RelativeLayout.LayoutParams).apply { - rightMargin = sideMargin - topMargin = (startMinutes * minuteHeight).toInt() - width = layout.width - minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - sideMargin + (LayoutInflater.from(context).inflate(R.layout.week_event_marker, null, false) as TextView).apply { + background = ColorDrawable(primaryColor) + text = event.title + activity.runOnUiThread { + layout.addView(this) + (layoutParams as RelativeLayout.LayoutParams).apply { + rightMargin = sideMargin + topMargin = (startMinutes * minuteHeight).toInt() + width = layout.width + minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - sideMargin + } + } + setOnClickListener { + Intent(activity.applicationContext, EventActivity::class.java).apply { + putExtra(EVENT_ID, event.id) + startActivity(this) + } } } - setOnClickListener { - Intent(activity.applicationContext, EventActivity::class.java).apply { - putExtra(EVENT_ID, event.id) - startActivity(this) - } + } + } + } + + private fun addAllDayEvent(event: Event) { + (LayoutInflater.from(context).inflate(R.layout.week_all_day_event_marker, null, false) as TextView).apply { + background = ColorDrawable(primaryColor) + text = event.title + + val startDateTime = Formatter.getDateTimeFromTS(event.startTS) + val endDateTime = Formatter.getDateTimeFromTS(event.endTS) + + val firstDayIndex = startDateTime.dayOfWeek - if (context.config.isSundayFirst) 0 else 1 + val daysCnt = Days.daysBetween(startDateTime.withTimeAtStartOfDay(), endDateTime.withTimeAtStartOfDay()).days + + activity.runOnUiThread { + val dayColumnWidth = getColumnWithId(1).width + mView.week_all_day_holder.addView(this) + (layoutParams as LinearLayout.LayoutParams).apply { + topMargin = mRes.getDimension(R.dimen.tiny_margin).toInt() + bottomMargin = mRes.getDimension(R.dimen.tiny_margin).toInt() + leftMargin = firstDayIndex * dayColumnWidth + width = (daysCnt + 1) * dayColumnWidth - mRes.displayMetrics.density.toInt() + } + } + setOnClickListener { + Intent(activity.applicationContext, EventActivity::class.java).apply { + putExtra(EVENT_ID, event.id) + startActivity(this) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt index 384367265..e347ca319 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt @@ -27,4 +27,6 @@ data class Event(var id: Int = 0, var startTS: Int = 0, var endTS: Int = 0, var startTS = newStartTS endTS = newEndTS } + + fun isAllDay() = flags and FLAG_ALL_DAY != 0 } diff --git a/app/src/main/res/layout/fragment_week.xml b/app/src/main/res/layout/fragment_week.xml index 848004d10..ddaf2b0f6 100644 --- a/app/src/main/res/layout/fragment_week.xml +++ b/app/src/main/res/layout/fragment_week.xml @@ -85,12 +85,12 @@ - + android:layout_height="wrap_content" + android:orientation="vertical"/> - +