Skip to content

Commit a59fdfc

Browse files
committed
add search on main
1 parent 25e2168 commit a59fdfc

File tree

50 files changed

+313
-40
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+313
-40
lines changed

app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.example.util.simpletimetracker.domain.base.DurationFormat
2525
import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
2626
import com.example.util.simpletimetracker.domain.extension.padDuration
2727
import com.example.util.simpletimetracker.domain.language.AppLanguage
28+
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggestion.RecordTypeSuggestionViewData
2829
import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker
2930
import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker
3031
import com.example.util.simpletimetracker.utils.BaseUiTest
@@ -50,6 +51,7 @@ import com.example.util.simpletimetracker.utils.recyclerItemCount
5051
import com.example.util.simpletimetracker.utils.tryAction
5152
import com.example.util.simpletimetracker.utils.typeTextIntoView
5253
import com.example.util.simpletimetracker.utils.withPluralText
54+
import com.example.util.simpletimetracker.utils.withTag
5355
import dagger.hilt.android.testing.HiltAndroidTest
5456
import kotlinx.coroutines.runBlocking
5557
import org.hamcrest.CoreMatchers.allOf
@@ -2729,6 +2731,124 @@ class SettingsTest : BaseUiTest() {
27292731
checkRunningMark(false)
27302732
}
27312733

2734+
@Test
2735+
fun searchOnMain() {
2736+
val name1 = "TypeName1"
2737+
val name2 = "TypeName2"
2738+
val name3 = "TypeName3"
2739+
val name4 = "LoWeRcAsE"
2740+
val filter1 = "Filter1"
2741+
val filter2 = "Filter2"
2742+
2743+
// Add data
2744+
runBlocking { prefsInteractor.setShowActivityFilters(true) }
2745+
testUtils.addActivity(name1)
2746+
testUtils.addActivity(name2)
2747+
testUtils.addActivity(name3)
2748+
testUtils.addActivity(name4)
2749+
testUtils.addActivityFilter(filter1)
2750+
testUtils.addActivityFilter(filter2)
2751+
testUtils.addSuggestion(name1, listOf(name2, name3))
2752+
testUtils.addShortcut(name1)
2753+
testUtils.addShortcut(name2)
2754+
testUtils.addRecord(name1) // for suggests
2755+
Thread.sleep(1000)
2756+
2757+
fun checkType(name: String, isVisible: Boolean) {
2758+
val matcher = allOf(
2759+
withId(R.id.viewRecordTypeItem),
2760+
withTag(null),
2761+
hasDescendant(withText(name)),
2762+
)
2763+
if (isVisible) checkViewIsDisplayed(matcher) else checkViewDoesNotExist(matcher)
2764+
}
2765+
2766+
fun checkFilter(name: String, isVisible: Boolean) {
2767+
val matcher = allOf(
2768+
withId(R.id.viewActivityFilterItem),
2769+
hasDescendant(withText(name)),
2770+
)
2771+
if (isVisible) checkViewIsDisplayed(matcher) else checkViewDoesNotExist(matcher)
2772+
}
2773+
2774+
fun checkSuggestion(name: String, isVisible: Boolean) {
2775+
val matcher = allOf(
2776+
withId(R.id.viewRecordTypeItem),
2777+
withTag(RecordTypeSuggestionViewData.TEST_TAG),
2778+
hasDescendant(withText(name)),
2779+
)
2780+
if (isVisible) checkViewIsDisplayed(matcher) else checkViewDoesNotExist(matcher)
2781+
}
2782+
2783+
// Setting disabled
2784+
checkType(name1, true)
2785+
checkType(name2, true)
2786+
checkType(name3, true)
2787+
checkFilter(filter1, true)
2788+
checkFilter(filter2, true)
2789+
checkSuggestion(name2, true)
2790+
checkSuggestion(name3, true)
2791+
checkViewDoesNotExist(withId(R.id.etCommentItemField))
2792+
2793+
// Change setting
2794+
NavUtils.openSettingsScreen()
2795+
NavUtils.openSettingsDisplay()
2796+
scrollSettingsRecyclerToText(coreR.string.settings_enable_search_on_main)
2797+
checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_enable_search_on_main))
2798+
clickOnSettingsCheckboxBesideText(coreR.string.settings_enable_search_on_main)
2799+
checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_enable_search_on_main))
2800+
2801+
NavUtils.openRunningRecordsScreen()
2802+
checkType(name1, true)
2803+
checkType(name2, true)
2804+
checkType(name3, true)
2805+
checkFilter(filter1, true)
2806+
checkFilter(filter2, true)
2807+
checkSuggestion(name2, true)
2808+
checkSuggestion(name3, true)
2809+
checkViewIsDisplayed(withId(R.id.etCommentItemField))
2810+
2811+
// Check search
2812+
typeTextIntoView(R.id.etCommentItemField, "2")
2813+
Thread.sleep(500)
2814+
checkType(name1, false)
2815+
checkType(name2, true)
2816+
checkType(name3, false)
2817+
checkFilter(filter1, false)
2818+
checkFilter(filter2, true)
2819+
checkSuggestion(name2, true)
2820+
checkSuggestion(name3, false)
2821+
2822+
// Check when search entered but setting disabled
2823+
NavUtils.openSettingsScreen()
2824+
checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_enable_search_on_main))
2825+
clickOnSettingsCheckboxBesideText(coreR.string.settings_enable_search_on_main)
2826+
checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_enable_search_on_main))
2827+
2828+
NavUtils.openRunningRecordsScreen()
2829+
checkType(name1, true)
2830+
checkType(name2, true)
2831+
checkType(name3, true)
2832+
checkFilter(filter1, true)
2833+
checkFilter(filter2, true)
2834+
checkSuggestion(name2, true)
2835+
checkSuggestion(name3, true)
2836+
checkViewDoesNotExist(withId(R.id.etCommentItemField))
2837+
2838+
// Check lowercase
2839+
NavUtils.openSettingsScreen()
2840+
clickOnSettingsCheckboxBesideText(coreR.string.settings_enable_search_on_main)
2841+
checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_enable_search_on_main))
2842+
2843+
NavUtils.openRunningRecordsScreen()
2844+
typeTextIntoView(R.id.etCommentItemField, "lowercase")
2845+
Thread.sleep(500)
2846+
checkType(name1, false)
2847+
checkType(name2, false)
2848+
checkType(name3, false)
2849+
checkType(name4, true)
2850+
}
2851+
27322852
@Test
27332853
fun retroactiveMode() {
27342854
NavUtils.openSettingsScreen()

app/src/androidTest/java/com/example/util/simpletimetracker/utils/Matchers.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ fun withButtonColor(expectedId: Int): Matcher<View> =
6363
}
6464
}
6565

