Skip to content

Commit 5cde404

Browse files
committed
add last comments and comment search to comment selection dialog
1 parent c14ff7e commit 5cde404

21 files changed

Lines changed: 319 additions & 194 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.example.util.simpletimetracker.core.interactor
2+
3+
import com.example.util.simpletimetracker.core.R
4+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
5+
import com.example.util.simpletimetracker.domain.favourite.interactor.FavouriteCommentInteractor
6+
import com.example.util.simpletimetracker.domain.record.interactor.RecordInteractor
7+
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
8+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
9+
import com.example.util.simpletimetracker.feature_base_adapter.recordComment.RecordCommentViewData
10+
import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
11+
import javax.inject.Inject
12+
13+
class RecordCommentSearchViewDataInteractor @Inject constructor(
14+
private val resourceRepo: ResourceRepo,
15+
private val recordInteractor: RecordInteractor,
16+
private val favouriteCommentInteractor: FavouriteCommentInteractor,
17+
private val runningRecordInteractor: RunningRecordInteractor,
18+
) {
19+
20+
suspend fun getSearchData(
21+
comment: String,
22+
): List<ViewHolderType> {
23+
return if (comment.isNotEmpty()) {
24+
recordInteractor.searchComment(comment)
25+
.asSequence()
26+
.sortedByDescending { it.timeStarted }
27+
.map { it.comment }
28+
.toSet()
29+
.mapNotNull {
30+
if (it == comment) return@mapNotNull null
31+
RecordCommentViewData.Last(it)
32+
}
33+
.takeUnless { it.isEmpty() }
34+
?.let {
35+
HintViewData(
36+
text = resourceRepo.getString(R.string.change_record_similar_comments_hint),
37+
).let(::listOf) + it
38+
}.orEmpty()
39+
} else {
40+
emptyList()
41+
}
42+
}
43+
44+
suspend fun getFavouriteData(
45+
46+
): List<ViewHolderType> {
47+
return favouriteCommentInteractor.getAll()
48+
.map { RecordCommentViewData.Favourite(it.comment) }
49+
.takeUnless { it.isEmpty() }
50+
?.let {
51+
HintViewData(
52+
text = resourceRepo.getString(R.string.change_record_favourite_comments_hint),
53+
).let(::listOf) + it
54+
}.orEmpty()
55+
}
56+
57+
suspend fun getLastCommentsData(
58+
typeId: Long,
59+
): List<ViewHolderType> {
60+
data class Data(val timeStarted: Long, val comment: String)
61+
62+
val records = recordInteractor.getByTypeWithAnyComment(listOf(typeId))
63+
.map { Data(it.timeStarted, it.comment) }
64+
val runningRecords = runningRecordInteractor.getAll()
65+
.filter { it.id == typeId && it.comment.isNotEmpty() }
66+
.map { Data(it.timeStarted, it.comment) }
67+
68+
return (records + runningRecords)
69+
.asSequence()
70+
.sortedByDescending { it.timeStarted }
71+
.map { it.comment }
72+
.toSet()
73+
.take(LAST_COMMENTS_TO_SHOW)
74+
.map { RecordCommentViewData.Last(it) }
75+
.takeUnless { it.isEmpty() }
76+
?.let {
77+
HintViewData(
78+
text = resourceRepo.getString(R.string.change_record_last_comments_hint),
79+
).let(::listOf) + it
80+
}.orEmpty()
81+
}
82+
83+
companion object {
84+
private const val LAST_COMMENTS_TO_SHOW = 20
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.example.util.simpletimetracker.feature_base_adapter.commentField
2+
3+
import android.text.TextWatcher
4+
import androidx.core.widget.doAfterTextChanged
5+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
6+
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
7+
import com.example.util.simpletimetracker.feature_views.extension.setMargins
8+
import com.example.util.simpletimetracker.feature_base_adapter.commentField.CommentFieldViewData as ViewData
9+
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemCommentFieldBinding as Binding
10+
11+
fun createCommentFieldAdapterDelegate(
12+
afterTextChange: (String) -> Unit,
13+
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
14+
Binding::inflate,
15+
) { binding, item, _ ->
16+
17+
with(binding) {
18+
item as ViewData
19+
20+
if (item.text != null &&
21+
item.text != etCommentItemField.text.toString()
22+
) {
23+
etCommentItemField.setText(item.text)
24+
}
25+
inputCommentField.setMargins(
26+
top = item.marginTopDp,
27+
start = item.marginHorizontal,
28+
end = item.marginHorizontal,
29+
)
30+
etCommentItemField.removeTextChangedListener(textWatcher)
31+
textWatcher = etCommentItemField.doAfterTextChanged { afterTextChange(it.toString()) }
32+
}
33+
}
34+
35+
data class CommentFieldViewData(
36+
val id: Long,
37+
val text: String?,
38+
val marginTopDp: Int,
39+
val marginHorizontal: Int,
40+
) : ViewHolderType {
41+
42+
override fun getUniqueId(): Long = id
43+
44+
override fun isValidType(other: ViewHolderType): Boolean =
45+
other is ViewData
46+
}
47+
48+
private var textWatcher: TextWatcher? = null

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/adapter/ChangeRecordCommentAdapterDelegate.kt renamed to features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordComment/RecordCommentAdapterDelegate.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.example.util.simpletimetracker.feature_change_record.adapter
1+
package com.example.util.simpletimetracker.feature_base_adapter.recordComment
22

33
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
44
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
55
import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith
6-
import com.example.util.simpletimetracker.feature_change_record.databinding.ChangeRecordCommentItemBinding as Binding
7-
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentViewData as ViewData
6+
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ChangeRecordCommentItemBinding as Binding
7+
import com.example.util.simpletimetracker.feature_base_adapter.recordComment.RecordCommentViewData as ViewData
88

9-
fun createChangeRecordCommentAdapterDelegate(
9+
fun createRecordCommentAdapterDelegate(
1010
onItemClick: ((ViewData) -> Unit),
1111
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
1212
Binding::inflate,
@@ -21,7 +21,7 @@ fun createChangeRecordCommentAdapterDelegate(
2121
}
2222
}
2323

24-
sealed class ChangeRecordCommentViewData : ViewHolderType {
24+
sealed class RecordCommentViewData : ViewHolderType {
2525

2626
abstract val text: String
2727

features/feature_change_record/src/main/res/layout/change_record_comment_item.xml renamed to features/feature_base_adapter/src/main/res/layout/change_record_comment_item.xml

File renamed without changes.

features/feature_records_filter/src/main/res/layout/item_records_filter_comment.xml renamed to features/feature_base_adapter/src/main/res/layout/item_comment_field.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<com.google.android.material.textfield.TextInputLayout xmlns:android="http://schemas.android.com/apk/res/android"
3-
android:id="@+id/inputChangeRecordComment"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
android:id="@+id/inputCommentField"
45
style="@style/ChangeItemInputFieldDialog"
56
android:layout_width="match_parent"
67
android:layout_height="wrap_content"
7-
android:layout_marginTop="-2dp"
8-
android:layout_marginHorizontal="@dimen/edit_screen_margin_horizontal">
8+
tools:layout_marginHorizontal="@dimen/edit_screen_margin_horizontal">
99

1010
<com.google.android.material.textfield.TextInputEditText
11-
android:id="@+id/etRecordsFilterCommentItem"
11+
android:id="@+id/etCommentItemField"
1212
style="@style/EditTextMultiLine"
1313
android:layout_width="match_parent"
1414
android:layout_height="wrap_content"

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt

Lines changed: 5 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
package com.example.util.simpletimetracker.feature_change_record.interactor
22

3+
import com.example.util.simpletimetracker.core.interactor.RecordCommentSearchViewDataInteractor
34
import com.example.util.simpletimetracker.core.mapper.ColorMapper
45
import com.example.util.simpletimetracker.core.mapper.TimeMapper
56
import com.example.util.simpletimetracker.core.repo.ResourceRepo
67
import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView
78
import com.example.util.simpletimetracker.domain.favourite.interactor.FavouriteCommentInteractor
89
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
9-
import com.example.util.simpletimetracker.domain.record.interactor.RecordInteractor
10-
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
1110
import com.example.util.simpletimetracker.domain.record.model.Record
1211
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
1312
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
1413
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
15-
import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
1614
import com.example.util.simpletimetracker.feature_change_record.R
1715
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentFieldViewData
18-
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentViewData
1916
import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper
2017
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordDateTimeFieldsState
2118
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData
@@ -25,13 +22,12 @@ class ChangeRecordViewDataInteractor @Inject constructor(
2522
private val prefsInteractor: PrefsInteractor,
2623
private val recordTypeInteractor: RecordTypeInteractor,
2724
private val recordTagInteractor: RecordTagInteractor,
28-
private val recordInteractor: RecordInteractor,
29-
private val runningRecordInteractor: RunningRecordInteractor,
3025
private val favouriteCommentInteractor: FavouriteCommentInteractor,
3126
private val changeRecordViewDataMapper: ChangeRecordViewDataMapper,
3227
private val resourceRepo: ResourceRepo,
3328
private val timeMapper: TimeMapper,
3429
private val colorMapper: ColorMapper,
30+
private val recordCommentSearchViewDataInteractor: RecordCommentSearchViewDataInteractor,
3531
) {
3632

3733
suspend fun getPreviewViewData(
@@ -65,8 +61,6 @@ class ChangeRecordViewDataInteractor @Inject constructor(
6561
typeId: Long,
6662
fromCommentChange: Boolean,
6763
): List<ViewHolderType> {
68-
data class Data(val timeStarted: Long, val comment: String)
69-
7064
val items = mutableListOf<ViewHolderType>()
7165
val isDarkTheme = prefsInteractor.getDarkMode()
7266
val isFavourite = favouriteCommentInteractor.get(comment) != null
@@ -83,58 +77,9 @@ class ChangeRecordViewDataInteractor @Inject constructor(
8377
},
8478
).let(items::add)
8579

86-
val searchResults = if (comment.isNotEmpty()) {
87-
recordInteractor.searchComment(comment)
88-
.asSequence()
89-
.sortedByDescending { it.timeStarted }
90-
.map { it.comment }
91-
.toSet()
92-
.mapNotNull {
93-
if (it == comment) return@mapNotNull null
94-
ChangeRecordCommentViewData.Last(it)
95-
}
96-
.takeUnless { it.isEmpty() }
97-
?.let {
98-
HintViewData(
99-
text = resourceRepo.getString(R.string.change_record_similar_comments_hint),
100-
).let(::listOf) + it
101-
}.orEmpty()
102-
} else {
103-
emptyList()
104-
}
105-
106-
val favouriteComments = favouriteCommentInteractor.getAll()
107-
.map { ChangeRecordCommentViewData.Favourite(it.comment) }
108-
.takeUnless { it.isEmpty() }
109-
?.let {
110-
HintViewData(
111-
text = resourceRepo.getString(R.string.change_record_favourite_comments_hint),
112-
).let(::listOf) + it
113-
}.orEmpty()
114-
115-
val records = recordInteractor.getByTypeWithAnyComment(listOf(typeId))
116-
.map { Data(it.timeStarted, it.comment) }
117-
val runningRecords = runningRecordInteractor.getAll()
118-
.filter { it.id == typeId && it.comment.isNotEmpty() }
119-
.map { Data(it.timeStarted, it.comment) }
120-
121-
val lastComments = (records + runningRecords)
122-
.asSequence()
123-
.sortedByDescending { it.timeStarted }
124-
.map { it.comment }
125-
.toSet()
126-
.take(LAST_COMMENTS_TO_SHOW)
127-
.map { ChangeRecordCommentViewData.Last(it) }
128-
.takeUnless { it.isEmpty() }
129-
?.let {
130-
HintViewData(
131-
text = resourceRepo.getString(R.string.change_record_last_comments_hint),
132-
).let(::listOf) + it
133-
}.orEmpty()
134-
135-
items += searchResults
136-
items += favouriteComments
137-
items += lastComments
80+
items += recordCommentSearchViewDataInteractor.getSearchData(comment)
81+
items += recordCommentSearchViewDataInteractor.getFavouriteData()
82+
items += recordCommentSearchViewDataInteractor.getLastCommentsData(typeId)
13883

13984
return items
14085
}
@@ -171,8 +116,4 @@ class ChangeRecordViewDataInteractor @Inject constructor(
171116
showSeconds = showSeconds,
172117
)
173118
}
174-
175-
companion object {
176-
private const val LAST_COMMENTS_TO_SHOW = 20
177-
}
178119
}

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordCore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import com.example.util.simpletimetracker.feature_change_record.R
3333
import com.example.util.simpletimetracker.feature_base_adapter.button.createButtonAdapterDelegate
3434
import com.example.util.simpletimetracker.feature_base_adapter.category.createCategoryShowAllAdapterDelegate
3535
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordChangePreviewAdapterDelegate
36-
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordCommentAdapterDelegate
36+
import com.example.util.simpletimetracker.feature_base_adapter.recordComment.createRecordCommentAdapterDelegate
3737
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordCommentFieldAdapterDelegate
3838
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordSliderAdapterDelegate
3939
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordTimeAdjustmentAdapterDelegate
@@ -96,7 +96,7 @@ class ChangeRecordCore(
9696
afterTextChange = viewModel::onCommentChange,
9797
onFavouriteClick = viewModel::onFavouriteCommentClick,
9898
),
99-
createChangeRecordCommentAdapterDelegate(
99+
createRecordCommentAdapterDelegate(
100100
onItemClick = viewModel::onCommentClick,
101101
),
102102
)

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.category.Category
2525
import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData
2626
import com.example.util.simpletimetracker.feature_change_record.R
2727
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData
28-
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentViewData
28+
import com.example.util.simpletimetracker.feature_base_adapter.recordComment.RecordCommentViewData
2929
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordSliderViewData
3030
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeAdjustmentViewData
3131
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeDoublePreviewViewData
@@ -349,7 +349,7 @@ abstract class ChangeRecordBaseViewModel(
349349
updateCategoriesViewData()
350350
}
351351

352-
fun onCommentClick(item: ChangeRecordCommentViewData) {
352+
fun onCommentClick(item: RecordCommentViewData) {
353353
viewModelScope.launch {
354354
if (item.text != newComment) {
355355
newComment = item.text

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/recordTagSelection/RecordTagSelectionDialogFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.view.ViewGroup
77
import androidx.fragment.app.commit
88
import com.example.util.simpletimetracker.core.base.BaseBottomSheetFragment
99
import com.example.util.simpletimetracker.core.dialog.OnTagSelectedListener
10+
import com.example.util.simpletimetracker.core.extension.blockContentScroll
1011
import com.example.util.simpletimetracker.core.extension.setSkipCollapsed
1112
import com.example.util.simpletimetracker.core.utils.fragmentArgumentDelegate
1213
import com.example.util.simpletimetracker.feature_dialogs.R
@@ -36,6 +37,7 @@ class RecordTagSelectionDialogFragment :
3637

3738
override fun initDialog() {
3839
setSkipCollapsed()
40+
// TODO block content scroll
3941
}
4042

4143
override fun initUi() {

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterCommentAdapterDelegate.kt

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

0 commit comments

Comments
 (0)