diff --git a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingListItemModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingListItemModel.kt index 43a831c93..b8355d5f7 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingListItemModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingListItemModel.kt @@ -22,7 +22,10 @@ package org.linphone.ui.main.meetings.model import androidx.annotation.WorkerThread import org.linphone.utils.TimestampUtils -class MeetingListItemModel @WorkerThread constructor(meetingModel: MeetingModel?) { +class MeetingListItemModel @WorkerThread constructor( + meetingModel: MeetingModel?, + val firstMeetingOfTheWeek: Boolean +) { val isToday = meetingModel == null val month = meetingModel?.month ?: TimestampUtils.month(System.currentTimeMillis(), false) @@ -34,7 +37,16 @@ class MeetingListItemModel @WorkerThread constructor(meetingModel: MeetingModel? false ) + val weekLabel = meetingModel?.weekLabel ?: TimestampUtils.firstAndLastDayOfWeek( + System.currentTimeMillis(), + false + ) + val model = meetingModel ?: TodayModel() + init { + meetingModel?.firstMeetingOfTheWeek?.postValue(firstMeetingOfTheWeek) + } + class TodayModel } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt index e5f1c8062..221ed6888 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt @@ -59,6 +59,10 @@ class MeetingModel @WorkerThread constructor(private val conferenceInfo: Confere val firstMeetingOfTheDay = MutableLiveData() + val weekLabel = TimestampUtils.firstAndLastDayOfWeek(timestamp) + + val firstMeetingOfTheWeek = MutableLiveData() + init { subject.postValue(conferenceInfo.subject) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt index 3df875155..b7735a010 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt @@ -30,6 +30,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.main.meetings.model.MeetingListItemModel import org.linphone.ui.main.meetings.model.MeetingModel import org.linphone.ui.main.viewmodel.AbstractMainViewModel +import org.linphone.utils.TimestampUtils class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() { companion object { @@ -91,6 +92,7 @@ class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() { } var previousModel: MeetingModel? = null + var previousModelWeekLabel = "" var meetingForTodayFound = false for (info: ConferenceInfo in source) { if (info.duration == 0) continue // This isn't a scheduled conference, don't display it @@ -111,6 +113,9 @@ class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() { if (add) { val model = MeetingModel(info) + + val firstMeetingOfTheWeek = previousModelWeekLabel != model.weekLabel + val firstMeetingOfTheDay = if (previousModel != null) { previousModel.day != model.day || previousModel.dayNumber != model.dayNumber } else { @@ -124,18 +129,31 @@ class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() { // If no meeting was found for today, insert "Today" fake model before the next meeting to come if (!meetingForTodayFound && model.isAfterToday) { - list.add(MeetingListItemModel(null)) + val todayWeekLabel = TimestampUtils.firstAndLastDayOfWeek( + System.currentTimeMillis(), + false + ) + val firstMeetingOfTheWeek = previousModelWeekLabel != todayWeekLabel + list.add(MeetingListItemModel(null, firstMeetingOfTheWeek)) meetingForTodayFound = true + previousModelWeekLabel = todayWeekLabel + } else { + previousModelWeekLabel = model.weekLabel } - list.add(MeetingListItemModel(model)) + list.add(MeetingListItemModel(model, firstMeetingOfTheWeek)) previousModel = model } } // If no meeting was found after today, insert "Today" fake model at the end if (!meetingForTodayFound) { - list.add(MeetingListItemModel(null)) + val todayWeekLabel = TimestampUtils.firstAndLastDayOfWeek( + System.currentTimeMillis(), + false + ) + val firstMeetingOfTheWeek = previousModelWeekLabel != todayWeekLabel + list.add(MeetingListItemModel(null, firstMeetingOfTheWeek)) } meetings.postValue(list) diff --git a/app/src/main/java/org/linphone/utils/TimestampUtils.kt b/app/src/main/java/org/linphone/utils/TimestampUtils.kt index eb312914f..44c1e93db 100644 --- a/app/src/main/java/org/linphone/utils/TimestampUtils.kt +++ b/app/src/main/java/org/linphone/utils/TimestampUtils.kt @@ -96,6 +96,33 @@ class TimestampUtils { return calendar.get(Calendar.DAY_OF_MONTH).toString() } + @AnyThread + fun firstAndLastDayOfWeek(timestamp: Long, timestampInSecs: Boolean = true): String { + val calendar = Calendar.getInstance() + calendar.timeInMillis = if (timestampInSecs) timestamp * 1000 else timestamp + while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.firstDayOfWeek) { + calendar.add(Calendar.DATE, -1) + } + val firstDayOfWeek = calendar.get(Calendar.DAY_OF_MONTH).toString() + val firstDayOfWeekMonth = calendar.getDisplayName( + Calendar.MONTH, + TextStyle.SHORT.ordinal, + Locale.getDefault() + ) + calendar.add(Calendar.DAY_OF_MONTH, 6) + val lastDayOfWeek = calendar.get(Calendar.DAY_OF_MONTH).toString() + val lastDayOfWeekMonth = calendar.getDisplayName( + Calendar.MONTH, + TextStyle.SHORT.ordinal, + Locale.getDefault() + ) + return if (firstDayOfWeekMonth == lastDayOfWeekMonth) { + "$firstDayOfWeek - $lastDayOfWeek $lastDayOfWeekMonth" + } else { + "$firstDayOfWeek $firstDayOfWeekMonth - $lastDayOfWeek $lastDayOfWeekMonth" + } + } + @AnyThread fun month(timestamp: Long, timestampInSecs: Boolean = true): String { val calendar = Calendar.getInstance() diff --git a/app/src/main/res/layout/meeting_list_cell.xml b/app/src/main/res/layout/meeting_list_cell.xml index e5f908598..5056ce708 100644 --- a/app/src/main/res/layout/meeting_list_cell.xml +++ b/app/src/main/res/layout/meeting_list_cell.xml @@ -22,6 +22,24 @@ android:paddingStart="16dp" android:paddingEnd="16dp"> + + + app:layout_constraintTop_toBottomOf="@id/week_label"/> + + + app:layout_constraintTop_toBottomOf="@id/week_label"/>