66-
fun withTag(tagValueMatcher: Any): Matcher<View> =
66+
fun withTag(tagValueMatcher: Any?): Matcher<View> =
6767
withTagValue(equalTo(tagValueMatcher))
6868

6969
fun withNullTag(): Matcher<View> {

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/mapper/DateSelectorMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class DateSelectorMapper @Inject constructor(
176176
DateSelectorSingleViewData(
177177
position = position,
178178
dayMonth = data.data.toViewData(),
179-
cardData = cardData,
179+
cardData = cardData.copy(isToday = false),
180180
)
181181
}
182182
}

core/src/main/java/com/example/util/simpletimetracker/core/interactor/ActivityFilterViewDataInteractor.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import com.example.util.simpletimetracker.domain.activityFilter.interactor.Prede
66
import com.example.util.simpletimetracker.domain.activityFilter.model.ActivityFilter
77
import com.example.util.simpletimetracker.domain.activityFilter.model.PredefinedFilter
88
import com.example.util.simpletimetracker.domain.category.interactor.RecordTypeCategoryInteractor
9+
import com.example.util.simpletimetracker.domain.extension.search
910
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
1011
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
1112
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
1213
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
14+
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData
1315
import javax.inject.Inject
1416

1517
class ActivityFilterViewDataInteractor @Inject constructor(
@@ -33,6 +35,7 @@ class ActivityFilterViewDataInteractor @Inject constructor(
3335

3436
fun getFilterViewData(
3537
filter: Filter,
38+
searchText: String,
3639
isDarkTheme: Boolean,
3740
isFiltersCollapsed: Boolean,
3841
appendAddButton: Boolean,
@@ -52,14 +55,14 @@ class ActivityFilterViewDataInteractor @Inject constructor(
5255
isDarkTheme = isDarkTheme,
5356
selected = it.selected,
5457
)
55-
}
58+
}.search(searchText, { name })
5659
result += filter.userFilters.map {
5760
activityFilterViewDataMapper.mapFiltered(
5861
filter = it,
5962
isDarkTheme = isDarkTheme,
6063
selected = it.selected,
6164
)
62-
}
65+
}.search(searchText, { name })
6366
}
6467
// Show collapse button if there are several filters,
6568
// or if they are collapsed, just in case (collapse and then remove all but one).

