A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

fix tests

razeeman (Jan 20, 2024, 6:50 PM +0300) 23cece8d 7117b6a8

+641 -474
+13 -13
features/feature_settings/src/main/res/layout/item_settings_checkbox_with_range.xml
··· 59 59 android:layout_width="wrap_content" 60 60 android:layout_height="wrap_content" 61 61 app:barrierDirection="start" 62 - app:constraint_referenced_ids="tvItemSettingsCheckboxWithRangeStart, checkboxItemSettingsCheckboxWithRange" /> 62 + app:constraint_referenced_ids="tvItemSettingsStart, checkboxItemSettings" /> 63 63 64 64 <androidx.appcompat.widget.AppCompatCheckBox 65 - android:id="@+id/checkboxItemSettingsCheckboxWithRange" 65 + android:id="@+id/checkboxItemSettings" 66 66 android:layout_width="wrap_content" 67 67 android:layout_height="0dp" 68 68 android:layout_marginEnd="4dp" ··· 72 72 app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeTitle" /> 73 73 74 74 <androidx.appcompat.widget.AppCompatTextView 75 - android:id="@+id/tvItemSettingsCheckboxWithRangeStart" 75 + android:id="@+id/tvItemSettingsStart" 76 76 android:layout_width="wrap_content" 77 77 android:layout_height="wrap_content" 78 78 android:layout_marginTop="8dp" ··· 82 82 android:paddingVertical="4dp" 83 83 android:textColor="?appTextPrimaryColor" 84 84 android:translationZ="4dp" 85 - app:layout_constraintEnd_toStartOf="@id/tvItemSettingsCheckboxWithRangeDivider" 86 - app:layout_constraintTop_toBottomOf="@id/checkboxItemSettingsCheckboxWithRange" 85 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsDivider" 86 + app:layout_constraintTop_toBottomOf="@id/checkboxItemSettings" 87 87 tools:text="01:23" /> 88 88 89 89 <androidx.appcompat.widget.AppCompatTextView 90 - android:id="@+id/tvItemSettingsCheckboxWithRangeDivider" 90 + android:id="@+id/tvItemSettingsDivider" 91 91 android:layout_width="wrap_content" 92 92 android:layout_height="wrap_content" 93 93 android:gravity="end|center_vertical" 94 94 android:text="-" 95 95 android:textColor="?appTextPrimaryColor" 96 96 android:translationZ="4dp" 97 - app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCheckboxWithRangeStart" 98 - app:layout_constraintEnd_toStartOf="@id/tvItemSettingsCheckboxWithRangeEnd" 99 - app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeStart" 97 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsStart" 98 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsEnd" 99 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsStart" 100 100 tools:ignore="HardcodedText" /> 101 101 102 102 <androidx.appcompat.widget.AppCompatTextView 103 - android:id="@+id/tvItemSettingsCheckboxWithRangeEnd" 103 + android:id="@+id/tvItemSettingsEnd" 104 104 android:layout_width="wrap_content" 105 105 android:layout_height="match_parent" 106 106 android:layout_marginEnd="20dp" ··· 110 110 android:paddingVertical="4dp" 111 111 android:textColor="?appTextPrimaryColor" 112 112 android:translationZ="4dp" 113 - app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCheckboxWithRangeStart" 113 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsStart" 114 114 app:layout_constraintEnd_toEndOf="parent" 115 - app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeStart" 115 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsStart" 116 116 tools:text="01:23" /> 117 117 118 118 <androidx.constraintlayout.widget.Group ··· 120 120 android:layout_width="wrap_content" 121 121 android:layout_height="wrap_content" 122 122 android:visibility="gone" 123 - app:constraint_referenced_ids="tvItemSettingsCheckboxWithRangeStart, tvItemSettingsCheckboxWithRangeDivider, tvItemSettingsCheckboxWithRangeEnd" 123 + app:constraint_referenced_ids="tvItemSettingsStart, tvItemSettingsDivider, tvItemSettingsEnd" 124 124 tools:visibility="visible" /> 125 125 126 126 </androidx.constraintlayout.widget.ConstraintLayout>
+3 -3
features/feature_settings/src/main/res/layout/item_settings_selector_with_button.xml
··· 24 24 android:paddingBottom="0dp" 25 25 android:translationZ="4dp" 26 26 app:layout_constraintBottom_toTopOf="@id/tvItemSettingsSubtitle" 27 - app:layout_constraintEnd_toStartOf="@id/btnItemSettingsSelector" 27 + app:layout_constraintEnd_toStartOf="@id/btnItemSettings" 28 28 app:layout_constraintStart_toStartOf="parent" 29 29 app:layout_constraintTop_toTopOf="parent" 30 30 tools:text="Title" /> ··· 38 38 android:paddingBottom="0dp" 39 39 android:translationZ="4dp" 40 40 android:visibility="gone" 41 - app:layout_constraintEnd_toStartOf="@id/btnItemSettingsSelector" 41 + app:layout_constraintEnd_toStartOf="@id/btnItemSettings" 42 42 app:layout_constraintStart_toStartOf="parent" 43 43 app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" 44 44 app:layout_goneMarginEnd="4dp" ··· 46 46 tools:visibility="visible" /> 47 47 48 48 <androidx.cardview.widget.CardView 49 - android:id="@+id/btnItemSettingsSelector" 49 + android:id="@+id/btnItemSettings" 50 50 style="@style/SettingsCard" 51 51 android:layout_width="44dp" 52 52 android:layout_height="44dp"
+2 -2
features/feature_settings/src/main/res/layout/item_settings_spinner_with_button.xml
··· 21 21 android:layout_marginStart="4dp" 22 22 android:translationZ="4dp" 23 23 app:layout_constraintEnd_toEndOf="parent" 24 - app:layout_constraintEnd_toStartOf="@id/btnItemSettingsSpinner" 24 + app:layout_constraintEnd_toStartOf="@id/btnItemSettings" 25 25 app:layout_constraintStart_toStartOf="parent" 26 26 app:layout_constraintTop_toTopOf="parent" 27 27 tools:text="Title" /> 28 28 29 29 <androidx.cardview.widget.CardView 30 - android:id="@+id/btnItemSettingsSpinner" 30 + android:id="@+id/btnItemSettings" 31 31 style="@style/SettingsCard" 32 32 android:layout_width="44dp" 33 33 android:layout_height="44dp"
+3 -3
features/feature_settings/src/main/res/layout/item_settings_text_with_button.xml
··· 38 38 android:paddingTop="0dp" 39 39 android:paddingBottom="0dp" 40 40 android:translationZ="4dp" 41 - app:layout_constraintEnd_toStartOf="@id/btnItemSettingsText" 41 + app:layout_constraintEnd_toStartOf="@id/btnItemSettings" 42 42 app:layout_constraintStart_toStartOf="parent" 43 43 app:layout_constraintTop_toBottomOf="@id/spaceItemSettingsTop" 44 44 tools:text="Title" /> ··· 51 51 android:paddingBottom="0dp" 52 52 android:translationZ="4dp" 53 53 android:visibility="gone" 54 - app:layout_constraintEnd_toStartOf="@id/btnItemSettingsText" 54 + app:layout_constraintEnd_toStartOf="@id/btnItemSettings" 55 55 app:layout_constraintStart_toStartOf="parent" 56 56 app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" 57 57 tools:text="Subtitle" ··· 70 70 tools:visibility="visible" /> 71 71 72 72 <androidx.cardview.widget.CardView 73 - android:id="@+id/btnItemSettingsText" 73 + android:id="@+id/btnItemSettings" 74 74 style="@style/SettingsCard" 75 75 android:layout_width="44dp" 76 76 android:layout_height="44dp"
+26 -29
app/src/androidTest/java/com/example/util/simpletimetracker/ActivityFilterTest.kt
··· 22 22 import com.example.util.simpletimetracker.utils.clickOnView 23 23 import com.example.util.simpletimetracker.utils.clickOnViewWithText 24 24 import com.example.util.simpletimetracker.utils.longClickOnView 25 - import com.example.util.simpletimetracker.utils.nestedScrollTo 26 25 import com.example.util.simpletimetracker.utils.scrollRecyclerToPosition 27 26 import com.example.util.simpletimetracker.utils.scrollRecyclerToView 28 27 import com.example.util.simpletimetracker.utils.tryAction 29 28 import com.example.util.simpletimetracker.utils.typeTextIntoView 30 - import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 31 29 import com.example.util.simpletimetracker.utils.withCardColor 32 30 import dagger.hilt.android.testing.HiltAndroidTest 33 31 import kotlinx.coroutines.runBlocking ··· 37 35 import org.junit.runner.RunWith 38 36 import com.example.util.simpletimetracker.core.R as coreR 39 37 import com.example.util.simpletimetracker.feature_change_activity_filter.R as changeActivityFilterR 40 - import com.example.util.simpletimetracker.feature_settings.R as settingsR 41 38 import com.example.util.simpletimetracker.feature_views.R as viewsR 42 39 43 40 @HiltAndroidTest ··· 85 82 clickOnRecyclerItem(changeActivityFilterR.id.rvChangeActivityFilterColor, withCardColor(firstColor)) 86 83 checkPreviewUpdated(withCardColor(firstColor)) 87 84 checkViewIsDisplayed( 88 - allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(firstColor))) 85 + allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(firstColor))), 89 86 ) 90 87 91 88 // Selecting color ··· 93 90 clickOnRecyclerItem(changeActivityFilterR.id.rvChangeActivityFilterColor, withCardColor(lastColor)) 94 91 checkPreviewUpdated(withCardColor(lastColor)) 95 92 checkViewIsDisplayed( 96 - allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(lastColor))) 93 + allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(lastColor))), 97 94 ) 98 95 99 96 // Open activity chooser ··· 164 161 clickOnView( 165 162 allOf( 166 163 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 167 - withText(coreR.string.activity_hint) 168 - ) 164 + withText(coreR.string.activity_hint), 165 + ), 169 166 ) 170 167 onView(withText(typeName1)).check(isCompletelyAbove(withId(changeActivityFilterR.id.viewDividerItem))) 171 168 onView(withText(typeName2)).check(isCompletelyBelow(withId(changeActivityFilterR.id.viewDividerItem))) 172 169 clickOnView( 173 170 allOf( 174 171 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 175 - withText(coreR.string.category_hint) 176 - ) 172 + withText(coreR.string.category_hint), 173 + ), 177 174 ) 178 175 onView(withText(categoryName1)).check(isCompletelyAbove(withId(changeActivityFilterR.id.viewDividerItem))) 179 176 onView(withText(categoryName2)).check(isCompletelyBelow(withId(changeActivityFilterR.id.viewDividerItem))) ··· 182 179 clickOnView( 183 180 allOf( 184 181 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 185 - withText(coreR.string.activity_hint) 186 - ) 182 + withText(coreR.string.activity_hint), 183 + ), 187 184 ) 188 185 clickOnViewWithText(coreR.string.change_activity_filter_save) 189 186 ··· 239 236 // Change color 240 237 clickOnViewWithText(coreR.string.change_category_color_hint) 241 238 checkViewIsDisplayed( 242 - allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(firstColor))) 239 + allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(firstColor))), 243 240 ) 244 241 scrollRecyclerToView(changeActivityFilterR.id.rvChangeActivityFilterColor, withCardColor(lastColor)) 245 242 clickOnRecyclerItem(changeActivityFilterR.id.rvChangeActivityFilterColor, withCardColor(lastColor)) 246 243 checkPreviewUpdated(withCardColor(lastColor)) 247 244 checkViewIsDisplayed( 248 - allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(lastColor))) 245 + allOf(withId(changeActivityFilterR.id.viewColorItemSelected), withParent(withCardColor(lastColor))), 249 246 ) 250 247 251 248 // Change types ··· 255 252 clickOnView( 256 253 allOf( 257 254 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 258 - withText(coreR.string.category_hint) 259 - ) 255 + withText(coreR.string.category_hint), 256 + ), 260 257 ) 261 258 clickOnRecyclerItem(changeActivityFilterR.id.rvChangeActivityFilterType, withText(categoryName2)) 262 259 onView(withText(categoryName1)).check(isCompletelyBelow(withId(changeActivityFilterR.id.viewDividerItem))) ··· 285 282 clickOnView( 286 283 allOf( 287 284 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 288 - withText(coreR.string.activity_hint) 289 - ) 285 + withText(coreR.string.activity_hint), 286 + ), 290 287 ) 291 288 checkViewIsDisplayed(withText(coreR.string.record_types_empty)) 292 289 ··· 294 291 clickOnView( 295 292 allOf( 296 293 isDescendantOfA(withId(changeActivityFilterR.id.buttonsChangeActivityFilterType)), 297 - withText(coreR.string.category_hint) 298 - ) 294 + withText(coreR.string.category_hint), 295 + ), 299 296 ) 300 297 checkViewIsDisplayed(withText(coreR.string.change_record_type_categories_empty)) 301 298 } ··· 341 338 name = filterByActivity1, 342 339 type = ActivityFilter.Type.Activity, 343 340 color = firstColor, 344 - names = listOf(typeName1, typeName3) 341 + names = listOf(typeName1, typeName3), 345 342 ) 346 343 testUtils.addActivityFilter( 347 344 name = filterByActivity2, 348 345 type = ActivityFilter.Type.Activity, 349 346 color = firstColor, 350 - names = listOf(typeName5) 347 + names = listOf(typeName5), 351 348 ) 352 349 353 350 // Add category filters ··· 355 352 name = filterByCategory1, 356 353 type = ActivityFilter.Type.Category, 357 354 color = firstColor, 358 - names = listOf(categoryName1) 355 + names = listOf(categoryName1), 359 356 ) 360 357 testUtils.addActivityFilter( 361 358 name = filterByCategory2, 362 359 type = ActivityFilter.Type.Category, 363 360 color = firstColor, 364 - names = listOf(categoryName2) 361 + names = listOf(categoryName2), 365 362 ) 366 363 testUtils.addActivityFilter( 367 364 name = filterByCategoryAll, 368 365 type = ActivityFilter.Type.Category, 369 366 color = firstColor, 370 - names = listOf(categoryName1, categoryName2) 367 + names = listOf(categoryName1, categoryName2), 371 368 ) 372 369 373 370 // Check filtering ··· 383 380 checkFilter(filterByActivity1, firstColor) 384 381 checkTypes( 385 382 displayed = listOf(typeName1, typeName3), 386 - available = availableTypes 383 + available = availableTypes, 387 384 ) 388 385 clickOnViewWithText(filterByActivity1) 389 386 checkTypes(displayed = availableTypes, available = availableTypes) ··· 500 497 // Change setting 501 498 NavUtils.openSettingsScreen() 502 499 NavUtils.openSettingsDisplay() 503 - onView(withId(settingsR.id.checkboxSettingsShowActivityFilters)).perform(nestedScrollTo()) 504 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowActivityFilters)) 500 + scrollSettingsRecyclerToText(R.string.settings_show_activity_filters) 501 + clickOnSettingsCheckboxBesideText(R.string.settings_show_activity_filters) 505 502 506 503 // Filtering appears 507 504 NavUtils.openRunningRecordsScreen() ··· 510 507 511 508 // Change setting 512 509 NavUtils.openSettingsScreen() 513 - onView(withId(settingsR.id.checkboxSettingsShowActivityFilters)).perform(nestedScrollTo()) 514 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowActivityFilters)) 510 + scrollSettingsRecyclerToText(R.string.settings_show_activity_filters) 511 + clickOnSettingsCheckboxBesideText(R.string.settings_show_activity_filters) 515 512 516 513 // No filtering 517 514 NavUtils.openRunningRecordsScreen()
+3 -8
app/src/androidTest/java/com/example/util/simpletimetracker/ArchiveTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 3 import androidx.test.espresso.Espresso.closeSoftKeyboard 4 - import androidx.test.espresso.Espresso.onView 5 4 import androidx.test.espresso.Espresso.pressBack 6 5 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 7 6 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed ··· 13 12 import com.example.util.simpletimetracker.utils.NavUtils 14 13 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist 15 14 import com.example.util.simpletimetracker.utils.checkViewIsDisplayed 16 - import com.example.util.simpletimetracker.utils.clickOnSpinnerWithId 17 15 import com.example.util.simpletimetracker.utils.clickOnView 18 16 import com.example.util.simpletimetracker.utils.clickOnViewWithId 19 17 import com.example.util.simpletimetracker.utils.clickOnViewWithIdOnPager 20 18 import com.example.util.simpletimetracker.utils.clickOnViewWithText 21 19 import com.example.util.simpletimetracker.utils.longClickOnView 22 - import com.example.util.simpletimetracker.utils.nestedScrollTo 23 20 import com.example.util.simpletimetracker.utils.tryAction 24 - import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 25 21 import dagger.hilt.android.testing.HiltAndroidTest 26 22 import org.hamcrest.CoreMatchers.allOf 27 23 import org.junit.Test ··· 31 27 import com.example.util.simpletimetracker.feature_change_record_type.R as changeRecordTypeR 32 28 import com.example.util.simpletimetracker.feature_dialogs.R as dialogsR 33 29 import com.example.util.simpletimetracker.feature_records.R as recordsR 34 - import com.example.util.simpletimetracker.feature_settings.R as settingsR 35 30 import com.example.util.simpletimetracker.feature_statistics.R as statisticsR 36 31 import com.example.util.simpletimetracker.feature_statistics_detail.R as statisticsDetailR 37 32 ··· 116 111 pressBack() 117 112 118 113 // Not shown in manual order 119 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRecordTypeSort) 114 + clickOnSettingsSpinnerBesideText(R.string.settings_sort_order) 120 115 clickOnViewWithText(coreR.string.settings_sort_manually) 121 116 tryAction { checkTypeVisible(name1) } 122 117 checkTypeNotVisible(name2) ··· 160 155 161 156 NavUtils.openSettingsScreen() 162 157 NavUtils.openSettingsAdditional() 163 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 164 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 158 + scrollSettingsRecyclerToText(R.string.settings_show_record_tag_selection) 159 + clickOnSettingsCheckboxBesideText(R.string.settings_show_record_tag_selection) 165 160 NavUtils.openCategoriesScreen() 166 161 checkTagVisible(tag1) 167 162 checkTagVisible(tag2)
+4 -4
app/src/androidTest/java/com/example/util/simpletimetracker/RecordsFilterTest.kt
··· 612 612 clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) 613 613 clickOnView(withSubstring(getString(coreR.string.records_all_sort_duration))) 614 614 clickOnViewWithId(recordsFilterR.id.fieldRecordsFilterRangeTimeEnded) 615 - repeat(6) { clickOnViewWithId(R.id.ivDurationPickerDelete) } 615 + repeat(6) { clickOnViewWithId(R.id.btnNumberKeyboardDelete) } 616 616 clickOnViewWithId(R.id.tvNumberKeyboard1) 617 617 repeat(4) { clickOnViewWithId(R.id.tvNumberKeyboard0) } 618 618 clickOnViewWithText(coreR.string.duration_dialog_save) ··· 627 627 repeat(4) { clickOnViewWithId(R.id.tvNumberKeyboard0) } 628 628 clickOnViewWithText(coreR.string.duration_dialog_save) 629 629 clickOnViewWithId(recordsFilterR.id.fieldRecordsFilterRangeTimeEnded) 630 - repeat(5) { clickOnViewWithId(R.id.ivDurationPickerDelete) } 630 + repeat(5) { clickOnViewWithId(R.id.btnNumberKeyboardDelete) } 631 631 clickOnViewWithId(R.id.tvNumberKeyboard2) 632 632 repeat(4) { clickOnViewWithId(R.id.tvNumberKeyboard0) } 633 633 clickOnViewWithText(coreR.string.duration_dialog_save) ··· 638 638 clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) 639 639 clickOnView(withSubstring(getString(coreR.string.records_all_sort_duration))) 640 640 clickOnViewWithId(recordsFilterR.id.fieldRecordsFilterRangeTimeStarted) 641 - repeat(5) { clickOnViewWithId(R.id.ivDurationPickerDelete) } 641 + repeat(5) { clickOnViewWithId(R.id.btnNumberKeyboardDelete) } 642 642 clickOnViewWithText(coreR.string.duration_dialog_save) 643 643 pressBack() 644 644 checkRecordsCard(3) ··· 647 647 clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) 648 648 clickOnView(withSubstring(getString(coreR.string.records_all_sort_duration))) 649 649 clickOnViewWithId(recordsFilterR.id.fieldRecordsFilterRangeTimeEnded) 650 - repeat(5) { clickOnViewWithId(R.id.ivDurationPickerDelete) } 650 + repeat(5) { clickOnViewWithId(R.id.btnNumberKeyboardDelete) } 651 651 clickOnViewWithId(R.id.tvNumberKeyboard1) 652 652 repeat(3) { clickOnViewWithId(R.id.tvNumberKeyboard0) } 653 653 clickOnViewWithText(coreR.string.duration_dialog_save)
+12 -13
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsCardOrder.kt
··· 19 19 import com.example.util.simpletimetracker.utils.Direction 20 20 import com.example.util.simpletimetracker.utils.NavUtils 21 21 import com.example.util.simpletimetracker.utils.checkViewIsDisplayed 22 - import com.example.util.simpletimetracker.utils.clickOnSpinnerWithId 23 - import com.example.util.simpletimetracker.utils.clickOnViewWithId 24 22 import com.example.util.simpletimetracker.utils.clickOnViewWithText 25 23 import com.example.util.simpletimetracker.utils.drag 26 - import com.example.util.simpletimetracker.utils.nestedScrollTo 27 24 import com.example.util.simpletimetracker.utils.slowHalfSwipe 28 25 import com.example.util.simpletimetracker.utils.tryAction 29 26 import dagger.hilt.android.testing.HiltAndroidTest ··· 116 113 // Check settings 117 114 NavUtils.openSettingsScreen() 118 115 NavUtils.openSettingsDisplay() 119 - onView(withId(settingsR.id.spinnerSettingsRecordTypeSort)).perform(nestedScrollTo()) 116 + scrollSettingsRecyclerToText(R.string.settings_sort_order) 120 117 checkViewIsDisplayed( 121 - allOf(withId(settingsR.id.tvSettingsRecordTypeSortValue), withText(coreR.string.settings_sort_by_name)) 118 + allOf(withId(settingsR.id.tvItemSettingsValue), withText(coreR.string.settings_sort_by_name)) 122 119 ) 123 120 } 124 121 ··· 164 161 clickOnViewWithText("1") 165 162 pressBack() 166 163 167 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRecordTypeSort) 164 + clickOnSettingsSpinnerBesideText(R.string.settings_sort_order) 168 165 clickOnViewWithText(coreR.string.settings_sort_by_color) 169 166 checkViewIsDisplayed( 170 - allOf(withId(settingsR.id.tvSettingsRecordTypeSortValue), withText(coreR.string.settings_sort_by_color)) 167 + allOf(withId(settingsR.id.tvItemSettingsValue), withText(coreR.string.settings_sort_by_color)) 171 168 ) 172 169 173 170 // Check new order ··· 202 199 // Change settings 203 200 NavUtils.openSettingsScreen() 204 201 NavUtils.openSettingsDisplay() 205 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRecordTypeSort) 202 + scrollSettingsRecyclerToText(R.string.settings_sort_order) 203 + clickOnSettingsSpinnerBesideText(R.string.settings_sort_order) 206 204 clickOnViewWithText(coreR.string.settings_sort_manually) 207 205 Thread.sleep(1000) 208 206 ··· 217 215 // Check new order 218 216 pressBack() 219 217 checkViewIsDisplayed( 220 - allOf(withId(settingsR.id.tvSettingsRecordTypeSortValue), withText(coreR.string.settings_sort_manually)) 218 + allOf(withId(settingsR.id.tvItemSettingsValue), withText(coreR.string.settings_sort_manually)) 221 219 ) 222 220 NavUtils.openRunningRecordsScreen() 223 221 checkOrder(name2, name1, ::isCompletelyLeftOf) ··· 225 223 226 224 // Change order 227 225 NavUtils.openSettingsScreen() 228 - onView(withId(settingsR.id.btnCardOrderManual)).perform(nestedScrollTo()) 229 - clickOnViewWithId(settingsR.id.btnCardOrderManual) 226 + scrollSettingsRecyclerToText(R.string.settings_sort_order) 227 + clickOnSettingsSpinnerButtonBesideText(R.string.settings_sort_order) 230 228 checkOrder(name2, name1, ::isCompletelyLeftOf) 231 229 checkOrder(name1, name3, ::isCompletelyLeftOf) 232 230 onView(allOf(isDescendantOfA(withId(baseR.id.viewRecordTypeItem)), withText(name1))) ··· 255 253 NavUtils.openCardSizeScreen() 256 254 tryAction { clickOnViewWithText("4") } 257 255 pressBack() 258 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRecordTypeSort) 256 + scrollSettingsRecyclerToText(R.string.settings_sort_order) 257 + clickOnSettingsSpinnerBesideText(R.string.settings_sort_order) 259 258 clickOnViewWithText(coreR.string.settings_sort_by_color) 260 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRecordTypeSort) 259 + clickOnSettingsSpinnerBesideText(R.string.settings_sort_order) 261 260 clickOnViewWithText(coreR.string.settings_sort_manually) 262 261 Thread.sleep(1000) 263 262
+354 -373
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt
··· 4 4 import androidx.test.espresso.Espresso.onData 5 5 import androidx.test.espresso.Espresso.onView 6 6 import androidx.test.espresso.Espresso.pressBack 7 - import androidx.test.espresso.action.ViewActions.click 8 7 import androidx.test.espresso.action.ViewActions.scrollTo 9 - import androidx.test.espresso.assertion.ViewAssertions.matches 10 8 import androidx.test.espresso.contrib.PickerActions.setDate 11 9 import androidx.test.espresso.contrib.PickerActions.setTime 12 10 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 13 11 import androidx.test.espresso.matcher.ViewMatchers.hasSibling 14 - import androidx.test.espresso.matcher.ViewMatchers.isChecked 15 12 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 16 13 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA 17 - import androidx.test.espresso.matcher.ViewMatchers.isNotChecked 18 14 import androidx.test.espresso.matcher.ViewMatchers.withClassName 19 15 import androidx.test.espresso.matcher.ViewMatchers.withId 20 16 import androidx.test.espresso.matcher.ViewMatchers.withSubstring ··· 22 18 import androidx.test.ext.junit.runners.AndroidJUnit4 23 19 import com.example.util.simpletimetracker.core.extension.setToStartOfDay 24 20 import com.example.util.simpletimetracker.core.extension.setWeekToFirstDay 21 + import com.example.util.simpletimetracker.core.interactor.LanguageInteractor 22 + import com.example.util.simpletimetracker.domain.interactor.AppLanguage 25 23 import com.example.util.simpletimetracker.domain.model.ActivityFilter 26 24 import com.example.util.simpletimetracker.domain.model.DayOfWeek 27 - import com.example.util.simpletimetracker.feature_base_adapter.R 28 25 import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 29 26 import com.example.util.simpletimetracker.utils.BaseUiTest 30 27 import com.example.util.simpletimetracker.utils.NavUtils 28 + import com.example.util.simpletimetracker.utils.checkCheckboxIsChecked 29 + import com.example.util.simpletimetracker.utils.checkCheckboxIsNotChecked 31 30 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist 32 31 import com.example.util.simpletimetracker.utils.checkViewIsDisplayed 33 32 import com.example.util.simpletimetracker.utils.checkViewIsNotDisplayed 34 - import com.example.util.simpletimetracker.utils.clickOnSpinnerWithId 35 33 import com.example.util.simpletimetracker.utils.clickOnView 36 34 import com.example.util.simpletimetracker.utils.clickOnViewWithId 37 35 import com.example.util.simpletimetracker.utils.clickOnViewWithIdOnPager 38 36 import com.example.util.simpletimetracker.utils.clickOnViewWithText 39 37 import com.example.util.simpletimetracker.utils.getMillis 40 38 import com.example.util.simpletimetracker.utils.longClickOnViewWithId 41 - import com.example.util.simpletimetracker.utils.nestedScrollTo 42 39 import com.example.util.simpletimetracker.utils.recyclerItemCount 43 40 import com.example.util.simpletimetracker.utils.tryAction 44 - import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 45 41 import com.example.util.simpletimetracker.utils.withPluralText 46 42 import dagger.hilt.android.testing.HiltAndroidTest 47 43 import kotlinx.coroutines.runBlocking ··· 58 54 import com.example.util.simpletimetracker.feature_change_record_type.R as changeRecordTypeR 59 55 import com.example.util.simpletimetracker.feature_dialogs.R as dialogsR 60 56 import com.example.util.simpletimetracker.feature_records.R as recordsR 61 - import com.example.util.simpletimetracker.feature_settings.R as settingsR 62 57 import com.example.util.simpletimetracker.feature_statistics.R as statisticsR 63 58 import com.example.util.simpletimetracker.feature_statistics_detail.R as statisticsDetailR 64 59 ··· 84 79 // Change setting 85 80 NavUtils.openSettingsScreen() 86 81 NavUtils.openSettingsDisplay() 87 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).perform(nestedScrollTo()) 88 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).check(matches(isChecked())) 89 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)) 90 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).check(matches(isNotChecked())) 82 + scrollSettingsRecyclerToText(coreR.string.settings_show_untracked_time) 83 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time)) 84 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_untracked_time) 85 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time)) 91 86 92 87 // Untracked is not shown 93 88 NavUtils.openRecordsScreen() ··· 97 92 98 93 // Change setting 99 94 NavUtils.openSettingsScreen() 100 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).perform(nestedScrollTo()) 101 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).check(matches(isNotChecked())) 102 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)) 103 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInRecords)).check(matches(isChecked())) 95 + scrollSettingsRecyclerToText(coreR.string.settings_show_untracked_time) 96 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time)) 97 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_untracked_time) 98 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time)) 104 99 105 100 // Untracked is shown 106 101 NavUtils.openRecordsScreen() ··· 125 120 // Change setting 126 121 NavUtils.openSettingsScreen() 127 122 NavUtils.openSettingsDisplay() 128 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).perform(nestedScrollTo()) 129 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).check(matches(isChecked())) 130 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)) 131 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).check(matches(isNotChecked())) 123 + scrollSettingsRecyclerToText(coreR.string.settings_show_untracked_time_statistics) 124 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics)) 125 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics) 126 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics)) 132 127 133 128 // Untracked is not shown 134 129 NavUtils.openStatisticsScreen() 135 - checkViewDoesNotExist( 136 - allOf(withText(coreR.string.untracked_time_name), isCompletelyDisplayed()), 137 - ) 130 + checkViewDoesNotExist(allOf(withText(coreR.string.untracked_time_name), isCompletelyDisplayed())) 138 131 139 132 // Add record 140 133 NavUtils.openRecordsScreen() 141 134 testUtils.addRecord(name) 142 135 NavUtils.openStatisticsScreen() 143 - checkViewDoesNotExist( 144 - allOf(withText(coreR.string.untracked_time_name), isCompletelyDisplayed()), 145 - ) 136 + checkViewDoesNotExist(allOf(withText(coreR.string.untracked_time_name), isCompletelyDisplayed())) 146 137 checkViewIsDisplayed(allOf(withText(name), isCompletelyDisplayed())) 147 138 148 139 // Change setting 149 140 NavUtils.openSettingsScreen() 150 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).perform(nestedScrollTo()) 151 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).check(matches(isNotChecked())) 152 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)) 153 - onView(withId(settingsR.id.checkboxSettingsShowUntrackedInStatistics)).check(matches(isChecked())) 141 + scrollSettingsRecyclerToText(coreR.string.settings_show_untracked_time_statistics) 142 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics)) 143 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics) 144 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_untracked_time_statistics)) 154 145 155 146 // Untracked is shown 156 147 NavUtils.openStatisticsScreen() ··· 223 214 // Check disabled 224 215 NavUtils.openSettingsScreen() 225 216 NavUtils.openSettingsDisplay() 226 - onView(withId(settingsR.id.groupSettingsIgnoreShortUntracked)).perform(nestedScrollTo()) 227 - clickOnViewWithId(settingsR.id.groupSettingsIgnoreShortUntracked) 217 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_untracked) 218 + clickOnSettingsSelectorBesideText(coreR.string.settings_ignore_short_untracked) 228 219 clickOnViewWithText(coreR.string.duration_dialog_disable) 220 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_untracked) 229 221 checkViewIsDisplayed( 230 - allOf( 231 - withId(settingsR.id.tvSettingsIgnoreShortUntrackedTime), 222 + settingsSelectorValueBesideText( 223 + coreR.string.settings_ignore_short_untracked, 232 224 withText(coreR.string.settings_inactivity_reminder_disabled), 233 225 ), 234 226 ) ··· 243 235 244 236 // Check 30 minutes 245 237 NavUtils.openSettingsScreen() 246 - onView(withId(settingsR.id.groupSettingsIgnoreShortUntracked)).perform(nestedScrollTo()) 247 - clickOnViewWithId(settingsR.id.groupSettingsIgnoreShortUntracked) 238 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_untracked) 239 + clickOnSettingsSelectorBesideText(coreR.string.settings_ignore_short_untracked) 248 240 clickOnViewWithId(dialogsR.id.tvNumberKeyboard3) 249 241 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 250 242 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) ··· 260 252 261 253 // Check 1 minutes 262 254 NavUtils.openSettingsScreen() 263 - onView(withId(settingsR.id.groupSettingsIgnoreShortUntracked)).perform(nestedScrollTo()) 264 - clickOnViewWithId(settingsR.id.groupSettingsIgnoreShortUntracked) 265 - repeat(4) { clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) } 255 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_untracked) 256 + clickOnSettingsSelectorBesideText(coreR.string.settings_ignore_short_untracked) 257 + repeat(4) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 266 258 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 267 259 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 268 260 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) ··· 300 292 301 293 NavUtils.openSettingsScreen() 302 294 NavUtils.openSettingsDisplay() 303 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).perform(nestedScrollTo()) 304 - tryAction { onView(withId(settingsR.id.checkboxSettingsUntrackedRange)).check(matches(isNotChecked())) } 305 - checkViewIsNotDisplayed(withId(settingsR.id.tvSettingsUntrackedRangeStart)) 306 - checkViewIsNotDisplayed(withId(settingsR.id.tvSettingsUntrackedRangeEnd)) 307 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsUntrackedRange)) 308 - tryAction { onView(withId(settingsR.id.checkboxSettingsUntrackedRange)).check(matches(isChecked())) } 309 - checkViewIsDisplayed(withId(settingsR.id.tvSettingsUntrackedRangeStart)) 310 - checkViewIsDisplayed(withId(settingsR.id.tvSettingsUntrackedRangeEnd)) 295 + scrollSettingsRecyclerToText(coreR.string.settings_show_records_calendar) 296 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_untracked_range)) 297 + checkViewIsNotDisplayed(settingsRangeStartBesideText(coreR.string.settings_untracked_range)) 298 + checkViewIsNotDisplayed(settingsRangeEndBesideText(coreR.string.settings_untracked_range)) 299 + clickOnSettingsCheckboxBesideText(coreR.string.settings_untracked_range) 300 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_untracked_range)) 301 + checkViewIsDisplayed(settingsRangeStartBesideText(coreR.string.settings_untracked_range)) 302 + checkViewIsDisplayed(settingsRangeEndBesideText(coreR.string.settings_untracked_range)) 311 303 312 304 // Check range 313 305 var startPreview = (startOfDay + TimeUnit.HOURS.toMillis(8)).toTimePreview() 314 - clickOnViewWithId(settingsR.id.tvSettingsUntrackedRangeStart) 306 + clickOnSettingsRangeStartBesideText(coreR.string.settings_untracked_range) 315 307 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(8, 0)) 316 308 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 317 309 checkViewIsDisplayed( 318 - allOf( 319 - withId(settingsR.id.tvSettingsUntrackedRangeStart), 310 + settingsRangeStartBesideText( 311 + coreR.string.settings_untracked_range, 320 312 withText(startPreview), 321 313 ), 322 314 ) 323 315 var endPreview = (startOfDay + TimeUnit.HOURS.toMillis(17)).toTimePreview() 324 - clickOnViewWithId(settingsR.id.tvSettingsUntrackedRangeEnd) 316 + clickOnSettingsRangeEndBesideText(coreR.string.settings_untracked_range) 325 317 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(17, 0)) 326 318 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 327 319 checkViewIsDisplayed( 328 - allOf( 329 - withId(settingsR.id.tvSettingsUntrackedRangeEnd), 320 + settingsRangeEndBesideText( 321 + coreR.string.settings_untracked_range, 330 322 withText(endPreview), 331 323 ), 332 324 ) ··· 341 333 // Check other range 342 334 NavUtils.openSettingsScreen() 343 335 startPreview = (startOfDay + TimeUnit.HOURS.toMillis(17)).toTimePreview() 344 - clickOnViewWithId(settingsR.id.tvSettingsUntrackedRangeStart) 336 + clickOnSettingsRangeStartBesideText(coreR.string.settings_untracked_range) 345 337 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(17, 0)) 346 338 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 347 339 checkViewIsDisplayed( 348 - allOf( 349 - withId(settingsR.id.tvSettingsUntrackedRangeStart), 340 + settingsRangeStartBesideText( 341 + coreR.string.settings_untracked_range, 350 342 withText(startPreview), 351 343 ), 352 344 ) 353 345 endPreview = (startOfDay + TimeUnit.HOURS.toMillis(8)).toTimePreview() 354 - clickOnViewWithId(settingsR.id.tvSettingsUntrackedRangeEnd) 346 + clickOnSettingsRangeEndBesideText(coreR.string.settings_untracked_range) 355 347 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(8, 0)) 356 348 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 357 349 checkViewIsDisplayed( 358 - allOf( 359 - withId(settingsR.id.tvSettingsUntrackedRangeEnd), 350 + settingsRangeEndBesideText( 351 + coreR.string.settings_untracked_range, 360 352 withText(endPreview), 361 353 ), 362 354 ) ··· 408 400 409 401 // Change setting 410 402 NavUtils.openSettingsScreen() 411 - onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).perform(nestedScrollTo()) 412 - tryAction { onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).check(matches(isChecked())) } 413 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsAllowMultitasking)) 414 - onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).check(matches(isNotChecked())) 403 + scrollSettingsRecyclerToText(coreR.string.settings_allow_multitasking) 404 + tryAction { checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_allow_multitasking)) } 405 + clickOnSettingsCheckboxBesideText(coreR.string.settings_allow_multitasking) 406 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_allow_multitasking)) 415 407 416 408 // Click on one not running 417 409 NavUtils.openRunningRecordsScreen() ··· 457 449 458 450 // Change setting back 459 451 NavUtils.openSettingsScreen() 460 - onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).perform(nestedScrollTo()) 461 - onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).check(matches(isNotChecked())) 462 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsAllowMultitasking)) 463 - onView(withId(settingsR.id.checkboxSettingsAllowMultitasking)).check(matches(isChecked())) 452 + scrollSettingsRecyclerToText(coreR.string.settings_allow_multitasking) 453 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_allow_multitasking)) 454 + clickOnSettingsCheckboxBesideText(coreR.string.settings_allow_multitasking) 455 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_allow_multitasking)) 464 456 465 457 // Start another timer 466 458 NavUtils.openRunningRecordsScreen() ··· 497 489 testUtils.addActivity(name2) 498 490 499 491 // Start one timer 492 + Thread.sleep(1000) 500 493 tryAction { clickOnViewWithText(name1) } 501 494 502 495 // Change settings 503 496 NavUtils.openSettingsScreen() 504 497 NavUtils.openSettingsNotifications() 505 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).perform(nestedScrollTo()) 506 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).check(matches(isNotChecked())) 507 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotifications)) 508 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).check(matches(isChecked())) 498 + scrollSettingsRecyclerToText(coreR.string.settings_show_notifications) 499 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications)) 500 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications) 501 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications)) 509 502 510 503 // Stop first timer 511 504 NavUtils.openRunningRecordsScreen() ··· 516 509 517 510 // Change settings 518 511 NavUtils.openSettingsScreen() 519 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).perform(nestedScrollTo()) 520 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).check(matches(isChecked())) 521 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotifications)) 522 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).check(matches(isNotChecked())) 512 + scrollSettingsRecyclerToText(coreR.string.settings_show_notifications) 513 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications)) 514 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications) 515 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications)) 523 516 } 524 517 525 518 @Test ··· 528 521 NavUtils.openSettingsNotifications() 529 522 530 523 // Check settings 531 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).perform(nestedScrollTo()) 532 - checkViewIsNotDisplayed(withText(coreR.string.settings_show_notifications_controls)) 533 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsShowNotificationsControls)) 524 + scrollSettingsRecyclerToText(coreR.string.settings_show_notifications) 525 + checkViewDoesNotExist(withText(coreR.string.settings_show_notifications_controls)) 534 526 535 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotifications)) 536 - onView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)).perform(nestedScrollTo()) 527 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications) 528 + scrollSettingsRecyclerToText(coreR.string.settings_show_notifications_controls) 537 529 checkViewIsDisplayed(withText(coreR.string.settings_show_notifications_controls)) 538 - onView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)).check(matches(isChecked())) 539 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)) 540 - onView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)).check(matches(isNotChecked())) 541 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)) 542 - onView(withId(settingsR.id.checkboxSettingsShowNotificationsControls)).check(matches(isChecked())) 530 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications_controls)) 531 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications_controls) 532 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications_controls)) 533 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications_controls) 534 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_notifications_controls)) 543 535 544 536 // Change settings 545 - onView(withId(settingsR.id.checkboxSettingsShowNotifications)).perform(nestedScrollTo()) 546 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowNotifications)) 547 - checkViewIsNotDisplayed(withText(coreR.string.settings_show_notifications_controls)) 548 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsShowNotificationsControls)) 537 + scrollSettingsRecyclerToText(coreR.string.settings_show_notifications) 538 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_notifications) 539 + checkViewDoesNotExist(withText(coreR.string.settings_show_notifications_controls)) 549 540 } 550 541 551 542 @Test ··· 556 547 // Add activities 557 548 testUtils.addActivity(name1) 558 549 testUtils.addActivity(name2) 550 + Thread.sleep(1000) 559 551 560 552 // Start one timer 561 553 tryAction { clickOnViewWithText(name1) } ··· 566 558 567 559 // Check settings 568 560 NavUtils.openSettingsScreen() 569 - onView(withId(settingsR.id.spinnerSettingsDarkMode)).perform(nestedScrollTo()) 561 + scrollSettingsRecyclerToText(coreR.string.settings_dark_mode) 570 562 checkViewIsDisplayed( 571 - allOf( 572 - withId(settingsR.id.tvSettingsDarkModeValue), 563 + settingsSpinnerValueBesideText( 564 + coreR.string.settings_dark_mode, 573 565 withText(coreR.string.settings_dark_mode_system), 574 566 ), 575 567 ) 576 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsDarkMode) 568 + clickOnSettingsSpinnerBesideText(coreR.string.settings_dark_mode) 577 569 clickOnViewWithText(coreR.string.settings_dark_mode_enabled) 578 570 checkViewIsDisplayed( 579 - allOf( 580 - withId(settingsR.id.tvSettingsDarkModeValue), 571 + settingsSpinnerValueBesideText( 572 + coreR.string.settings_dark_mode, 581 573 withText(coreR.string.settings_dark_mode_enabled), 582 574 ), 583 575 ) ··· 589 581 590 582 // Change settings 591 583 NavUtils.openSettingsScreen() 592 - onView(withId(settingsR.id.spinnerSettingsDarkMode)).perform(nestedScrollTo()) 584 + scrollSettingsRecyclerToText(coreR.string.settings_dark_mode) 593 585 checkViewIsDisplayed( 594 - allOf( 595 - withId(settingsR.id.tvSettingsDarkModeValue), 586 + settingsSpinnerValueBesideText( 587 + coreR.string.settings_dark_mode, 596 588 withText(coreR.string.settings_dark_mode_enabled), 597 589 ), 598 590 ) 599 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsDarkMode) 591 + clickOnSettingsSpinnerBesideText(coreR.string.settings_dark_mode) 600 592 clickOnViewWithText(coreR.string.settings_inactivity_reminder_disabled) 601 593 checkViewIsDisplayed( 602 - allOf( 603 - withId(settingsR.id.tvSettingsDarkModeValue), 594 + settingsSpinnerValueBesideText( 595 + coreR.string.settings_dark_mode, 604 596 withText(coreR.string.settings_inactivity_reminder_disabled), 605 597 ), 606 598 ) ··· 615 607 @Test 616 608 fun changeLanguage() { 617 609 NavUtils.openSettingsScreen() 618 - onView(withId(settingsR.id.spinnerSettingsLanguage)).perform(nestedScrollTo()) 610 + scrollSettingsRecyclerToText(coreR.string.settings_language) 619 611 checkViewIsDisplayed( 620 - allOf( 621 - withId(settingsR.id.tvSettingsLanguageValue), 612 + settingsSpinnerValueBesideText( 613 + coreR.string.settings_dark_mode, 622 614 withText(coreR.string.settings_dark_mode_system), 623 615 ), 624 616 ) 625 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsLanguage) 626 - listOf( 627 - coreR.string.settings_english_language, 628 - coreR.string.settings_arabic_language, 629 - coreR.string.settings_catalan_language, 630 - coreR.string.settings_german_language, 631 - coreR.string.settings_spanish_language, 632 - coreR.string.settings_farsi_language, 633 - coreR.string.settings_french_language, 634 - coreR.string.settings_hindi_language, 635 - coreR.string.settings_indonesian_language, 636 - coreR.string.settings_italian_language, 637 - coreR.string.settings_japanese_language, 638 - coreR.string.settings_korean_language, 639 - coreR.string.settings_dutch_language, 640 - coreR.string.settings_portuguese_language, 641 - coreR.string.settings_russian_language, 642 - coreR.string.settings_swedish_language, 643 - coreR.string.settings_turkish_language, 644 - coreR.string.settings_ukrainian_language, 645 - coreR.string.settings_chinese_simplified_language, 646 - coreR.string.settings_chinese_traditional_language, 647 - ).forEach { 648 - onData(allOf(`is`(instanceOf(String::class.java)), `is`(getString(it)))).perform(scrollTo()) 649 - checkViewIsDisplayed(withText(it)) 650 - } 617 + clickOnSettingsSpinnerBesideText(coreR.string.settings_language) 618 + LanguageInteractor.languageList 619 + .map(languageInteractor::getDisplayName) 620 + .forEach { 621 + onData(allOf(`is`(instanceOf(String::class.java)), `is`(it))).perform(scrollTo()) 622 + checkViewIsDisplayed(withText(it)) 623 + } 651 624 } 652 625 653 626 @Test ··· 670 643 fun feedbackBlock() { 671 644 NavUtils.openSettingsScreen() 672 645 673 - onView(withText(coreR.string.settings_rate)).perform(nestedScrollTo()) 674 - onView(withText(coreR.string.settings_feedback)).perform(nestedScrollTo()) 675 - onView(withText(coreR.string.settings_version)).perform(nestedScrollTo()) 646 + scrollSettingsRecyclerToText(coreR.string.settings_rate) 647 + scrollSettingsRecyclerToText(coreR.string.settings_feedback) 648 + scrollSettingsRecyclerToText(coreR.string.settings_version) 676 649 } 677 650 678 651 @Test 679 652 fun translators() { 680 653 NavUtils.openSettingsScreen() 681 654 682 - onView(withText(coreR.string.settings_translators)).perform(nestedScrollTo()) 683 - listOf( 684 - coreR.string.settings_arabic_translators, 685 - coreR.string.settings_catalan_translators, 686 - coreR.string.settings_german_translators, 687 - coreR.string.settings_spanish_translators, 688 - coreR.string.settings_farsi_translators, 689 - coreR.string.settings_french_translators, 690 - coreR.string.settings_hindi_translators, 691 - coreR.string.settings_indonesian_translators, 692 - coreR.string.settings_italian_translators, 693 - coreR.string.settings_japanese_translators, 694 - coreR.string.settings_korean_translators, 695 - coreR.string.settings_dutch_translators, 696 - coreR.string.settings_portuguese_translators, 697 - coreR.string.settings_russian_translators, 698 - coreR.string.settings_swedish_translators, 699 - coreR.string.settings_turkish_translators, 700 - coreR.string.settings_ukrainian_translators, 701 - coreR.string.settings_chinese_simplified_translators, 702 - coreR.string.settings_chinese_traditional_translators, 703 - ).forEach { 704 - onView(withText(it)).perform(nestedScrollTo()) 705 - checkViewIsDisplayed(withText(it)) 706 - } 655 + scrollSettingsRecyclerToText(coreR.string.settings_translators) 656 + LanguageInteractor.languageList 657 + .filter { it !in listOf(AppLanguage.System, AppLanguage.English) } 658 + .map(languageInteractor::getTranslators) 659 + .forEach { 660 + scrollSettingsRecyclerToText(it) 661 + checkViewIsDisplayed(withText(it)) 662 + } 707 663 } 708 664 709 665 @Test ··· 711 667 // Change settings 712 668 NavUtils.openSettingsScreen() 713 669 NavUtils.openSettingsNotifications() 714 - onView(withId(settingsR.id.groupSettingsInactivityReminder)).perform(nestedScrollTo()) 670 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder) 715 671 checkViewIsDisplayed( 716 - allOf( 717 - withId(settingsR.id.tvSettingsInactivityReminderTime), 672 + settingsSelectorValueBesideText( 673 + coreR.string.settings_inactivity_reminder, 718 674 withText(coreR.string.settings_inactivity_reminder_disabled), 719 675 ), 720 676 ) 721 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 677 + checkViewDoesNotExist(withText(coreR.string.settings_inactivity_reminder_recurrent)) 722 678 723 679 // 1s 724 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 680 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 725 681 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 726 682 clickOnViewWithText(coreR.string.duration_dialog_save) 727 683 checkViewIsDisplayed(withText("1$secondString")) 728 684 729 685 // Check recurrent 730 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 731 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 732 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).check(matches(isNotChecked())) 733 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 734 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).check(matches(isChecked())) 686 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 687 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 688 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 689 + clickOnSettingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent) 690 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 735 691 736 692 // 1m 737 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 693 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 738 694 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 739 695 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 740 696 clickOnViewWithText(coreR.string.duration_dialog_save) 741 697 checkViewIsDisplayed( 742 - allOf(withText("1$minuteString"), withId(settingsR.id.tvSettingsInactivityReminderTime)), 698 + settingsSelectorValueBesideText( 699 + coreR.string.settings_inactivity_reminder, 700 + withText("1$minuteString"), 701 + ), 743 702 ) 744 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 745 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 703 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 704 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 746 705 747 706 // 1h 748 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 707 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 749 708 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 750 709 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 751 710 clickOnViewWithText(coreR.string.duration_dialog_save) 752 711 checkViewIsDisplayed(withText("1$hourString")) 753 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 754 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 712 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 713 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 755 714 756 715 // 1m 1s 757 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 758 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 759 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 760 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 716 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 717 + repeat(3) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 761 718 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 762 719 clickOnViewWithText(coreR.string.duration_dialog_save) 763 720 checkViewIsDisplayed(withText("1$minuteString 01$secondString")) 764 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 765 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 721 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 722 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 766 723 767 724 // 1h 1m 1s 768 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 725 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 769 726 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 770 727 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 771 728 clickOnViewWithText(coreR.string.duration_dialog_save) 772 729 checkViewIsDisplayed(withText("1$hourString 01$minuteString 01$secondString")) 773 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 774 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 730 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 731 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 775 732 776 733 // 1h 30m 777 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 734 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 778 735 clearDuration() 779 736 clickOnViewWithId(dialogsR.id.tvNumberKeyboard9) 780 737 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) ··· 782 739 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 783 740 clickOnViewWithText(coreR.string.duration_dialog_save) 784 741 checkViewIsDisplayed(withText("1$hourString 30$minuteString")) 785 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 786 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 742 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 743 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 787 744 788 745 // 99h 99m 99s 789 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 790 - repeat(10) { clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) } 746 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 747 + repeat(10) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 791 748 repeat(6) { clickOnViewWithId(dialogsR.id.tvNumberKeyboard9) } 792 749 clickOnViewWithText(coreR.string.duration_dialog_save) 793 750 checkViewIsDisplayed(withText("100$hourString 40$minuteString 39$secondString")) 794 - onView(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 795 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 751 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 752 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 796 753 797 754 // Disable 798 - clickOnViewWithId(settingsR.id.groupSettingsInactivityReminder) 755 + clickOnSettingsSelectorBesideText(coreR.string.settings_inactivity_reminder) 799 756 clickOnViewWithText(coreR.string.duration_dialog_disable) 800 757 checkViewIsDisplayed( 801 - allOf( 802 - withId(settingsR.id.tvSettingsInactivityReminderTime), 758 + settingsSelectorValueBesideText( 759 + coreR.string.settings_inactivity_reminder, 803 760 withText(coreR.string.settings_inactivity_reminder_disabled), 804 761 ), 805 762 ) 806 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsInactivityReminderRecurrent)) 763 + checkViewDoesNotExist(withText(coreR.string.settings_inactivity_reminder_recurrent)) 807 764 } 808 765 809 766 @Test ··· 811 768 // Change settings 812 769 NavUtils.openSettingsScreen() 813 770 NavUtils.openSettingsNotifications() 814 - onView(withId(settingsR.id.groupSettingsActivityReminder)).perform(nestedScrollTo()) 771 + scrollSettingsRecyclerToText(coreR.string.settings_activity_reminder) 815 772 checkViewIsDisplayed( 816 - allOf( 817 - withId(settingsR.id.tvSettingsActivityReminderTime), 773 + settingsSelectorValueBesideText( 774 + coreR.string.settings_activity_reminder, 818 775 withText(coreR.string.settings_inactivity_reminder_disabled), 819 776 ), 820 777 ) 821 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 778 + checkViewDoesNotExist(withText(coreR.string.settings_inactivity_reminder_recurrent)) 822 779 823 780 // 1s 824 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 781 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 825 782 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 826 783 clickOnViewWithText(coreR.string.duration_dialog_save) 827 784 checkViewIsDisplayed(withText("1$secondString")) 828 785 829 786 // Check recurrent 830 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 831 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 832 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).check(matches(isNotChecked())) 833 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 834 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).check(matches(isChecked())) 787 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 788 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 789 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 790 + clickOnSettingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent) 791 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 835 792 836 793 // 1m 837 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 794 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 838 795 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 839 796 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 840 797 clickOnViewWithText(coreR.string.duration_dialog_save) 841 798 checkViewIsDisplayed( 842 - allOf(withText("1$minuteString"), withId(settingsR.id.tvSettingsActivityReminderTime)), 799 + settingsSelectorValueBesideText( 800 + coreR.string.settings_activity_reminder, 801 + withText("1$minuteString"), 802 + ), 843 803 ) 844 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 845 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 804 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 805 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 846 806 847 807 // 1h 848 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 808 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 849 809 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 850 810 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 851 811 clickOnViewWithText(coreR.string.duration_dialog_save) 852 812 checkViewIsDisplayed(withText("1$hourString")) 853 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 854 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 813 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 814 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 855 815 856 816 // 1m 1s 857 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 858 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 859 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 860 - clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) 817 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 818 + repeat(3) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 861 819 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 862 820 clickOnViewWithText(coreR.string.duration_dialog_save) 863 821 checkViewIsDisplayed(withText("1$minuteString 01$secondString")) 864 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 865 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 822 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 823 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 866 824 867 825 // 1h 1m 1s 868 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 826 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 869 827 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 870 828 clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) 871 829 clickOnViewWithText(coreR.string.duration_dialog_save) 872 830 checkViewIsDisplayed(withText("1$hourString 01$minuteString 01$secondString")) 873 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 874 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 831 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 832 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 875 833 876 834 // 1h 30m 877 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 835 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 878 836 clearDuration() 879 837 clickOnViewWithId(dialogsR.id.tvNumberKeyboard9) 880 838 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) ··· 882 840 clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) 883 841 clickOnViewWithText(coreR.string.duration_dialog_save) 884 842 checkViewIsDisplayed(withText("1$hourString 30$minuteString")) 885 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 886 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 843 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 844 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 887 845 888 846 // 99h 99m 99s 889 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 890 - repeat(10) { clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) } 847 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 848 + repeat(10) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 891 849 repeat(6) { clickOnViewWithId(dialogsR.id.tvNumberKeyboard9) } 892 850 clickOnViewWithText(coreR.string.duration_dialog_save) 893 851 checkViewIsDisplayed(withText("100$hourString 40$minuteString 39$secondString")) 894 - onView(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)).perform(nestedScrollTo()) 895 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 852 + scrollSettingsRecyclerToText(coreR.string.settings_inactivity_reminder_recurrent) 853 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_inactivity_reminder_recurrent)) 896 854 897 855 // Disable 898 - clickOnViewWithId(settingsR.id.groupSettingsActivityReminder) 856 + clickOnSettingsSelectorBesideText(coreR.string.settings_activity_reminder) 899 857 clickOnViewWithText(coreR.string.duration_dialog_disable) 900 858 checkViewIsDisplayed( 901 - allOf( 902 - withId(settingsR.id.tvSettingsActivityReminderTime), 859 + settingsSelectorValueBesideText( 860 + coreR.string.settings_activity_reminder, 903 861 withText(coreR.string.settings_inactivity_reminder_disabled), 904 862 ), 905 863 ) 906 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsActivityReminderRecurrent)) 864 + checkViewDoesNotExist(withText(coreR.string.settings_inactivity_reminder_recurrent)) 907 865 } 908 866 909 867 @Test ··· 916 874 // Change settings 917 875 NavUtils.openSettingsScreen() 918 876 NavUtils.openSettingsAdditional() 919 - onView(withId(settingsR.id.groupSettingsIgnoreShortRecords)).perform(nestedScrollTo()) 877 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_records) 920 878 checkViewIsDisplayed( 921 - allOf( 922 - withId(settingsR.id.tvSettingsIgnoreShortRecordsTime), 879 + settingsSelectorValueBesideText( 880 + coreR.string.settings_ignore_short_records, 923 881 withText(coreR.string.settings_inactivity_reminder_disabled), 924 882 ), 925 883 ) 926 884 927 - clickOnViewWithId(settingsR.id.groupSettingsIgnoreShortRecords) 885 + clickOnSettingsSelectorBesideText(coreR.string.settings_ignore_short_records) 928 886 clickOnViewWithId(dialogsR.id.tvNumberKeyboard3) 929 887 clickOnViewWithText(coreR.string.duration_dialog_save) 930 888 checkViewIsDisplayed(withText("3$secondString")) ··· 938 896 939 897 // Disable 940 898 NavUtils.openSettingsScreen() 941 - onView(withId(settingsR.id.groupSettingsIgnoreShortRecords)).perform(nestedScrollTo()) 942 - clickOnViewWithId(settingsR.id.groupSettingsIgnoreShortRecords) 899 + scrollSettingsRecyclerToText(coreR.string.settings_ignore_short_records) 900 + clickOnSettingsSelectorBesideText(coreR.string.settings_ignore_short_records) 943 901 clickOnViewWithText(coreR.string.duration_dialog_disable) 944 902 checkViewIsDisplayed( 945 - allOf( 946 - withId(settingsR.id.tvSettingsIgnoreShortRecordsTime), 903 + settingsSelectorValueBesideText( 904 + coreR.string.settings_ignore_short_records, 947 905 withText(coreR.string.settings_inactivity_reminder_disabled), 948 906 ), 949 907 ) ··· 961 919 // Check settings 962 920 NavUtils.openSettingsScreen() 963 921 NavUtils.openSettingsDisplay() 964 - onView(withId(settingsR.id.tvSettingsUseMilitaryTimeHint)).perform(nestedScrollTo()) 965 - onView(withId(settingsR.id.checkboxSettingsUseMilitaryTime)).check(matches(isChecked())) 966 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsUseMilitaryTimeHint), withText("13:00"))) 922 + scrollSettingsRecyclerToText(coreR.string.settings_use_military_time) 923 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_use_military_time)) 924 + checkViewIsDisplayed( 925 + settingsSubtitleBesideText(coreR.string.settings_use_military_time, withText("13:00")), 926 + ) 967 927 968 928 // Change settings 969 - clickOnViewWithId(settingsR.id.checkboxSettingsUseMilitaryTime) 970 - onView(withId(settingsR.id.checkboxSettingsUseMilitaryTime)).check(matches(isNotChecked())) 971 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsUseMilitaryTimeHint), withSubstring("1:00"))) 929 + clickOnSettingsCheckboxBesideText(coreR.string.settings_use_military_time) 930 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_use_military_time)) 931 + checkViewIsDisplayed( 932 + settingsSubtitleBesideText(coreR.string.settings_use_military_time, withSubstring("1:00")), 933 + ) 972 934 973 935 // Change settings 974 - clickOnViewWithId(settingsR.id.checkboxSettingsUseMilitaryTime) 975 - onView(withId(settingsR.id.checkboxSettingsUseMilitaryTime)).check(matches(isChecked())) 976 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsUseMilitaryTimeHint), withText("13:00"))) 936 + clickOnSettingsCheckboxBesideText(coreR.string.settings_use_military_time) 937 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_use_military_time)) 938 + checkViewIsDisplayed( 939 + settingsSubtitleBesideText(coreR.string.settings_use_military_time, withText("13:00")), 940 + ) 977 941 } 978 942 979 943 @Test ··· 1008 972 // Check settings 1009 973 NavUtils.openSettingsScreen() 1010 974 NavUtils.openSettingsDisplay() 1011 - onView(withId(settingsR.id.tvSettingsUseProportionalMinutesHint)).perform(nestedScrollTo()) 1012 - onView(withId(settingsR.id.checkboxSettingsUseProportionalMinutes)).check(matches(isNotChecked())) 975 + scrollSettingsRecyclerToText(coreR.string.settings_use_proportional_minutes) 976 + 977 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_use_proportional_minutes)) 1013 978 checkViewIsDisplayed( 1014 - allOf(withId(settingsR.id.tvSettingsUseProportionalMinutesHint), withText(timeFormat1)), 979 + settingsSubtitleBesideText(coreR.string.settings_use_proportional_minutes, withText(timeFormat1)), 1015 980 ) 1016 981 1017 982 // Change settings 1018 - clickOnViewWithId(settingsR.id.checkboxSettingsUseProportionalMinutes) 1019 - onView(withId(settingsR.id.checkboxSettingsUseProportionalMinutes)).check(matches(isChecked())) 983 + clickOnSettingsCheckboxBesideText(coreR.string.settings_use_proportional_minutes) 984 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_use_proportional_minutes)) 1020 985 checkViewIsDisplayed( 1021 - allOf(withId(settingsR.id.tvSettingsUseProportionalMinutesHint), withSubstring(timeFormat2)), 986 + settingsSubtitleBesideText(coreR.string.settings_use_proportional_minutes, withText(timeFormat2)), 1022 987 ) 1023 988 1024 989 // Check format after setting change ··· 1026 991 1027 992 // Change settings back 1028 993 NavUtils.openSettingsScreen() 1029 - onView(withId(settingsR.id.tvSettingsUseProportionalMinutesHint)).perform(nestedScrollTo()) 1030 - clickOnViewWithId(settingsR.id.checkboxSettingsUseProportionalMinutes) 1031 - onView(withId(settingsR.id.checkboxSettingsUseProportionalMinutes)).check(matches(isNotChecked())) 994 + scrollSettingsRecyclerToText(coreR.string.settings_use_proportional_minutes) 995 + clickOnSettingsCheckboxBesideText(coreR.string.settings_use_proportional_minutes) 996 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_use_proportional_minutes)) 1032 997 checkViewIsDisplayed( 1033 - allOf(withId(settingsR.id.tvSettingsUseProportionalMinutesHint), withText(timeFormat1)), 998 + settingsSubtitleBesideText(coreR.string.settings_use_proportional_minutes, withText(timeFormat1)), 1034 999 ) 1035 1000 1036 1001 // Check format again ··· 1042 1007 // Check settings 1043 1008 NavUtils.openSettingsScreen() 1044 1009 NavUtils.openSettingsDisplay() 1045 - onView(withId(settingsR.id.tvSettingsKeepScreenOn)).perform(nestedScrollTo()) 1046 - onView(withId(settingsR.id.checkboxSettingsKeepScreenOn)).check(matches(isNotChecked())) 1010 + scrollSettingsRecyclerToText(coreR.string.settings_keep_screen_on) 1011 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_keep_screen_on)) 1047 1012 1048 1013 // Change settings 1049 - clickOnViewWithId(settingsR.id.checkboxSettingsKeepScreenOn) 1050 - onView(withId(settingsR.id.checkboxSettingsKeepScreenOn)).check(matches(isChecked())) 1014 + clickOnSettingsCheckboxBesideText(coreR.string.settings_keep_screen_on) 1015 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_keep_screen_on)) 1051 1016 1052 1017 // Change settings 1053 - clickOnViewWithId(settingsR.id.checkboxSettingsKeepScreenOn) 1054 - onView(withId(settingsR.id.checkboxSettingsKeepScreenOn)).check(matches(isNotChecked())) 1018 + clickOnSettingsCheckboxBesideText(coreR.string.settings_keep_screen_on) 1019 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_keep_screen_on)) 1055 1020 } 1056 1021 1057 1022 @Test ··· 1086 1051 // Change setting 1087 1052 NavUtils.openSettingsScreen() 1088 1053 NavUtils.openSettingsAdditional() 1089 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsFirstDayOfWeek) 1054 + scrollSettingsRecyclerToText(coreR.string.settings_first_day_of_week) 1055 + clickOnSettingsSpinnerBesideText(coreR.string.settings_first_day_of_week) 1090 1056 if (isTodaySunday) { 1091 1057 clickOnViewWithText(coreR.string.day_of_week_monday) 1092 1058 } else { ··· 1133 1099 1134 1100 // Change setting 1135 1101 NavUtils.openSettingsScreen() 1136 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsFirstDayOfWeek) 1102 + clickOnSettingsSpinnerBesideText(coreR.string.settings_first_day_of_week) 1137 1103 if (isTodaySunday) { 1138 1104 clickOnViewWithText(coreR.string.day_of_week_sunday) 1139 1105 } else { ··· 1252 1218 // Check setting 1253 1219 NavUtils.openSettingsScreen() 1254 1220 NavUtils.openSettingsAdditional() 1255 - onView(withId(settingsR.id.tvSettingsStartOfDayTime)).perform(nestedScrollTo()) 1256 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1257 - checkViewIsNotDisplayed(withId(settingsR.id.btnSettingsStartOfDaySign)) 1221 + scrollSettingsRecyclerToText(coreR.string.settings_start_of_day) 1222 + checkViewIsDisplayed( 1223 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1224 + ) 1225 + checkViewIsNotDisplayed(settingsButtonBesideText(coreR.string.settings_start_of_day)) 1258 1226 1259 1227 // Change setting to +1 1260 - clickOnView(withId(settingsR.id.groupSettingsStartOfDay)) 1228 + clickOnSettingsSelectorBesideText(coreR.string.settings_start_of_day) 1261 1229 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(1, 0)) 1262 1230 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 1263 1231 startOfDayTimeStamp = calendar.timeInMillis + TimeUnit.HOURS.toMillis(1) 1264 1232 startOfDayPreview = startOfDayTimeStamp.toTimePreview() 1265 1233 1266 1234 // Check new setting 1267 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1268 1235 checkViewIsDisplayed( 1269 - allOf(withId(settingsR.id.btnSettingsStartOfDaySign), hasDescendant(withText(coreR.string.plus_sign))), 1236 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1237 + ) 1238 + checkViewIsDisplayed( 1239 + settingsButtonBesideText( 1240 + coreR.string.settings_start_of_day, hasDescendant(withText(coreR.string.plus_sign)), 1241 + ), 1270 1242 ) 1271 1243 1272 1244 // Check records ··· 1306 1278 1307 1279 // Change setting to -1 1308 1280 NavUtils.openSettingsScreen() 1309 - onView(withId(settingsR.id.btnSettingsStartOfDaySign)).perform(nestedScrollTo(), click()) 1281 + scrollSettingsRecyclerToText(coreR.string.settings_start_of_day) 1282 + clickOnSettingsButtonBesideText(coreR.string.settings_start_of_day) 1310 1283 1311 1284 // Check new setting 1312 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1313 1285 checkViewIsDisplayed( 1314 - allOf(withId(settingsR.id.btnSettingsStartOfDaySign), hasDescendant(withText(coreR.string.minus_sign))), 1286 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1287 + ) 1288 + checkViewIsDisplayed( 1289 + settingsButtonBesideText( 1290 + coreR.string.settings_start_of_day, hasDescendant(withText(coreR.string.minus_sign)), 1291 + ), 1315 1292 ) 1316 1293 1317 1294 startOfDayTimeStamp = calendar.timeInMillis - TimeUnit.HOURS.toMillis(1) ··· 1357 1334 startOfDayPreview = startOfDayTimeStamp.toTimePreview() 1358 1335 1359 1336 NavUtils.openSettingsScreen() 1360 - onView(withId(settingsR.id.groupSettingsStartOfDay)).perform(nestedScrollTo(), click()) 1337 + scrollSettingsRecyclerToText(coreR.string.settings_start_of_day) 1338 + clickOnSettingsSelectorBesideText(coreR.string.settings_start_of_day) 1361 1339 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(2, 0)) 1362 1340 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 1363 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1364 1341 checkViewIsDisplayed( 1365 - allOf(withId(settingsR.id.btnSettingsStartOfDaySign), hasDescendant(withText(coreR.string.minus_sign))), 1342 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1366 1343 ) 1367 - onView(withId(settingsR.id.btnSettingsStartOfDaySign)).perform(nestedScrollTo(), click()) 1368 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1344 + checkViewIsDisplayed( 1345 + settingsButtonBesideText( 1346 + coreR.string.settings_start_of_day, hasDescendant(withText(coreR.string.minus_sign)), 1347 + ), 1348 + ) 1349 + clickOnSettingsButtonBesideText(coreR.string.settings_start_of_day) 1350 + checkViewIsDisplayed( 1351 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1352 + ) 1369 1353 1370 1354 // Check records 1371 1355 NavUtils.openRecordsScreen() ··· 1406 1390 startOfDayPreview = startOfDayTimeStamp.toTimePreview() 1407 1391 1408 1392 NavUtils.openSettingsScreen() 1409 - onView(withId(settingsR.id.groupSettingsStartOfDay)).perform(nestedScrollTo(), click()) 1393 + scrollSettingsRecyclerToText(coreR.string.settings_start_of_day) 1394 + clickOnSettingsSelectorBesideText(coreR.string.settings_start_of_day) 1410 1395 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(0, 0)) 1411 1396 clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) 1412 - checkViewIsDisplayed(allOf(withId(settingsR.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 1413 - checkViewIsNotDisplayed(withId(settingsR.id.btnSettingsStartOfDaySign)) 1397 + checkViewIsDisplayed( 1398 + settingsSelectorValueBesideText(coreR.string.settings_start_of_day, withText(startOfDayPreview)), 1399 + ) 1400 + checkViewIsNotDisplayed(settingsButtonBesideText(coreR.string.settings_start_of_day)) 1414 1401 } 1415 1402 1416 1403 @Test ··· 1429 1416 // Change setting 1430 1417 NavUtils.openSettingsScreen() 1431 1418 NavUtils.openSettingsAdditional() 1432 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 1433 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).check(matches(isNotChecked())) 1434 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 1435 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).check(matches(isChecked())) 1419 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection) 1420 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection)) 1421 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection) 1422 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection)) 1436 1423 1437 1424 // No tags - started right away 1438 1425 NavUtils.openRunningRecordsScreen() ··· 1464 1451 1465 1452 // Change setting 1466 1453 NavUtils.openSettingsScreen() 1467 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 1468 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).check(matches(isChecked())) 1469 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 1470 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).check(matches(isNotChecked())) 1454 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection) 1455 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection)) 1456 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection) 1457 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection)) 1471 1458 1472 1459 // Start with tags - no dialog 1473 1460 NavUtils.openRunningRecordsScreen() ··· 1492 1479 // Change setting 1493 1480 NavUtils.openSettingsScreen() 1494 1481 NavUtils.openSettingsAdditional() 1495 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 1496 - checkViewIsNotDisplayed(withText(coreR.string.settings_show_record_tag_close_hint)) 1497 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)) 1482 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection) 1483 + checkViewDoesNotExist(withText(coreR.string.settings_show_record_tag_close_hint)) 1498 1484 1499 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 1500 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).perform(nestedScrollTo()) 1485 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection) 1486 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_close_hint) 1501 1487 checkViewIsDisplayed(withText(coreR.string.settings_show_record_tag_close_hint)) 1502 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).check(matches(isNotChecked())) 1503 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)) 1504 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).check(matches(isChecked())) 1488 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint)) 1489 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint) 1490 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint)) 1505 1491 1506 1492 // No tags - started right away 1507 1493 NavUtils.openRunningRecordsScreen() ··· 1519 1505 1520 1506 // Change setting 1521 1507 NavUtils.openSettingsScreen() 1522 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).perform(nestedScrollTo()) 1523 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).check(matches(isChecked())) 1524 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)) 1525 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)).check(matches(isNotChecked())) 1508 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_close_hint) 1509 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint)) 1510 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint) 1511 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_close_hint)) 1526 1512 1527 1513 // Start with several tags 1528 1514 NavUtils.openRunningRecordsScreen() ··· 1534 1520 1535 1521 // Change setting 1536 1522 NavUtils.openSettingsScreen() 1537 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 1523 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection) 1538 1524 checkViewIsDisplayed(withText(coreR.string.settings_show_record_tag_close_hint)) 1539 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)) 1540 1525 1541 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 1542 - checkViewIsNotDisplayed(withText(coreR.string.settings_show_record_tag_close_hint)) 1543 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsRecordTagSelectionClose)) 1526 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection) 1527 + checkViewDoesNotExist(withText(coreR.string.settings_show_record_tag_close_hint)) 1544 1528 } 1545 1529 1546 1530 @Test ··· 1557 1541 // Change setting 1558 1542 NavUtils.openSettingsScreen() 1559 1543 NavUtils.openSettingsAdditional() 1560 - onView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)).perform(nestedScrollTo()) 1561 - checkViewIsNotDisplayed(withText(coreR.string.settings_show_record_tag_general_hint)) 1562 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)) 1544 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_selection) 1545 + checkViewDoesNotExist(withText(coreR.string.settings_show_record_tag_general_hint)) 1563 1546 1564 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordTagSelection)) 1565 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).perform(nestedScrollTo()) 1547 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_selection) 1548 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_general_hint) 1566 1549 checkViewIsDisplayed(withText(coreR.string.settings_show_record_tag_general_hint)) 1567 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).check(matches(isNotChecked())) 1568 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)) 1569 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).check(matches(isChecked())) 1550 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint)) 1551 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint) 1552 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint)) 1570 1553 1571 1554 // No tags - started right away 1572 1555 NavUtils.openRunningRecordsScreen() ··· 1584 1567 1585 1568 // Change setting 1586 1569 NavUtils.openSettingsScreen() 1587 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).perform(nestedScrollTo()) 1588 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).check(matches(isChecked())) 1589 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)) 1590 - onView(withId(settingsR.id.checkboxSettingsRecordTagSelectionGeneral)).check(matches(isNotChecked())) 1570 + scrollSettingsRecyclerToText(coreR.string.settings_show_record_tag_general_hint) 1571 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint)) 1572 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint) 1573 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_record_tag_general_hint)) 1591 1574 1592 1575 // Start with tags - no dialog 1593 1576 NavUtils.openRunningRecordsScreen() ··· 1599 1582 fun csvExportSettings() { 1600 1583 NavUtils.openSettingsScreen() 1601 1584 NavUtils.openSettingsExportImport() 1602 - onView(withId(settingsR.id.layoutSettingsExportCsv)).perform(nestedScrollTo(), click()) 1585 + scrollSettingsRecyclerToText(coreR.string.settings_export_csv) 1586 + clickOnSettingsRecyclerText(coreR.string.settings_export_csv) 1603 1587 1604 1588 // View is set up 1605 1589 val currentTime = System.currentTimeMillis() ··· 1696 1680 // Change setting 1697 1681 NavUtils.openSettingsScreen() 1698 1682 NavUtils.openSettingsDisplay() 1699 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).perform(nestedScrollTo()) 1700 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).check(matches(isNotChecked())) 1701 - checkViewIsNotDisplayed(withText(coreR.string.settings_reverse_order_in_calendar)) 1702 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)) 1703 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)) 1704 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).check(matches(isChecked())) 1683 + scrollSettingsRecyclerToText(coreR.string.settings_show_records_calendar) 1684 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_records_calendar)) 1685 + checkViewDoesNotExist(withText(coreR.string.settings_reverse_order_in_calendar)) 1686 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_records_calendar) 1687 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_records_calendar)) 1705 1688 1706 1689 // Record is not shown 1707 1690 NavUtils.openRecordsScreen() ··· 1712 1695 1713 1696 // Check reverse order 1714 1697 NavUtils.openSettingsScreen() 1715 - onView(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)).perform(nestedScrollTo()) 1716 - checkViewIsDisplayed(withText(coreR.string.settings_reverse_order_in_calendar)) 1717 - checkViewIsDisplayed(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)) 1718 - onView(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)).check(matches(isNotChecked())) 1719 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)) 1720 - onView(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)).check(matches(isChecked())) 1698 + scrollSettingsRecyclerToText(coreR.string.settings_reverse_order_in_calendar) 1699 + checkViewIsDisplayed(settingsCheckboxBesideText(coreR.string.settings_reverse_order_in_calendar)) 1700 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_reverse_order_in_calendar)) 1701 + clickOnSettingsCheckboxBesideText(coreR.string.settings_reverse_order_in_calendar) 1702 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_reverse_order_in_calendar)) 1721 1703 NavUtils.openRecordsScreen() 1722 1704 1723 1705 // Change setting 1724 1706 NavUtils.openSettingsScreen() 1725 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).perform(nestedScrollTo()) 1726 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).check(matches(isChecked())) 1727 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)) 1728 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).check(matches(isNotChecked())) 1729 - checkViewIsNotDisplayed(withText(coreR.string.settings_reverse_order_in_calendar)) 1730 - checkViewIsNotDisplayed(withId(settingsR.id.checkboxSettingsReverseOrderInCalendar)) 1707 + scrollSettingsRecyclerToText(coreR.string.settings_show_records_calendar) 1708 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_records_calendar)) 1709 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_records_calendar) 1710 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_records_calendar)) 1711 + checkViewDoesNotExist(withText(coreR.string.settings_reverse_order_in_calendar)) 1731 1712 1732 1713 // Record is shown 1733 1714 NavUtils.openRecordsScreen() ··· 1754 1735 1755 1736 NavUtils.openSettingsScreen() 1756 1737 NavUtils.openSettingsDisplay() 1757 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).perform(nestedScrollTo()) 1758 - onView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)).check(matches(isNotChecked())) 1759 - checkViewIsNotDisplayed(withText(coreR.string.settings_days_in_calendar)) 1738 + scrollSettingsRecyclerToText(coreR.string.settings_show_records_calendar) 1739 + checkViewDoesNotExist(withText(coreR.string.settings_days_in_calendar)) 1760 1740 1761 1741 // Change setting 1762 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)) 1763 - onView(withText(coreR.string.settings_days_in_calendar)).perform(nestedScrollTo()) 1742 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_records_calendar) 1743 + scrollSettingsRecyclerToText(coreR.string.settings_days_in_calendar) 1764 1744 checkViewIsDisplayed(withText(coreR.string.settings_days_in_calendar)) 1765 1745 1766 1746 // One day ··· 1769 1749 1770 1750 // Three days 1771 1751 NavUtils.openSettingsScreen() 1772 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsDaysInCalendar) 1752 + clickOnSettingsSpinnerBesideText(coreR.string.settings_days_in_calendar) 1773 1753 clickOnViewWithText("3") 1774 1754 NavUtils.openRecordsScreen() 1775 1755 ··· 1783 1763 1784 1764 // Five days 1785 1765 NavUtils.openSettingsScreen() 1786 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsDaysInCalendar) 1766 + clickOnSettingsSpinnerBesideText(coreR.string.settings_days_in_calendar) 1787 1767 clickOnViewWithText("5") 1788 1768 NavUtils.openRecordsScreen() 1789 1769 ··· 1797 1777 1798 1778 // Seven days 1799 1779 NavUtils.openSettingsScreen() 1800 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsDaysInCalendar) 1780 + clickOnSettingsSpinnerBesideText(coreR.string.settings_days_in_calendar) 1801 1781 clickOnViewWithText("7") 1802 1782 NavUtils.openRecordsScreen() 1803 1783 ··· 1811 1791 1812 1792 // Disable 1813 1793 NavUtils.openSettingsScreen() 1814 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowRecordsCalendar)) 1815 - checkViewIsNotDisplayed(withText(coreR.string.settings_days_in_calendar)) 1794 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_records_calendar) 1795 + checkViewDoesNotExist(withText(coreR.string.settings_days_in_calendar)) 1816 1796 NavUtils.openRecordsScreen() 1817 1797 checkViewIsDisplayed(allOf(withText(coreR.string.title_today), isCompletelyDisplayed())) 1818 1798 } ··· 1837 1817 // Change setting 1838 1818 NavUtils.openSettingsScreen() 1839 1819 NavUtils.openSettingsAdditional() 1840 - onView(withId(settingsR.id.checkboxSettingsKeepStatisticsRange)).perform(nestedScrollTo()) 1841 - onView(withId(settingsR.id.checkboxSettingsKeepStatisticsRange)).check(matches(isNotChecked())) 1842 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsKeepStatisticsRange)) 1843 - onView(withId(settingsR.id.checkboxSettingsKeepStatisticsRange)).check(matches(isChecked())) 1820 + scrollSettingsRecyclerToText(coreR.string.settings_keep_statistics_range) 1821 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_keep_statistics_range)) 1822 + clickOnSettingsCheckboxBesideText(coreR.string.settings_keep_statistics_range) 1823 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_keep_statistics_range)) 1844 1824 1845 1825 // Check range transfer 1846 1826 NavUtils.openStatisticsScreen() ··· 1854 1834 fun automatedTracking() { 1855 1835 NavUtils.openSettingsScreen() 1856 1836 NavUtils.openSettingsAdditional() 1857 - onView(withId(settingsR.id.btnSettingsAutomatedTracking)).perform(nestedScrollTo(), click()) 1837 + scrollSettingsRecyclerToText(coreR.string.settings_automated_tracking) 1838 + clickOnSettingsButtonBesideText(coreR.string.settings_automated_tracking) 1858 1839 checkViewIsDisplayed( 1859 1840 allOf(withId(dialogsR.id.tvHelpDialogTitle), withText(coreR.string.settings_automated_tracking)), 1860 1841 ) ··· 1870 1851 // Change setting 1871 1852 NavUtils.openSettingsScreen() 1872 1853 NavUtils.openSettingsAdditional() 1873 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).perform(nestedScrollTo()) 1874 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).check(matches(isNotChecked())) 1875 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)) 1876 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).check(matches(isChecked())) 1854 + scrollSettingsRecyclerToText(coreR.string.settings_automated_tracking_send_events) 1855 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events)) 1856 + clickOnSettingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events) 1857 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events)) 1877 1858 1878 1859 // Start stop activity 1879 1860 NavUtils.openRunningRecordsScreen() ··· 1882 1863 1883 1864 // Change setting 1884 1865 NavUtils.openSettingsScreen() 1885 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).perform(nestedScrollTo()) 1886 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).check(matches(isChecked())) 1887 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)) 1888 - onView(withId(settingsR.id.checkboxSettingsAutomatedTrackingSend)).check(matches(isNotChecked())) 1866 + scrollSettingsRecyclerToText(coreR.string.settings_automated_tracking_send_events) 1867 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events)) 1868 + clickOnSettingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events) 1869 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_automated_tracking_send_events)) 1889 1870 1890 1871 // Start stop activity 1891 1872 NavUtils.openRunningRecordsScreen() ··· 1910 1891 // Check settings 1911 1892 NavUtils.openSettingsScreen() 1912 1893 NavUtils.openSettingsDisplay() 1913 - onView(withId(settingsR.id.checkboxSettingsShowActivityFilters)).perform(nestedScrollTo()) 1914 - onView(withId(settingsR.id.checkboxSettingsShowActivityFilters)).check(matches(isNotChecked())) 1894 + scrollSettingsRecyclerToText(coreR.string.settings_show_activity_filters) 1895 + checkCheckboxIsNotChecked(settingsCheckboxBesideText(coreR.string.settings_show_activity_filters)) 1915 1896 1916 1897 // Change setting 1917 - unconstrainedClickOnView(withId(settingsR.id.checkboxSettingsShowActivityFilters)) 1918 - onView(withId(settingsR.id.checkboxSettingsShowActivityFilters)).check(matches(isChecked())) 1898 + clickOnSettingsCheckboxBesideText(coreR.string.settings_show_activity_filters) 1899 + checkCheckboxIsChecked(settingsCheckboxBesideText(coreR.string.settings_show_activity_filters)) 1919 1900 1920 1901 // Filters shown 1921 1902 NavUtils.openRunningRecordsScreen() ··· 1946 1927 // Check 1947 1928 NavUtils.openSettingsScreen() 1948 1929 NavUtils.openSettingsAdditional() 1949 - onView(withId(settingsR.id.spinnerSettingsRepeatButtonType)).perform(nestedScrollTo()) 1930 + scrollSettingsRecyclerToText(coreR.string.settings_repeat_button_type) 1950 1931 checkViewIsDisplayed( 1951 - allOf( 1952 - withId(settingsR.id.tvSettingsRepeatButtonTypeValue), 1932 + settingsSpinnerValueBesideText( 1933 + coreR.string.settings_repeat_button_type, 1953 1934 withText(coreR.string.settings_repeat_last_record), 1954 1935 ), 1955 1936 ) ··· 1961 1942 1962 1943 // Change 1963 1944 NavUtils.openSettingsScreen() 1964 - clickOnSpinnerWithId(settingsR.id.spinnerSettingsRepeatButtonType) 1945 + clickOnSettingsSpinnerBesideText(coreR.string.settings_repeat_button_type) 1965 1946 clickOnViewWithText(coreR.string.settings_repeat_one_before_last) 1966 1947 NavUtils.openRunningRecordsScreen() 1967 1948 clickOnView(allOf(withText(type2), isCompletelyDisplayed())) ··· 1971 1952 } 1972 1953 1973 1954 private fun clearDuration() { 1974 - repeat(6) { clickOnViewWithId(dialogsR.id.ivDurationPickerDelete) } 1955 + repeat(6) { clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) } 1975 1956 } 1976 1957 1977 1958 private fun checkRecord(
+174
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTestUtils.kt
··· 1 + package com.example.util.simpletimetracker 2 + 3 + import android.view.View 4 + import androidx.annotation.StringRes 5 + import androidx.test.espresso.Espresso.onView 6 + import androidx.test.espresso.Espresso.pressBack 7 + import androidx.test.espresso.contrib.RecyclerViewActions.scrollTo 8 + import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 9 + import androidx.test.espresso.matcher.ViewMatchers.hasSibling 10 + import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA 11 + import androidx.test.espresso.matcher.ViewMatchers.withId 12 + import androidx.test.espresso.matcher.ViewMatchers.withText 13 + import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerViewHolder 14 + import com.example.util.simpletimetracker.utils.clickOnView 15 + import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 16 + import org.hamcrest.CoreMatchers.allOf 17 + import org.hamcrest.Matcher 18 + import com.example.util.simpletimetracker.feature_settings.R as settingsR 19 + 20 + // Scroll 21 + 22 + fun scrollSettingsRecyclerToText(@StringRes id: Int) { 23 + scrollSettingsRecyclerToView(hasDescendant(withText(id))) 24 + } 25 + 26 + fun scrollSettingsRecyclerToText(text: String) { 27 + scrollSettingsRecyclerToView(hasDescendant(withText(text))) 28 + } 29 + 30 + // Click 31 + 32 + fun clickOnSettingsRecyclerText(@StringRes id: Int) { 33 + clickOnSettingsRecyclerItem(withText(id)) 34 + } 35 + 36 + fun clickOnSettingsCheckboxBesideText(@StringRes id: Int) { 37 + unconstrainedClickOnView(settingsCheckboxBesideText(id)) 38 + } 39 + 40 + fun clickOnSettingsButtonBesideText(@StringRes id: Int) { 41 + clickOnView(allOf(hasSibling(withText(id)), withId(settingsR.id.btnItemSettings))) 42 + } 43 + 44 + fun clickOnSettingsSpinnerButtonBesideText(@StringRes id: Int) { 45 + clickOnView(allOf(hasSibling(withText(id)), withId(settingsR.id.btnItemSettings))) 46 + } 47 + 48 + fun clickOnSettingsSpinnerBesideText(@StringRes id: Int) { 49 + // Double click to avoid failure on low api small screens 50 + clickOnSettingsRecyclerItem( 51 + allOf(hasSibling(withText(id)), withId(settingsR.id.spinnerItemSettings)), 52 + ) 53 + pressBack() 54 + clickOnSettingsRecyclerItem( 55 + allOf(hasSibling(withText(id)), withId(settingsR.id.spinnerItemSettings)), 56 + ) 57 + } 58 + 59 + fun clickOnSettingsSelectorBesideText(@StringRes id: Int) { 60 + clickOnView(allOf(hasSibling(withText(id)), withId(settingsR.id.groupItemSettingsSelector))) 61 + } 62 + 63 + fun clickOnSettingsRangeStartBesideText(@StringRes id: Int) { 64 + clickOnView(allOf(hasSibling(withText(id)), withId(settingsR.id.tvItemSettingsStart))) 65 + } 66 + 67 + fun clickOnSettingsRangeEndBesideText(@StringRes id: Int) { 68 + clickOnView(allOf(hasSibling(withText(id)), withId(settingsR.id.tvItemSettingsEnd))) 69 + } 70 + 71 + // Matchers 72 + 73 + fun settingsSubtitleBesideText( 74 + @StringRes id: Int, 75 + matcher: Matcher<View>, 76 + ): Matcher<View> { 77 + return settingsViewBesideTextMatcher( 78 + id = id, 79 + matcher = allOf(withId(settingsR.id.tvItemSettingsSubtitle), matcher), 80 + ) 81 + } 82 + 83 + fun settingsButtonBesideText( 84 + @StringRes id: Int, 85 + matcher: Matcher<View>? = null, 86 + ): Matcher<View> { 87 + val matchers = listOfNotNull( 88 + withId(settingsR.id.btnItemSettings), 89 + matcher, 90 + ) 91 + return settingsViewBesideTextMatcher( 92 + id = id, 93 + matcher = allOf(matchers), 94 + ) 95 + } 96 + 97 + fun settingsCheckboxBesideText( 98 + @StringRes id: Int, 99 + ): Matcher<View> { 100 + return settingsViewBesideTextMatcher( 101 + id = id, 102 + matcher = withId(settingsR.id.checkboxItemSettings), 103 + ) 104 + } 105 + 106 + fun settingsSelectorValueBesideText( 107 + @StringRes id: Int, 108 + matcher: Matcher<View>, 109 + ): Matcher<View> { 110 + return settingsViewBesideTextMatcher( 111 + id = id, 112 + matcher = allOf( 113 + withId(settingsR.id.groupItemSettingsSelector), 114 + hasDescendant(allOf(withId(settingsR.id.tvItemSettingsSelectorValue), matcher)), 115 + ), 116 + ) 117 + } 118 + 119 + fun settingsSpinnerValueBesideText( 120 + @StringRes id: Int, 121 + matcher: Matcher<View>, 122 + ): Matcher<View> { 123 + return settingsViewBesideTextMatcher( 124 + id = id, 125 + matcher = allOf(withId(settingsR.id.tvItemSettingsValue), matcher), 126 + ) 127 + } 128 + 129 + fun settingsRangeStartBesideText( 130 + @StringRes id: Int, 131 + matcher: Matcher<View>? = null, 132 + ): Matcher<View> { 133 + val matchers = listOfNotNull( 134 + withId(settingsR.id.tvItemSettingsStart), 135 + matcher, 136 + ) 137 + return settingsViewBesideTextMatcher( 138 + id = id, 139 + matcher = allOf(matchers), 140 + ) 141 + } 142 + 143 + fun settingsRangeEndBesideText( 144 + @StringRes id: Int, 145 + matcher: Matcher<View>? = null, 146 + ): Matcher<View> { 147 + val matchers = listOfNotNull( 148 + withId(settingsR.id.tvItemSettingsEnd), 149 + matcher, 150 + ) 151 + return settingsViewBesideTextMatcher( 152 + id = id, 153 + matcher = allOf(matchers), 154 + ) 155 + } 156 + 157 + // Private 158 + 159 + private fun scrollSettingsRecyclerToView(matcher: Matcher<View>) { 160 + onView(withId(settingsR.id.rvSettingsContent)) 161 + .perform(scrollTo<BaseRecyclerViewHolder>(matcher)) 162 + } 163 + 164 + private fun clickOnSettingsRecyclerItem(matcher: Matcher<View>) { 165 + clickOnView(allOf(isDescendantOfA(withId(settingsR.id.rvSettingsContent)), matcher)) 166 + } 167 + 168 + private fun settingsViewBesideTextMatcher(@StringRes id: Int, matcher: Matcher<View>): Matcher<View> { 169 + return allOf( 170 + isDescendantOfA(withId(settingsR.id.rvSettingsContent)), 171 + hasSibling(withText(id)), 172 + matcher, 173 + ) 174 + }
+4
app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt
··· 9 9 import androidx.test.ext.junit.rules.ActivityScenarioRule 10 10 import androidx.test.platform.app.InstrumentationRegistry 11 11 import com.example.util.simpletimetracker.core.R 12 + import com.example.util.simpletimetracker.core.interactor.LanguageInteractor 12 13 import com.example.util.simpletimetracker.core.mapper.ColorMapper 13 14 import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper 14 15 import com.example.util.simpletimetracker.core.mapper.IconImageMapper ··· 46 47 47 48 @Inject 48 49 lateinit var prefsInteractor: PrefsInteractor 50 + 51 + @Inject 52 + lateinit var languageInteractor: LanguageInteractor 49 53 50 54 @get:Rule(order = 0) 51 55 var hiltRule = HiltAndroidRule(this)
+22 -12
app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt
··· 3 3 import android.widget.DatePicker 4 4 import androidx.test.espresso.Espresso.closeSoftKeyboard 5 5 import androidx.test.espresso.Espresso.onView 6 - import androidx.test.espresso.action.ViewActions.click 7 6 import androidx.test.espresso.action.ViewActions.replaceText 8 7 import androidx.test.espresso.contrib.PickerActions.setDate 9 8 import androidx.test.espresso.contrib.PickerActions.setTime ··· 12 11 import androidx.test.espresso.matcher.ViewMatchers.withClassName 13 12 import androidx.test.espresso.matcher.ViewMatchers.withId 14 13 import androidx.test.espresso.matcher.ViewMatchers.withText 14 + import com.example.util.simpletimetracker.clickOnSettingsRecyclerText 15 15 import com.example.util.simpletimetracker.domain.model.RecordTypeGoal 16 16 import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 17 + import com.example.util.simpletimetracker.scrollSettingsRecyclerToText 17 18 import org.hamcrest.CoreMatchers.allOf 18 19 import org.hamcrest.CoreMatchers.equalTo 19 20 import com.example.util.simpletimetracker.core.R as coreR ··· 54 55 } 55 56 56 57 fun openSettingsNotifications() { 57 - onView(withText(coreR.string.settings_notification_title)).perform(nestedScrollTo(), click()) 58 + scrollSettingsRecyclerToText(coreR.string.settings_notification_title) 59 + clickOnSettingsRecyclerText(coreR.string.settings_notification_title) 58 60 } 59 61 60 62 fun openSettingsDisplay() { 61 - onView(withText(coreR.string.settings_display_title)).perform(nestedScrollTo(), click()) 63 + scrollSettingsRecyclerToText(coreR.string.settings_display_title) 64 + clickOnSettingsRecyclerText(coreR.string.settings_display_title) 62 65 } 63 66 64 67 fun openSettingsAdditional() { 65 - onView(withText(coreR.string.settings_additional_title)).perform(nestedScrollTo(), click()) 68 + scrollSettingsRecyclerToText(coreR.string.settings_additional_title) 69 + clickOnSettingsRecyclerText(coreR.string.settings_additional_title) 66 70 } 67 71 68 72 fun openSettingsBackup() { 69 - onView(withText(coreR.string.settings_backup_title)).perform(nestedScrollTo(), click()) 73 + scrollSettingsRecyclerToText(coreR.string.settings_backup_title) 74 + clickOnSettingsRecyclerText(coreR.string.settings_backup_title) 70 75 } 71 76 72 77 fun openSettingsExportImport() { 73 - onView(withText(coreR.string.settings_export_title)).perform(nestedScrollTo(), click()) 78 + scrollSettingsRecyclerToText(coreR.string.settings_export_title) 79 + clickOnSettingsRecyclerText(coreR.string.settings_export_title) 74 80 } 75 81 76 82 fun openCategoriesScreen() { 77 - onView(withText(coreR.string.settings_edit_categories)).perform(nestedScrollTo(), click()) 83 + scrollSettingsRecyclerToText(coreR.string.settings_edit_categories) 84 + clickOnSettingsRecyclerText(coreR.string.settings_edit_categories) 78 85 } 79 86 80 87 fun openArchiveScreen() { 81 - onView(withText(coreR.string.settings_archive)).perform(nestedScrollTo(), click()) 88 + scrollSettingsRecyclerToText(coreR.string.settings_archive) 89 + clickOnSettingsRecyclerText(coreR.string.settings_archive) 82 90 } 83 91 84 92 fun openDataEditScreen() { 85 - onView(withText(coreR.string.settings_data_edit)).perform(nestedScrollTo(), click()) 93 + scrollSettingsRecyclerToText(coreR.string.settings_data_edit) 94 + clickOnSettingsRecyclerText(coreR.string.settings_data_edit) 86 95 } 87 96 88 97 fun openCardSizeScreen() { 89 - onView(withText(coreR.string.settings_change_card_size)).perform(nestedScrollTo(), click()) 98 + scrollSettingsRecyclerToText(coreR.string.settings_change_card_size) 99 + clickOnSettingsRecyclerText(coreR.string.settings_change_card_size) 90 100 } 91 101 92 102 fun addActivity( ··· 190 200 } 191 201 192 202 fun disableGoalOnActivity( 193 - goal: RecordTypeGoal 203 + goal: RecordTypeGoal, 194 204 ) { 195 205 val newGoal = goal.copy( 196 206 type = when (val type = goal.type) { 197 207 is RecordTypeGoal.Type.Duration -> RecordTypeGoal.Type.Duration(0) 198 208 is RecordTypeGoal.Type.Count -> RecordTypeGoal.Type.Count(0) 199 - } 209 + }, 200 210 ) 201 211 addGoalToActivity(newGoal) 202 212 }
+8
app/src/androidTest/java/com/example/util/simpletimetracker/utils/ViewInteractions.kt
··· 12 12 import androidx.test.espresso.contrib.PickerActions.setTime 13 13 import androidx.test.espresso.contrib.RecyclerViewActions.scrollTo 14 14 import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition 15 + import androidx.test.espresso.matcher.ViewMatchers.isChecked 15 16 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 16 17 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA 17 18 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 19 + import androidx.test.espresso.matcher.ViewMatchers.isNotChecked 18 20 import androidx.test.espresso.matcher.ViewMatchers.withClassName 19 21 import androidx.test.espresso.matcher.ViewMatchers.withId 20 22 import androidx.test.espresso.matcher.ViewMatchers.withText ··· 90 92 fun setPickerTime(hour: Int, minute: Int) { 91 93 onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hour, minute)) 92 94 } 95 + 96 + fun checkCheckboxIsChecked(matcher: Matcher<View>): ViewInteraction = 97 + onView(matcher).check(matches(isChecked())) 98 + 99 + fun checkCheckboxIsNotChecked(matcher: Matcher<View>): ViewInteraction = 100 + onView(matcher).check(matches(isNotChecked()))
+1 -1
data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/BackupRepoImpl.kt
··· 367 367 val weeklyGoalTime = parts.getOrNull(9)?.toLongOrNull().orZero() 368 368 val monthlyGoalTime = parts.getOrNull(10)?.toLongOrNull().orZero() 369 369 // Didn't exist when goal time was in type db, no need to migrate. 370 - val daysOfWeek = emptyList<DayOfWeek>() 370 + val daysOfWeek = DayOfWeek.values().toList() 371 371 372 372 val goalTimes = mutableListOf<RecordTypeGoal>().apply { 373 373 if (goalTime != 0L) {
+7 -7
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCheckboxWithRangeAdapterDelegate.kt
··· 22 22 23 23 tvItemSettingsCheckboxWithRangeSubtitle.text = item.subtitle 24 24 25 - if (checkboxItemSettingsCheckboxWithRange.isChecked != item.isChecked) { 26 - checkboxItemSettingsCheckboxWithRange.isChecked = item.isChecked 25 + if (checkboxItemSettings.isChecked != item.isChecked) { 26 + checkboxItemSettings.isChecked = item.isChecked 27 27 } 28 28 29 29 groupItemSettingsCheckboxWithRange.visible = 30 30 item.range is SettingsCheckboxWithRangeViewData.RangeViewData.Enabled 31 31 32 32 if (item.range is SettingsCheckboxWithRangeViewData.RangeViewData.Enabled) { 33 - tvItemSettingsCheckboxWithRangeStart.text = item.range.rangeStart 34 - tvItemSettingsCheckboxWithRangeEnd.text = item.range.rangeEnd 33 + tvItemSettingsStart.text = item.range.rangeStart 34 + tvItemSettingsEnd.text = item.range.rangeEnd 35 35 } 36 36 37 - checkboxItemSettingsCheckboxWithRange.setOnClick { onClick(item.blockCheckbox) } 38 - tvItemSettingsCheckboxWithRangeStart.setOnClick { onClick(item.blockStart) } 39 - tvItemSettingsCheckboxWithRangeEnd.setOnClick { onClick(item.blockEnd) } 37 + checkboxItemSettings.setOnClick { onClick(item.blockCheckbox) } 38 + tvItemSettingsStart.setOnClick { onClick(item.blockStart) } 39 + tvItemSettingsEnd.setOnClick { onClick(item.blockEnd) } 40 40 } 41 41 } 42 42
+2 -2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSelectorWithButtonAdapterDelegate.kt
··· 28 28 onClick = onClick, 29 29 ) 30 30 31 - btnItemSettingsSelector.visible = item.isButtonVisible 31 + btnItemSettings.visible = item.isButtonVisible 32 32 tvItemSettingsSelectorButton.text = item.buttonText 33 - btnItemSettingsSelector.setOnClick { onClick(item.buttonBlock) } 33 + btnItemSettings.setOnClick { onClick(item.buttonBlock) } 34 34 } 35 35 } 36 36
+2 -2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSpinnerWithButtonAdapterDelegate.kt
··· 26 26 onPositionSelected = onPositionSelected, 27 27 ) 28 28 29 - btnItemSettingsSpinner.visible = item.isButtonVisible 30 - btnItemSettingsSpinner.setOnClick { onButtonClicked(item.data.block) } 29 + btnItemSettings.visible = item.isButtonVisible 30 + btnItemSettings.setOnClick { onButtonClicked(item.data.block) } 31 31 } 32 32 } 33 33
+1 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTextWithButtonAdapterDelegate.kt
··· 28 28 onClick = onClick, 29 29 ) 30 30 31 - btnItemSettingsText.setOnClick { onClick(item.buttonBlock) } 31 + btnItemSettings.setOnClick { onClick(item.buttonBlock) } 32 32 } 33 33 } 34 34
-1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsExportViewModelDelegate.kt
··· 3 3 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 4 4 import com.example.util.simpletimetracker.domain.extension.flip 5 5 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 6 - import com.example.util.simpletimetracker.feature_settings.interactor.SettingsBackupViewDataInteractor 7 6 import com.example.util.simpletimetracker.feature_settings.interactor.SettingsExportViewDataInteractor 8 7 import kotlinx.coroutines.launch 9 8 import javax.inject.Inject