Skip to content

Commit 5a7a34a

Browse files
authored
Merge branch 'Razeeman:dev' into dev
2 parents 7cc5138 + 55224a4 commit 5a7a34a

125 files changed

Lines changed: 2526 additions & 286 deletions

File tree

Some content is hidden

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

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,41 @@ class ComplexRulesTest : BaseUiTest() {
394394
checkRunningRecord(byStartingAndCurrent3)
395395
}
396396

397+
@Test
398+
fun actionDisallowMultitaskingOnlyPreviousTypes() {
399+
val startingType = "startingType"
400+
val previousType = "previousType"
401+
val otherType = "otherType"
402+
403+
// Add data
404+
runBlocking { prefsInteractor.setAllowMultitasking(true) }
405+
testUtils.addActivity(startingType)
406+
testUtils.addActivity(previousType)
407+
testUtils.addActivity(otherType)
408+
Thread.sleep(1000)
409+
410+
testUtils.addComplexRule(
411+
action = ComplexRule.Action.DisallowMultitasking,
412+
actionDisallowOnlyPrevious = true,
413+
startingTypeNames = listOf(startingType),
414+
currentTypeNames = listOf(previousType),
415+
)
416+
417+
// Check
418+
clickOnViewWithText(previousType)
419+
clickOnViewWithText(otherType)
420+
checkRunningRecord(previousType)
421+
checkRunningRecord(otherType)
422+
clickOnViewWithText(startingType)
423+
424+
checkNoRunningRecord(previousType)
425+
checkRunningRecord(otherType)
426+
checkRunningRecord(startingType)
427+
428+
stopRunningRecord(otherType)
429+
stopRunningRecord(startingType)
430+
}
431+
397432
@Test
398433
fun assignTags() {
399434
val check1 = "check1"

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

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package com.example.util.simpletimetracker
22

33
import android.view.View
44
import androidx.test.espresso.Espresso.onView
5+
import androidx.test.espresso.contrib.PickerActions.setDate
56
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
67
import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
78
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
9+
import androidx.test.espresso.matcher.ViewMatchers.withClassName
810
import androidx.test.espresso.matcher.ViewMatchers.withId
911
import androidx.test.espresso.matcher.ViewMatchers.withSubstring
1012
import androidx.test.espresso.matcher.ViewMatchers.withText
@@ -22,12 +24,16 @@ import com.example.util.simpletimetracker.GoalsTestUtils.getMonthlyDurationGoal
2224
import com.example.util.simpletimetracker.GoalsTestUtils.getSessionDurationGoal
2325
import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyCountGoal
2426
import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyDurationGoal
27+
import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
2528
import com.example.util.simpletimetracker.domain.recordType.extension.value
2629
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
27-
import com.example.util.simpletimetracker.feature_change_record.R
30+
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
31+
import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker
2832
import com.example.util.simpletimetracker.utils.BaseUiTest
2933
import com.example.util.simpletimetracker.utils.NavUtils
3034
import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
35+
import com.example.util.simpletimetracker.utils.clickOnCurrentDate
36+
import com.example.util.simpletimetracker.utils.clickOnCurrentSelectedDate
3137
import com.example.util.simpletimetracker.utils.clickOnView
3238
import com.example.util.simpletimetracker.utils.clickOnViewWithId
3339
import com.example.util.simpletimetracker.utils.clickOnViewWithText
@@ -39,6 +45,7 @@ import com.example.util.simpletimetracker.utils.tryAction
3945
import dagger.hilt.android.testing.HiltAndroidTest
4046
import kotlinx.coroutines.runBlocking
4147
import org.hamcrest.CoreMatchers.allOf
48+
import org.hamcrest.CoreMatchers.equalTo
4249
import org.hamcrest.Matcher
4350
import org.junit.Test
4451
import org.junit.runner.RunWith
@@ -48,6 +55,8 @@ import com.example.util.simpletimetracker.feature_change_record_type.R as change
4855
import com.example.util.simpletimetracker.feature_goals.R as goalsR
4956
import com.example.util.simpletimetracker.feature_main.R as mainR
5057
import com.example.util.simpletimetracker.feature_statistics_detail.R as featureStatisticsDetailR
58+
import java.util.Calendar
59+
import java.util.concurrent.TimeUnit
5160

5261
@HiltAndroidTest
5362
@RunWith(AndroidJUnit4::class)
@@ -346,6 +355,103 @@ class GoalsTabTest : BaseUiTest() {
346355
checkStatisticsMark(goalMonthlyCountFinished, isVisible = true)
347356
}
348357

358+
@Test
359+
fun dateSelection() {
360+
val typeName = "typeName"
361+
362+
// Add data
363+
testUtils.addActivity(
364+
name = typeName,
365+
goals = listOf(
366+
getDailyDurationGoal(durationInSeconds),
367+
getMonthlyDurationGoal(2 * durationInSeconds),
368+
),
369+
)
370+
371+
val goalHint = getString(coreR.string.change_record_type_goal_time_hint).lowercase()
372+
val dailyGoalValue = "$goalHint - 10$minuteString"
373+
val monthlyGoalValue = "$goalHint - 20$minuteString"
374+
375+
val startOfDayShift = runBlocking { prefsInteractor.getStartOfDayShift() }
376+
val firstDayOfWeek = runBlocking { prefsInteractor.getFirstDayOfWeek() }
377+
378+
fun getRangeTitle(shift: Int, goalRange: RecordTypeGoal.Range): String {
379+
return getRangeTitle(shift, goalRange, startOfDayShift, firstDayOfWeek)
380+
}
381+
382+
val firstDayCalendar = Calendar.getInstance().apply {
383+
set(Calendar.DAY_OF_MONTH, 1)
384+
set(Calendar.HOUR_OF_DAY, 12)
385+
set(Calendar.MINUTE, 0)
386+
set(Calendar.SECOND, 0)
387+
set(Calendar.MILLISECOND, 0)
388+
}
389+
val firstDay = firstDayCalendar.timeInMillis
390+
val prevDay = Calendar.getInstance().apply {
391+
timeInMillis = firstDay
392+
add(Calendar.DATE, -1)
393+
}.timeInMillis
394+
395+
val shiftToFirstDay = timeMapper.toTimestampShift(
396+
toTime = firstDay,
397+
range = RangeLength.Day,
398+
firstDayOfWeek = firstDayOfWeek,
399+
).toInt()
400+
401+
val todayTitle = getRangeTitle(shift = shiftToFirstDay, goalRange = RecordTypeGoal.Range.Daily)
402+
val prevTitle = getRangeTitle(shift = shiftToFirstDay - 1, goalRange = RecordTypeGoal.Range.Daily)
403+
val todayMonthTitle = getRangeTitle(shift = 0, goalRange = RecordTypeGoal.Range.Monthly)
404+
val prevMonthTitle = getRangeTitle(shift = -1, goalRange = RecordTypeGoal.Range.Monthly)
405+
406+
testUtils.addRecord(
407+
typeName = typeName,
408+
timeStarted = firstDay,
409+
timeEnded = firstDay + TimeUnit.MINUTES.toMillis(1),
410+
)
411+
testUtils.addRecord(
412+
typeName = typeName,
413+
timeStarted = prevDay,
414+
timeEnded = prevDay + TimeUnit.MINUTES.toMillis(2),
415+
)
416+
417+
// Open goals
418+
NavUtils.openGoalsScreen()
419+
clickOnCurrentSelectedDate()
420+
onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform(
421+
setDate(
422+
firstDayCalendar.get(Calendar.YEAR),
423+
firstDayCalendar.get(Calendar.MONTH) + 1,
424+
firstDayCalendar.get(Calendar.DAY_OF_MONTH),
425+
),
426+
)
427+
clickOnViewWithId(R.id.btnDateTimeDialogPositive)
428+
429+
// Check first day
430+
tryAction {
431+
checkViewIsDisplayed(
432+
allOf(withId(baseR.id.tvHintItemText), withText(todayTitle)),
433+
)
434+
}
435+
checkViewIsDisplayed(
436+
allOf(withId(baseR.id.tvHintItemText), withText(todayMonthTitle)),
437+
)
438+
checkStatisticsGoal(typeName, "1$minuteString", dailyGoalValue)
439+
checkStatisticsGoal(typeName, "1$minuteString", monthlyGoalValue)
440+
441+
// Check prev day
442+
clickOnCurrentDate(shiftToFirstDay - 1)
443+
tryAction {
444+
checkViewIsDisplayed(
445+
allOf(withId(baseR.id.tvHintItemText), withText(prevTitle)),
446+
)
447+
}
448+
checkViewIsDisplayed(
449+
allOf(withId(baseR.id.tvHintItemText), withText(prevMonthTitle)),
450+
)
451+
checkStatisticsGoal(typeName, "2$minuteString", dailyGoalValue)
452+
checkStatisticsGoal(typeName, "2$minuteString", monthlyGoalValue)
453+
}
454+
349455
@Test
350456
fun goalNavigation() {
351457
val typeName = "typeName"
@@ -387,4 +493,18 @@ class GoalsTabTest : BaseUiTest() {
387493

388494
tryAction { scrollRecyclerToView(goalsR.id.rvGoalsList, allOf(matchers)) }
389495
}
496+
497+
private fun getRangeTitle(
498+
shift: Int,
499+
goalRange: RecordTypeGoal.Range,
500+
startOfDayShift: Long,
501+
firstDayOfWeek: DayOfWeek,
502+
): String {
503+
return when (goalRange) {
504+
is RecordTypeGoal.Range.Session -> ""
505+
is RecordTypeGoal.Range.Daily -> timeMapper.toDayDateTitle(shift, startOfDayShift)
506+
is RecordTypeGoal.Range.Weekly -> timeMapper.toWeekDateTitle(shift, startOfDayShift, firstDayOfWeek)
507+
is RecordTypeGoal.Range.Monthly -> timeMapper.toMonthDateTitle(shift, startOfDayShift)
508+
}
509+
}
390510
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,18 @@ object GoalsTestUtils {
139139
goal: String,
140140
) {
141141
allOf(
142-
isDescendantOfA(withId(baseR.id.viewStatisticsGoalItem)),
143-
hasSibling(withText(typeName)),
144-
withId(R.id.tvStatisticsGoalItemCurrent),
145-
withSubstring(current),
146-
isCompletelyDisplayed(),
147-
).let(::checkViewIsDisplayed)
148-
149-
allOf(
150-
isDescendantOfA(withId(baseR.id.viewStatisticsGoalItem)),
151-
hasSibling(withText(typeName)),
152-
withId(R.id.tvStatisticsGoalItemGoal),
153-
withText(goal),
142+
withId(baseR.id.viewStatisticsGoalItem),
143+
hasDescendant(withText(typeName)),
144+
hasDescendant(
145+
allOf(
146+
withId(R.id.tvStatisticsGoalItemCurrent), withSubstring(current),
147+
),
148+
),
149+
hasDescendant(
150+
allOf(
151+
withId(R.id.tvStatisticsGoalItemGoal), withText(goal),
152+
),
153+
),
154154
isCompletelyDisplayed(),
155155
).let(::checkViewIsDisplayed)
156156
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,34 @@ class OptionsListCustomizationTest : BaseUiTest() {
272272
pressBack()
273273
}
274274

275+
@Test
276+
fun allOptionsHidden() {
277+
NavUtils.openSettingsScreen()
278+
NavUtils.openSettingsDisplay()
279+
scrollSettingsRecyclerToText(coreR.string.settings_customize_options_menu)
280+
clickOnSettingsRecyclerText(coreR.string.settings_customize_options_menu)
281+
clickOnViewWithText(R.string.shortcut_navigation_records)
282+
283+
listOf(
284+
R.string.records_switch_to_calendar,
285+
R.string.chart_filter_hint,
286+
R.string.message_action_share,
287+
R.string.range_select_day,
288+
R.string.range_back_to_today,
289+
).forEach {
290+
checkCheckboxIsChecked(customizeOptionCheckboxMatcher(it))
291+
clickOnCustomizeOptionCheckbox(it)
292+
checkCheckboxIsNotChecked(customizeOptionCheckboxMatcher(it))
293+
}
294+
295+
pressBack()
296+
297+
NavUtils.openRecordsScreen()
298+
checkViewDoesNotExist(
299+
allOf(withId(R.id.btnRecordsContainerOptions), isCompletelyDisplayed()),
300+
)
301+
}
302+
275303
private fun clickOnCustomizeOptionCheckbox(@StringRes textId: Int) {
276304
clickOnView(customizeOptionCheckboxMatcher(textId))
277305
}

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,6 +1855,51 @@ class SettingsTest : BaseUiTest() {
18551855
tryAction { clickOnView(allOf(isDescendantOfA(withId(baseR.id.viewRunningRecordItem)), withText(name))) }
18561856
}
18571857

1858+
@Test
1859+
fun recordTagSelectionCloseExcludeActivities() {
1860+
val name1 = "TypeName1"
1861+
val name2 = "TypeName2"
1862+
val tag1 = "TagName1"
1863+
val tag2 = "TagName2"
1864+
1865+
// Add data
1866+
testUtils.addActivity(name1)
1867+
testUtils.addActivity(name2)
1868+
testUtils.addRecordTag(tag1)
1869+
testUtils.addRecordTag(tag2)
1870+
1871+
// Change setting
1872+
NavUtils.openSettingsScreen()
1873+
NavUtils.openSettingsAdditional()
1874+
scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection)
1875+
clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection)
1876+
checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection))
1877+
1878+
scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_close_hint)
1879+
checkViewIsDisplayed(withText(coreR.string.settings_show_record_tag_close_hint))
1880+
clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint)
1881+
checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint))
1882+
1883+
// Exclude one
1884+
clickOnSettingsButtonBesideText(coreR.string.settings_show_record_tag_close_hint)
1885+
Thread.sleep(1000)
1886+
clickOnViewWithText(name1)
1887+
clickOnViewWithText(coreR.string.duration_dialog_save)
1888+
1889+
// Excluded entry should not close after one tag
1890+
NavUtils.openRunningRecordsScreen()
1891+
clickOnViewWithText(name1)
1892+
clickOnView(withText(tag1))
1893+
tryAction { checkViewIsDisplayed(withText(tag2)) }
1894+
pressBack()
1895+
1896+
// Not excluded should close after one tag
1897+
clickOnViewWithText(name2)
1898+
checkViewIsNotDisplayed(withText(R.string.duration_dialog_save))
1899+
clickOnView(withText(tag1))
1900+
tryAction { checkViewDoesNotExist(withText(tag2)) }
1901+
}
1902+
18581903
@Test
18591904
fun recordTagSelectionFromOtherActivity() {
18601905
val type1 = "Type1"

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
1212
import com.example.util.simpletimetracker.core.mapper.ColorMapper
1313
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
1414
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggestion.RecordTypeSuggestionViewData
15+
import com.example.util.simpletimetracker.feature_change_record_type.R
16+
import com.example.util.simpletimetracker.feature_records_filter.viewData.CategoryFilteredType
1517
import com.example.util.simpletimetracker.feature_statistics_detail.adapter.StatisticsDetailBlock
1618
import com.example.util.simpletimetracker.utils.BaseUiTest
1719
import com.example.util.simpletimetracker.utils.Direction
1820
import com.example.util.simpletimetracker.utils.NavUtils
21+
import com.example.util.simpletimetracker.utils.NavUtils.fixToCurrentDate
1922
import com.example.util.simpletimetracker.utils.checkViewDoesNotExist
2023
import com.example.util.simpletimetracker.utils.clickOnView
2124
import com.example.util.simpletimetracker.utils.drag
@@ -210,6 +213,7 @@ class StatisticsDetailExcludeTest : BaseUiTest() {
210213
clickOnView(
211214
allOf(
212215
withId(baseR.id.viewCategoryItem),
216+
withTag(CategoryFilteredType),
213217
hasDescendant(withText(category2)),
214218
),
215219
)
@@ -331,6 +335,7 @@ class StatisticsDetailExcludeTest : BaseUiTest() {
331335
// Check default
332336
NavUtils.openFilter()
333337
Thread.sleep(1000)
338+
clickOnView(withSubstring(getString(R.string.records_filter_exclude)))
334339
clickOnView(
335340
allOf(
336341
isDescendantOfA(withId(baseR.id.viewCategoryItem)),
@@ -385,6 +390,7 @@ class StatisticsDetailExcludeTest : BaseUiTest() {
385390
private fun openStats() {
386391
NavUtils.openStatisticsScreen()
387392
tryAction { clickOnView(allOf(withText(R.string.statistics_total_tracked), isCompletelyDisplayed())) }
393+
fixToCurrentDate()
388394
}
389395

390396
private fun checkDefault() {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import android.view.ViewGroup
55
import android.view.ViewParent
66
import com.google.android.material.appbar.AppBarLayout
77

8-
internal fun View.collapseAllAppBarsInParent() {
8+
internal fun View.changeAllAppBarsInParent(expanded: Boolean) {
99
findViewsInParent(AppBarLayout::class.java)
10-
.forEach { it.setExpanded(false) }
10+
.forEach { it.setExpanded(expanded) }
1111
}
1212

1313
internal fun <T> View.findViewsInParent(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ fun collapseToolbar(): ViewAction = object : ViewAction {
222222
isDisplayed()
223223

224224
override fun perform(uiController: UiController?, view: View?) {
225-
view?.collapseAllAppBarsInParent()
225+
view?.changeAllAppBarsInParent(expanded = false)
226226
}
227227
}
228228

0 commit comments

Comments
 (0)