core/src/main/java/com/example/util/simpletimetracker/core/interactor/ActivitySuggestionViewDataInteractor.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package com.example.util.simpletimetracker.core.interactor
33
import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
44
import com.example.util.simpletimetracker.core.viewData.RecordTypeSuggestionType
55
import com.example.util.simpletimetracker.domain.activitySuggestion.interactor.GetCurrentActivitySuggestionsInteractor
6+
import com.example.util.simpletimetracker.domain.extension.search
67
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
78
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
89
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
10+
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData
911
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggestion.RecordTypeSuggestionViewData
1012
import javax.inject.Inject
1113

@@ -20,6 +22,7 @@ class ActivitySuggestionViewDataInteractor @Inject constructor(
2022
runningRecords: List<RunningRecord>,
2123
allDailyCurrents: Map<Long, GetCurrentRecordsDurationInteractor.Result>,
2224
completeTypeIds: Set<Long>,
25+
searchText: String,
2326
numberOfCards: Int,
2427
isDarkTheme: Boolean,
2528
): List<RecordTypeSuggestionViewData> {
@@ -45,6 +48,9 @@ class ActivitySuggestionViewDataInteractor @Inject constructor(
4548
type = RecordTypeSuggestionType,
4649
)
4750
}
48-
}
51+
}.search(
52+
text = searchText,
53+
searchableContent = { data.name },
54+
)
4955
}
5056
}

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordsShortcutsViewDataInteractor.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.example.util.simpletimetracker.core.interactor
22

33
import com.example.util.simpletimetracker.core.mapper.RecordShortcutViewDataMapper
4+
import com.example.util.simpletimetracker.domain.extension.search
45
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
56
import com.example.util.simpletimetracker.domain.recordShortcut.interactor.RecordShortcutInteractor
67
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
78
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
9+
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData
810
import com.example.util.simpletimetracker.feature_base_adapter.recordShortcut.RecordShortcutViewData
911
import javax.inject.Inject
1012

@@ -19,6 +21,7 @@ class RecordsShortcutsViewDataInteractor @Inject constructor(
1921
recordTypesMap: Map<Long, RecordType>,
2022
recordTags: List<RecordTag>,
2123
runningRecords: List<RunningRecord>,
24+
searchText: String,
2225
isDarkTheme: Boolean,
2326
): List<RecordShortcutViewData> {
2427
val shortcuts = recordShortcutInteractor.getAll()
@@ -42,6 +45,9 @@ class RecordsShortcutsViewDataInteractor @Inject constructor(
4245
isDarkTheme = isDarkTheme,
4346
isFiltered = isRunning,
4447
)
45-
}
48+
}.search(
49+
text = searchText,
50+
searchableContent = { data.name },
51+
)
4652
}
4753
}

