Skip to content

Commit 3a2ab1f

Browse files
author
alllexey
committed
Refactor workers, services, etc. to use new data structure
1 parent 8b94caa commit 3a2ab1f

File tree

10 files changed

+120
-270
lines changed

10 files changed

+120
-270
lines changed

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/LessonListWidget.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import androidx.core.net.toUri
1010
import me.alllexey123.itmowidgets.ItmoWidgetsApp
1111
import me.alllexey123.itmowidgets.R
1212
import me.alllexey123.itmowidgets.ui.schedule.ScheduleActivity
13+
import me.alllexey123.itmowidgets.ui.widgets.data.LessonListDataHolder
14+
import me.alllexey123.itmowidgets.ui.widgets.data.LessonListWidgetData
1315
import me.alllexey123.itmowidgets.workers.LessonWidgetUpdateWorker
1416

1517

@@ -32,15 +34,11 @@ class LessonListWidget : AppWidgetProvider() {
3234
context: Context,
3335
appWidgetManager: AppWidgetManager,
3436
appWidgetId: Int,
35-
lessons: List<SingleLessonData>,
37+
widgetData: LessonListWidgetData,
3638
layoutId: Int,
37-
rowLayoutId: Int,
38-
fullDayEmpty: Boolean,
3939
onlyDataChanged: Boolean
4040
) {
41-
LessonRepository.setLessons(lessons)
42-
LessonRepository.rowLayoutId = rowLayoutId
43-
LessonRepository.bonusLayoutId = if (fullDayEmpty) R.layout.item_lesson_list_empty else R.layout.item_lesson_list_no_more
41+
LessonListDataHolder.setData(widgetData)
4442

4543
if (!onlyDataChanged){
4644
val intent = Intent(context, LessonListWidgetService::class.java).apply {

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/LessonListWidgetService.kt

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import android.widget.RemoteViews
77
import android.widget.RemoteViewsService
88
import androidx.core.content.ContextCompat
99
import me.alllexey123.itmowidgets.R
10+
import me.alllexey123.itmowidgets.ui.widgets.data.LessonListDataHolder
11+
import me.alllexey123.itmowidgets.ui.widgets.data.LessonListWidgetData
12+
import me.alllexey123.itmowidgets.ui.widgets.data.LessonListWidgetEntry
1013
import me.alllexey123.itmowidgets.util.ScheduleUtils
1114

1215

@@ -17,9 +20,7 @@ class LessonListWidgetService : RemoteViewsService() {
1720

1821
class ViewsFactory(private val context: Context) : RemoteViewsFactory {
1922

20-
private var lessons: List<SingleLessonData> = emptyList()
21-
private var rowLayoutId: Int = R.layout.single_lesson_widget_dot
22-
private var bonusLayoutId: Int = R.layout.item_lesson_list_empty
23+
private var data: LessonListWidgetData = LessonListDataHolder.getData()
2324

2425
override fun onCreate() {
2526
loadData()
@@ -30,50 +31,48 @@ class LessonListWidgetService : RemoteViewsService() {
3031
}
3132

3233
private fun loadData() {
33-
lessons = LessonRepository.getLessons()
34-
rowLayoutId = LessonRepository.rowLayoutId
35-
bonusLayoutId = LessonRepository.bonusLayoutId
34+
data = LessonListDataHolder.getData()
3635
}
3736

38-
override fun getCount(): Int = lessons.size + 1
37+
override fun getCount(): Int = data.entries.size
3938

4039
override fun getViewAt(position: Int): RemoteViews? {
41-
var rv: RemoteViews
42-
if (lessons.isEmpty()) {
43-
rv = RemoteViews(context.packageName, bonusLayoutId)
44-
} else if (position >= lessons.size) {
45-
rv = RemoteViews(context.packageName, R.layout.item_lesson_list_end)
46-
} else {
47-
48-
val data = lessons[position]
49-
val views = RemoteViews(context.packageName, rowLayoutId)
50-
51-
views.setTextViewText(R.id.title, data.subject)
52-
views.setTextViewText(R.id.teacher, data.teacher)
53-
views.setTextViewText(R.id.location_room, data.room)
54-
views.setTextViewText(R.id.location_building, data.building)
55-
views.setTextViewText(R.id.more_lessons_text, data.moreLessonsText)
56-
57-
views.setViewVisibility(R.id.teacher_layout, if (data.hideTeacher) View.GONE else View.VISIBLE)
58-
views.setViewVisibility(R.id.location_layout, if (data.hideLocation) View.GONE else View.VISIBLE)
59-
views.setViewVisibility(R.id.time_layout, if (data.hideTime) View.GONE else View.VISIBLE)
60-
views.setViewVisibility(R.id.more_lessons_layout, if (data.hideMoreLessonsText) View.GONE else View.VISIBLE)
61-
62-
views.setTextViewText(R.id.time, data.times)
63-
64-
val colorId = ScheduleUtils.getWorkTypeColor(data.workTypeId)
65-
views.setInt(R.id.type_indicator, "setColorFilter", ContextCompat.getColor(context, colorId))
66-
67-
rv = views
40+
val entry = data.entries[position]
41+
42+
val rv = RemoteViews(context.packageName, entry.layoutId)
43+
44+
if (entry is LessonListWidgetEntry.LessonData) {
45+
rv.apply {
46+
setTextViewText(R.id.title, entry.subject)
47+
setTextViewText(R.id.teacher, entry.teacher)
48+
setTextViewText(R.id.time, entry.times)
49+
50+
setTextViewText(R.id.title, entry.subject)
51+
setTextViewText(R.id.teacher, entry.teacher)
52+
val roomText = if (entry.building == null) entry.room else entry.room?.let { room -> "${room}, " }
53+
setTextViewText(R.id.location_room, roomText)
54+
setTextViewText(R.id.location_building, entry.building)
55+
setTextViewText(R.id.time, entry.times)
56+
57+
setViewVisibility(R.id.teacher_layout, if (entry.teacher.isNullOrEmpty()) View.GONE else View.VISIBLE)
58+
val hideLocation = roomText.isNullOrEmpty() && entry.building.isNullOrEmpty()
59+
setViewVisibility(R.id.location_layout, if (hideLocation) View.GONE else View.VISIBLE)
60+
setViewVisibility(R.id.time_layout, if (entry.times.isNullOrEmpty()) View.GONE else View.VISIBLE)
61+
62+
// Set the color indicator.
63+
val color = ScheduleUtils.getWorkTypeColor(entry.workTypeId)
64+
setInt(R.id.type_indicator, "setColorFilter", ContextCompat.getColor(context, color))
65+
}
6866
}
67+
6968
val fillInIntent = Intent()
7069
rv.setOnClickFillInIntent(R.id.item_root, fillInIntent)
7170

7271
return rv
7372
}
7473

7574
override fun getLoadingView(): RemoteViews? = null
76-
override fun getViewTypeCount(): Int = 2
75+
override fun getViewTypeCount(): Int = 3
7776
override fun hasStableIds(): Boolean = true
7877
override fun getItemId(position: Int): Long = position.toLong()
7978
override fun onDestroy() {}

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/LessonRepository.kt

Lines changed: 0 additions & 20 deletions
This file was deleted.

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/SingleLessonData.kt

Lines changed: 0 additions & 8 deletions
This file was deleted.

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/SingleLessonWidget.kt

Lines changed: 17 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import android.content.Context
66
import android.view.View
77
import android.widget.RemoteViews
88
import androidx.core.content.ContextCompat
9-
import api.myitmo.model.Lesson
109
import me.alllexey123.itmowidgets.R
11-
import me.alllexey123.itmowidgets.util.PreferencesStorage
10+
import me.alllexey123.itmowidgets.ui.widgets.data.SingleLessonWidgetData
1211
import me.alllexey123.itmowidgets.util.ScheduleUtils
1312
import me.alllexey123.itmowidgets.workers.LessonWidgetUpdateWorker
1413

@@ -31,80 +30,27 @@ open class SingleLessonWidget : AppWidgetProvider() {
3130
}
3231

3332
companion object {
34-
internal fun widgetData(lesson: Lesson, moreLessons: Int?, till: String?, storage: PreferencesStorage): SingleLessonData {
35-
val startTime = lesson.timeStart
36-
val endTime = lesson.timeEnd
37-
val building = lesson.building
38-
val shortBuilding = if (building == null) "" else ScheduleUtils.shortenBuildingName(building)
39-
val room = if (lesson.room == null) "нет кабинета" else ScheduleUtils.shortenRoom(lesson.room!!) + ", "
40-
val moreLessonsText =
41-
if (moreLessons == null || moreLessons <= 0) "это последняя пара на сегодня" else "и ещё $moreLessons " +
42-
ScheduleUtils.lessonDeclension(moreLessons) +
43-
" до $till"
44-
45-
return SingleLessonData(
46-
subject = lesson.subject ?: "Неизвестная дисциплина",
47-
times = "$startTime - $endTime",
48-
teacher = lesson.teacherName ?: "",
49-
workTypeId = lesson.workTypeId,
50-
room = room,
51-
building = shortBuilding ?: "",
52-
moreLessonsText = moreLessonsText,
53-
hideTeacher = lesson.teacherName == null || storage.getHideTeacherState(),
54-
hideLocation = false,
55-
hideTime = false,
56-
hideMoreLessonsText = till == null
57-
)
58-
59-
}
60-
61-
fun noLessonsWidgetData(): SingleLessonData {
62-
return SingleLessonData(
63-
subject = "Сегодня нет пар",
64-
workTypeId = -1,
65-
hideTeacher = true, hideLocation = true, hideTime = true, hideMoreLessonsText = true
66-
)
67-
}
68-
69-
internal fun noLeftLessonsWidgetData(): SingleLessonData {
70-
return SingleLessonData(
71-
subject = "Сегодня больше нет пар",
72-
workTypeId = -1,
73-
hideTeacher = true, hideLocation = true, hideTime = true, hideMoreLessonsText = true
74-
)
75-
}
76-
77-
fun errorLessonWidgetData(): SingleLessonData {
78-
return SingleLessonData(
79-
subject = "Ошибка при получении данных",
80-
workTypeId = 0,
81-
hideTeacher = true, hideLocation = true, hideTime = true, hideMoreLessonsText = true
82-
)
83-
}
84-
8533
fun updateAppWidget(
8634
context: Context,
8735
appWidgetManager: AppWidgetManager,
8836
appWidgetId: Int,
89-
data: SingleLessonData,
90-
layoutId: Int
37+
widgetData: SingleLessonWidgetData
9138
) {
92-
val views = RemoteViews(context.packageName, layoutId)
93-
94-
views.setTextViewText(R.id.title, data.subject)
95-
views.setTextViewText(R.id.teacher, data.teacher)
96-
views.setTextViewText(R.id.location_room, data.room)
97-
views.setTextViewText(R.id.location_building, data.building)
98-
views.setTextViewText(R.id.more_lessons_text, data.moreLessonsText)
99-
views.setViewVisibility(R.id.teacher_layout, if (data.hideTeacher) View.GONE else View.VISIBLE)
100-
views.setViewVisibility(R.id.location_layout, if (data.hideLocation) View.GONE else View.VISIBLE)
101-
views.setViewVisibility(R.id.time_layout, if (data.hideTime) View.GONE else View.VISIBLE)
102-
views.setViewVisibility(R.id.more_lessons_layout, if (data.hideMoreLessonsText) View.GONE else View.VISIBLE)
103-
104-
views.setTextViewText(R.id.time, data.times)
105-
106-
val colorId = ScheduleUtils.getWorkTypeColor(data.workTypeId)
107-
39+
val views = RemoteViews(context.packageName, widgetData.layoutId)
40+
41+
views.setTextViewText(R.id.title, widgetData.subject)
42+
views.setTextViewText(R.id.teacher, widgetData.teacher)
43+
val roomText = if (widgetData.building == null) widgetData.room else widgetData.room?.let { room -> "${room}, " }
44+
views.setTextViewText(R.id.location_room, roomText)
45+
views.setTextViewText(R.id.location_building, widgetData.building)
46+
views.setTextViewText(R.id.time, widgetData.times)
47+
views.setTextViewText(R.id.more_lessons_text, widgetData.moreLessonsText)
48+
views.setViewVisibility(R.id.teacher_layout, if (widgetData.teacher == null) View.GONE else View.VISIBLE)
49+
views.setViewVisibility(R.id.location_layout, if (widgetData.room == null && widgetData.building == null) View.GONE else View.VISIBLE)
50+
views.setViewVisibility(R.id.time_layout, if (widgetData.times == null) View.GONE else View.VISIBLE)
51+
views.setViewVisibility(R.id.more_lessons_layout, if (widgetData.moreLessonsText == null) View.GONE else View.VISIBLE)
52+
53+
val colorId = ScheduleUtils.getWorkTypeColor(widgetData.workTypeId)
10854
views.setInt(
10955
R.id.type_indicator, "setColorFilter",
11056
ContextCompat.getColor(context, colorId)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package me.alllexey123.itmowidgets.ui.widgets.data
2+
3+
object LessonListDataHolder {
4+
@Volatile
5+
private var data: LessonListWidgetData = LessonListWidgetData(
6+
listOf(LessonListWidgetEntry.LessonListEnd)
7+
)
8+
9+
fun setData(newData: LessonListWidgetData) {
10+
data = newData
11+
}
12+
13+
fun getData(): LessonListWidgetData = data
14+
}

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/data/LessonListWidgetEntry.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package me.alllexey123.itmowidgets.ui.widgets.data
33
import me.alllexey123.itmowidgets.R
44

55
sealed class LessonListWidgetEntry(open val layoutId: Int) {
6-
object Error : LessonListWidgetEntry(R.layout.item_lesson_list_empty) // todo: Error
6+
object Error : LessonListWidgetEntry(R.layout.item_lesson_list_error)
77
object FullDayEmpty : LessonListWidgetEntry(R.layout.item_lesson_list_empty)
88
object NoMoreLessons : LessonListWidgetEntry(R.layout.item_lesson_list_no_more)
99
object LessonListEnd : LessonListWidgetEntry(R.layout.item_lesson_list_end)

app/src/main/java/me/alllexey123/itmowidgets/ui/widgets/data/LessonWidgetDataManager.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class LessonWidgetDataManager(
8686

8787
val lessonsToShow = if (hidePrevious) {
8888
val startFrom = getLessonToShow(lessons)
89-
lessons.drop(lessons.indexOf(startFrom))
89+
if (startFrom == null) listOf()
90+
else lessons.drop(lessons.indexOf(startFrom))
9091
} else lessons
9192

9293
return if (lessonsToShow.isEmpty()) {
@@ -146,15 +147,16 @@ class LessonWidgetDataManager(
146147
val beforehandScheduling = storage.getBeforehandSchedulingState()
147148
val now = LocalDateTime.now()
148149

149-
val currOrNext = ScheduleUtils.findCurrentOrNextLesson(lessons, now)
150+
val found = ScheduleUtils.findCurrentOrNextLesson(lessons, now)
150151
val lesson = if (beforehandScheduling) {
151152
val nowWithBeforehand = now.plusSeconds(BEFOREHAND_SCHEDULING_OFFSET)
152-
val currOrNextWithBeforehand =
153+
if (nowWithBeforehand.toLocalDate() != now.toLocalDate()) return found
154+
val foundWithBeforehand =
153155
ScheduleUtils.findCurrentOrNextLesson(lessons, nowWithBeforehand)
154156

155-
currOrNextWithBeforehand ?: currOrNext
157+
foundWithBeforehand ?: found
156158
} else {
157-
currOrNext
159+
found
158160
}
159161
return lesson
160162
}

0 commit comments

Comments
 (0)