Properly handle "Start week on" preference in all places

This commit is contained in:
Naveen 2023-07-22 22:44:24 +05:30
parent aa1ed30e52
commit 5bdd5e8cec
No known key found for this signature in database
GPG Key ID: 0E155DAD31671DA3
12 changed files with 100 additions and 69 deletions

View File

@ -794,7 +794,7 @@ class EventActivity : SimpleActivity() {
private fun checkRepetitionRuleText() {
when {
mRepeatInterval.isXWeeklyRepetition() -> {
event_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getSelectedDaysString(mRepeatRule)
event_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getShortDaysFromBitmask(mRepeatRule)
}
mRepeatInterval.isXMonthlyRepetition() -> {

View File

@ -25,7 +25,6 @@ import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import kotlinx.android.synthetic.main.activity_task.*
import org.joda.time.DateTime
import java.util.Calendar
import kotlin.math.pow
class TaskActivity : SimpleActivity() {
@ -985,7 +984,7 @@ class TaskActivity : SimpleActivity() {
private fun checkRepetitionRuleText() {
when {
mRepeatInterval.isXWeeklyRepetition() -> {
task_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getSelectedDaysString(mRepeatRule)
task_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getShortDaysFromBitmask(mRepeatRule)
}
mRepeatInterval.isXMonthlyRepetition() -> {
val repeatString = if (mRepeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST || mRepeatRule == REPEAT_ORDER_WEEKDAY)

View File

@ -16,18 +16,21 @@ import android.widget.TextView
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.addDayEvents
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.isWeekendIndex
import com.simplemobiletools.calendar.pro.helpers.MonthlyCalendarImpl
import com.simplemobiletools.calendar.pro.helpers.MyWidgetMonthlyProvider
import com.simplemobiletools.calendar.pro.helpers.isWeekend
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
import com.simplemobiletools.calendar.pro.models.DayMonthly
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
import kotlinx.android.synthetic.main.day_monthly_number_view.view.*
import kotlinx.android.synthetic.main.first_row.*
import kotlinx.android.synthetic.main.top_navigation.*
import kotlinx.android.synthetic.main.day_monthly_number_view.view.day_monthly_number_background
import kotlinx.android.synthetic.main.day_monthly_number_view.view.day_monthly_number_id
import kotlinx.android.synthetic.main.first_row.week_num
import kotlinx.android.synthetic.main.top_navigation.top_left_arrow
import kotlinx.android.synthetic.main.top_navigation.top_right_arrow
import kotlinx.android.synthetic.main.top_navigation.top_value
import kotlinx.android.synthetic.main.widget_config_monthly.*
import org.joda.time.DateTime
@ -217,7 +220,7 @@ class WidgetMonthlyConfigureActivity : SimpleActivity(), MonthlyCalendar {
val weekendsTextColor = config.highlightWeekendsColor
for (i in 0..6) {
findViewById<TextView>(resources.getIdentifier("label_$i", "id", packageName)).apply {
val textColor = if (config.highlightWeekends && isWeekend(i, config.isSundayFirst)) {
val textColor = if (config.highlightWeekends && context.isWeekendIndex(i)) {
weekendsTextColor
} else {
mTextColor

View File

@ -2,18 +2,18 @@ package com.simplemobiletools.calendar.pro.dialogs
import android.app.Activity
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.withFirstDayOfWeekToFront
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.views.MyAppCompatCheckbox
import kotlinx.android.synthetic.main.dialog_vertical_linear_layout.view.*
import kotlinx.android.synthetic.main.dialog_vertical_linear_layout.view.dialog_vertical_linear_layout
class RepeatRuleWeeklyDialog(val activity: Activity, val curRepeatRule: Int, val callback: (repeatRule: Int) -> Unit) {
private val view = activity.layoutInflater.inflate(R.layout.dialog_vertical_linear_layout, null)
init {
val days = activity.resources.getStringArray(R.array.week_days)
val checkboxes = ArrayList<MyAppCompatCheckbox>(7)
var checkboxes = ArrayList<MyAppCompatCheckbox>(7)
for (i in 0..6) {
val pow = Math.pow(2.0, i.toDouble()).toInt()
(activity.layoutInflater.inflate(R.layout.my_checkbox, null) as MyAppCompatCheckbox).apply {
@ -24,10 +24,7 @@ class RepeatRuleWeeklyDialog(val activity: Activity, val curRepeatRule: Int, val
}
}
if (activity.config.isSundayFirst) {
checkboxes.add(0, checkboxes.removeAt(6))
}
checkboxes = activity.withFirstDayOfWeekToFront(checkboxes)
checkboxes.forEach {
view.dialog_vertical_linear_layout.addView(it)
}

View File

@ -799,6 +799,56 @@ fun Context.getDayOfWeekString(dayOfWeek: Int): String {
return getString(dayOfWeekResId)
}
// format day bits to strings like "Mon, Tue, Wed"
fun Context.getShortDaysFromBitmask(bitMask: Int): String {
val dayBits = withFirstDayOfWeekToFront(listOf(MONDAY_BIT, TUESDAY_BIT, WEDNESDAY_BIT, THURSDAY_BIT, FRIDAY_BIT, SATURDAY_BIT, SUNDAY_BIT))
val weekDays = withFirstDayOfWeekToFront(resources.getStringArray(R.array.week_days_short).toList())
var days = ""
dayBits.forEachIndexed { index, bit ->
if (bitMask and bit != 0) {
days += "${weekDays[index]}, "
}
}
return days.trim().trimEnd(',')
}
fun <T> Context.withFirstDayOfWeekToFront(weekItems: Collection<T>): ArrayList<T> {
val firstDayOfWeek = config.firstDayOfWeek
if (firstDayOfWeek != DateTimeConstants.MONDAY) {
return weekItems.toMutableList() as ArrayList<T>
}
val firstDayOfWeekIndex = config.firstDayOfWeek - 1
val rotatedWeekItems = weekItems.drop(firstDayOfWeekIndex) + weekItems.take(firstDayOfWeekIndex)
return rotatedWeekItems as ArrayList<T>
}
fun Context.getProperDayIndexInWeek(date: DateTime): Int {
val firstDayOfWeek = config.firstDayOfWeek
val dayOfWeek = date.dayOfWeek
val dayIndex = if (dayOfWeek >= firstDayOfWeek) {
dayOfWeek - firstDayOfWeek
} else {
dayOfWeek + (7 - firstDayOfWeek)
}
return dayIndex
}
fun Context.isWeekendIndex(dayIndex: Int): Boolean {
val firstDayOfWeek = config.firstDayOfWeek
val shiftedIndex = (dayIndex + firstDayOfWeek) % 7
val dayOfWeek = if (shiftedIndex == 0) {
DateTimeConstants.SUNDAY
} else {
shiftedIndex
}
return isWeekend(dayOfWeek)
}
fun Context.isTaskCompleted(event: Event): Boolean {
if (event.id == null) return false
val originalEvent = eventsDB.getTaskWithId(event.id!!)

View File

@ -229,7 +229,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
resources.getColor(R.color.theme_light_text_color)
} else if (todayCode == dayCode) {
primaryColor
} else if (highlightWeekends && isWeekend(curDay.dayOfWeek, true)) {
} else if (highlightWeekends && isWeekend(curDay.dayOfWeek)) {
config.highlightWeekendsColor
} else {
requireContext().getProperTextColor()

View File

@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.MainActivity
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.getProperDayIndexInWeek
import com.simplemobiletools.calendar.pro.extensions.getViewBitmap
import com.simplemobiletools.calendar.pro.extensions.printBitmap
import com.simplemobiletools.calendar.pro.helpers.YEAR_LABEL
@ -22,13 +23,16 @@ import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.updateTextColors
import kotlinx.android.synthetic.main.fragment_year.view.*
import kotlinx.android.synthetic.main.top_navigation.view.*
import kotlinx.android.synthetic.main.fragment_year.view.calendar_wrapper
import kotlinx.android.synthetic.main.fragment_year.view.month_2
import kotlinx.android.synthetic.main.top_navigation.view.top_left_arrow
import kotlinx.android.synthetic.main.top_navigation.view.top_right_arrow
import kotlinx.android.synthetic.main.top_navigation.view.top_value
import org.joda.time.DateTime
class YearFragment : Fragment(), YearlyCalendar {
private var mYear = 0
private var mSundayFirst = false
private var mFirstDayOfWeek = 0
private var isPrintVersion = false
private var lastHash = 0
private var mCalendar: YearlyCalendarImpl? = null
@ -50,14 +54,14 @@ class YearFragment : Fragment(), YearlyCalendar {
override fun onPause() {
super.onPause()
mSundayFirst = requireContext().config.isSundayFirst
mFirstDayOfWeek = requireContext().config.firstDayOfWeek
}
override fun onResume() {
super.onResume()
val sundayFirst = requireContext().config.isSundayFirst
if (sundayFirst != mSundayFirst) {
mSundayFirst = sundayFirst
val firstDayOfWeek = requireContext().config.firstDayOfWeek
if (firstDayOfWeek != mFirstDayOfWeek) {
mFirstDayOfWeek = firstDayOfWeek
setupMonths()
}
updateCalendar()
@ -76,11 +80,7 @@ class YearFragment : Fragment(), YearlyCalendar {
for (i in 1..12) {
val monthView = mView.findViewById<SmallMonthView>(resources.getIdentifier("month_$i", "id", requireContext().packageName))
var dayOfWeek = dateTime.withMonthOfYear(i).dayOfWeek().get()
if (!mSundayFirst) {
dayOfWeek--
}
val dayOfWeek = requireContext().getProperDayIndexInWeek(dateTime.withMonthOfYear(i))
val monthLabel = mView.findViewById<TextView>(resources.getIdentifier("month_${i}_label", "id", requireContext().packageName))
val curTextColor = when {
isPrintVersion -> resources.getColor(R.color.theme_light_text_color)

View File

@ -5,7 +5,8 @@ import com.simplemobiletools.calendar.pro.activities.TaskActivity
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import org.joda.time.DateTime
import org.joda.time.DateTimeConstants
import java.util.*
import java.util.Calendar
import java.util.UUID
const val STORED_LOCALLY_ONLY = 0
const val ROW_COUNT = 6
@ -268,12 +269,9 @@ const val ACTION_MARK_COMPLETED = "ACTION_MARK_COMPLETED"
fun getNowSeconds() = System.currentTimeMillis() / 1000L
fun isWeekend(i: Int, isSundayFirst: Boolean): Boolean {
return if (isSundayFirst) {
i == 0 || i == 6 || i == 7 || i == 13
} else {
i == 5 || i == 6 || i == 12 || i == 13
}
fun isWeekend(dayOfWeek: Int): Boolean {
val weekendDays = listOf(DateTimeConstants.SATURDAY, DateTimeConstants.SUNDAY)
return dayOfWeek in weekendDays
}
fun getActivityToOpen(isTask: Boolean) = if (isTask) {
@ -302,20 +300,6 @@ fun getPreviousAutoBackupTime(): DateTime {
return nextBackupTime.minusDays(AUTO_BACKUP_INTERVAL_IN_DAYS)
}
fun getDefaultFirstDayOfWeekJoda(): Int {
val calendar = Calendar.getInstance(Locale.getDefault())
return when (calendar.firstDayOfWeek) {
Calendar.SUNDAY -> DateTimeConstants.SUNDAY
Calendar.MONDAY -> DateTimeConstants.MONDAY
Calendar.TUESDAY -> DateTimeConstants.TUESDAY
Calendar.WEDNESDAY -> DateTimeConstants.WEDNESDAY
Calendar.THURSDAY -> DateTimeConstants.THURSDAY
Calendar.FRIDAY -> DateTimeConstants.FRIDAY
Calendar.SATURDAY -> DateTimeConstants.SATURDAY
else -> DateTimeConstants.SUNDAY
}
}
fun getJodaDayOfWeekFromJava(dayOfWeek: Int): Int {
return when (dayOfWeek) {
Calendar.SUNDAY -> DateTimeConstants.SUNDAY

View File

@ -1,8 +1,9 @@
package com.simplemobiletools.calendar.pro.helpers
import android.content.Context
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.extensions.getProperDayIndexInWeek
import com.simplemobiletools.calendar.pro.extensions.isWeekendIndex
import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
import com.simplemobiletools.calendar.pro.models.DayMonthly
@ -34,13 +35,10 @@ class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) {
fun getDays(markDaysWithEvents: Boolean) {
val days = ArrayList<DayMonthly>(DAYS_CNT)
val currMonthDays = mTargetDate.dayOfMonth().maximumValue
var firstDayIndex = mTargetDate.withDayOfMonth(1).dayOfWeek
val isSundayFirst = context.config.isSundayFirst
if (!isSundayFirst) {
firstDayIndex -= 1
}
val firstDayOfMonth = mTargetDate.withDayOfMonth(1)
val firstDayIndex = context.getProperDayIndexInWeek(firstDayOfMonth)
val currMonthDays = mTargetDate.dayOfMonth().maximumValue
val prevMonthDays = mTargetDate.minusMonths(1).dayOfMonth().maximumValue
var isThisMonth = false
@ -70,7 +68,7 @@ class MonthlyCalendarImpl(val callback: MonthlyCalendar, val context: Context) {
val newDay = curDay.withDayOfMonth(value)
val dayCode = Formatter.getDayCodeFromDateTime(newDay)
val day = DayMonthly(value, isThisMonth, isToday, dayCode, newDay.weekOfWeekyear, ArrayList(), i, isWeekend(i % 7, isSundayFirst))
val day = DayMonthly(value, isThisMonth, isToday, dayCode, newDay.weekOfWeekyear, ArrayList(), i, context.isWeekendIndex(i))
days.add(day)
value++
}

View File

@ -14,6 +14,7 @@ import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.SplashActivity
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.getWidgetFontSize
import com.simplemobiletools.calendar.pro.extensions.isWeekendIndex
import com.simplemobiletools.calendar.pro.extensions.launchNewEventOrTaskActivity
import com.simplemobiletools.calendar.pro.interfaces.MonthlyCalendar
import com.simplemobiletools.calendar.pro.models.DayMonthly
@ -21,6 +22,7 @@ import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA
import org.joda.time.DateTime
import org.joda.time.DateTimeConstants
class MyWidgetMonthlyProvider : AppWidgetProvider() {
private val PREV = "prev"
@ -233,14 +235,14 @@ class MyWidgetMonthlyProvider : AppWidgetProvider() {
private fun updateDayLabels(context: Context, views: RemoteViews, resources: Resources, textColor: Int) {
val config = context.config
val sundayFirst = config.isSundayFirst
val firstDayOfWeek = config.firstDayOfWeek
val smallerFontSize = context.getWidgetFontSize()
val packageName = context.packageName
val letters = context.resources.getStringArray(R.array.week_day_letters)
for (i in 0..6) {
val id = resources.getIdentifier("label_$i", "id", packageName)
val dayTextColor = if (context.config.highlightWeekends && isWeekend(i, sundayFirst)) {
val dayTextColor = if (context.config.highlightWeekends && context.isWeekendIndex(i)) {
context.config.highlightWeekendsColor
} else {
textColor
@ -250,8 +252,8 @@ class MyWidgetMonthlyProvider : AppWidgetProvider() {
views.setTextSize(id, smallerFontSize)
var index = i
if (sundayFirst) {
index = (index + 6) % letters.size
if (firstDayOfWeek != DateTimeConstants.MONDAY) {
index = (index + firstDayOfWeek - 1) % 7
}
views.setText(id, letters[index])

View File

@ -9,11 +9,12 @@ import android.util.SparseIntArray
import android.view.View
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.isWeekendIndex
import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.extensions.withFirstDayOfWeekToFront
import com.simplemobiletools.calendar.pro.helpers.COLUMN_COUNT
import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.helpers.ROW_COUNT
import com.simplemobiletools.calendar.pro.helpers.isWeekend
import com.simplemobiletools.calendar.pro.models.DayMonthly
import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.calendar.pro.models.MonthViewEvent
@ -231,7 +232,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
var weekDayLetterPaint = textPaint
if (i == currDayOfWeek && !isPrintVersion) {
weekDayLetterPaint = getColoredPaint(primaryColor)
} else if (highlightWeekends && isWeekend(i, config.isSundayFirst)) {
} else if (highlightWeekends && context.isWeekendIndex(i)) {
weekDayLetterPaint = getColoredPaint(weekendsTextColor)
}
canvas.drawText(dayLetters[i], xPos, weekDaysLetterHeight * 0.7f, weekDayLetterPaint)
@ -393,10 +394,7 @@ class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(con
}
private fun initWeekDayLetters() {
dayLetters = context.resources.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
if (config.isSundayFirst) {
dayLetters.moveLastItemToFront()
}
dayLetters = context.withFirstDayOfWeekToFront(context.resources.getStringArray(R.array.week_day_letters).toList())
}
private fun setupCurrentDayOfWeekIndex() {

View File

@ -8,7 +8,7 @@ import android.util.AttributeSet
import android.view.View
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.helpers.isWeekend
import com.simplemobiletools.calendar.pro.extensions.isWeekendIndex
import com.simplemobiletools.calendar.pro.models.DayYearly
import com.simplemobiletools.commons.extensions.adjustAlpha
import com.simplemobiletools.commons.extensions.getProperPrimaryColor
@ -107,7 +107,7 @@ class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : Vie
val curPaint = Paint(paint)
curPaint.color = colors.first()
return curPaint
} else if (highlightWeekends && isWeekend(weekDay - 1, isSundayFirst)) {
} else if (highlightWeekends && context.isWeekendIndex(weekDay - 1)) {
val curPaint = Paint(paint)
curPaint.color = weekendsTextColor
return curPaint