core/src/main/java/com/example/util/simpletimetracker/core/utils/ViewUtis.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import android.view.View
44
import androidx.cardview.widget.CardView
55
import androidx.recyclerview.widget.RecyclerView
66
import com.example.util.simpletimetracker.core.R
7-
import com.example.util.simpletimetracker.domain.record.interactor.UpdateRunningRecordFromChangeScreenInteractor
8-
import com.example.util.simpletimetracker.domain.record.interactor.UpdateRunningRecordFromChangeScreenInteractor.GoalState
7+
import com.example.util.simpletimetracker.domain.record.interactor.UpdateRunningRecordsInteractor
8+
import com.example.util.simpletimetracker.domain.record.interactor.UpdateRunningRecordsInteractor.GoalState
99
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
1010
import com.example.util.simpletimetracker.feature_base_adapter.runningRecord.RunningRecordViewData
1111
import com.example.util.simpletimetracker.feature_views.GoalCheckmarkView.CheckState
@@ -32,7 +32,7 @@ fun View.setChooserColor(opened: Boolean) {
3232
fun updateRunningRecordPreview(
3333
currentList: List<ViewHolderType>,
3434
recyclerView: RecyclerView,
35-
update: UpdateRunningRecordFromChangeScreenInteractor.Update,
35+
update: UpdateRunningRecordsInteractor.Update,
3636
) {
3737
val itemIndex = currentList
3838
.indexOfFirst { it is RunningRecordViewData && it.id == update.id }

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupPrefsRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Compani
8686
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAG_ORDER
8787
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAG_ORDER_MANUAL
8888
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_DURATION_PRESENTATION_FORMAT
89+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_ENABLE_SEARCH_ON_MAIN
8990
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_HIDDEN_COMMENT_FILTERS
9091
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_POMODORO_SHOW_MORE_CONTROLS
9192
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TYPE_ADDITIONAL_FIELDS_SHOWN
@@ -190,6 +191,7 @@ class BackupPrefsRepo @Inject constructor(
190191
PrefsProcessor(KEY_SHOW_CATEGORIES_AS_PREDEFINED_FILTERS, ::showCategoriesAsPredefinedFilters),
191192
PrefsProcessor(KEY_SELECTED_PREDEFINED_FILTERS, ::selectedPredefinedFilters),
192193
PrefsProcessor(KEY_ENABLE_REPEAT_BUTTON, ::enableRepeatButton),
194+
PrefsProcessor(KEY_ENABLE_SEARCH_ON_MAIN, ::enableSearchOnMain),
193195
PrefsProcessor(KEY_ENABLE_POMODORO_MODE, ::enablePomodoroMode),
194196
PrefsProcessor(KEY_POMODORO_FOCUS_TIME, ::pomodoroFocusTime),
195197
PrefsProcessor(KEY_POMODORO_BREAK_TIME, ::pomodoroBreakTime),

data_local/src/main/java/com/example/util/simpletimetracker/data_local/prefs/PrefsRepoImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ class PrefsRepoImpl @Inject constructor(
205205
KEY_ENABLE_REPEAT_BUTTON, false,
206206
)
207207

208+
override var enableSearchOnMain: Boolean by prefs.delegate(
209+
KEY_ENABLE_SEARCH_ON_MAIN, false,
210+
)
211+
208212
override var enablePomodoroMode: Boolean by prefs.delegate(
209213
KEY_ENABLE_POMODORO_MODE, true,
210214
)
@@ -669,6 +673,7 @@ class PrefsRepoImpl @Inject constructor(
669673
const val KEY_SHOW_ACTIVITY_FILTERS = "showActivityFilters"
670674
const val KEY_IS_ACTIVITY_FILTERS_COLLAPSED = "isActivityFiltersCollapsed"
671675
const val KEY_ENABLE_REPEAT_BUTTON = "enableRepeatButton"
676+
const val KEY_ENABLE_SEARCH_ON_MAIN = "enableSearchOnMain"
672677
const val KEY_ENABLE_POMODORO_MODE = "enablePomodoroMode"
673678
const val KEY_POMODORO_FOCUS_TIME = "pomodoroFocusTime"
674679
const val KEY_POMODORO_BREAK_TIME = "pomodoroBreakTime"

domain/src/main/java/com/example/util/simpletimetracker/domain/extension/CollectionExtensions.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,15 @@ fun <T> List<T>.addBetweenEach(
6666
}
6767
}
6868
return result
69+
}
70+
71+
inline fun <T> List<T>.search(
72+
text: String,
73+
crossinline searchableContent: T.() -> String,
74+
): List<T> {
75+
return if (text.isNotEmpty()) {
76+
this.filter { text in it.searchableContent().lowercase() }
77+
} else {
78+
this
79+
}
6980
}

0 commit comments

Comments
 (0)