fix: block board click-through while opening settings
This commit is contained in:
@@ -18,6 +18,7 @@ import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
|
||||
import androidx.test.espresso.intent.Intents
|
||||
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
|
||||
import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra
|
||||
import androidx.test.espresso.intent.VerificationModes.times
|
||||
import androidx.test.espresso.matcher.RootMatchers.isDialog
|
||||
import androidx.test.espresso.matcher.ViewMatchers.isEnabled
|
||||
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
||||
@@ -578,6 +579,30 @@ class BoardsFlowTest {
|
||||
onView(withId(R.id.settingsSaveAndCloseButton)).check(matches(isDisplayed()))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun boardTapIsIgnoredWhileSettingsOpenIsPending() {
|
||||
MainActivity.dependencies.apiClientFactory = {
|
||||
FakeBoardsApiClient(
|
||||
boards = mutableListOf(BoardSummary("1", "Alpha")),
|
||||
templates = emptyList(),
|
||||
)
|
||||
}
|
||||
|
||||
val scenario = ActivityScenario.launch(BoardsActivity::class.java)
|
||||
scenario.onActivity { activity ->
|
||||
val field = activity.javaClass.getDeclaredField("pendingOpenSettingsAfterDrawerClose")
|
||||
field.isAccessible = true
|
||||
field.setBoolean(activity, true)
|
||||
}
|
||||
|
||||
onView(withText("Alpha")).perform(click())
|
||||
|
||||
Intents.intended(
|
||||
hasComponent(space.hackenslacker.kanbn4droid.app.boarddetail.BoardDetailActivity::class.java.name),
|
||||
times(0),
|
||||
)
|
||||
}
|
||||
|
||||
private fun openSettingsFromDrawer() {
|
||||
onView(withId(R.id.boardsDrawerLayout)).perform(DrawerActions.open())
|
||||
onView(withId(R.id.drawerSettingsButton)).perform(click())
|
||||
|
||||
@@ -43,6 +43,7 @@ import space.hackenslacker.kanbn4droid.app.boards.BoardsUiState
|
||||
import space.hackenslacker.kanbn4droid.app.boards.BoardsViewModel
|
||||
import space.hackenslacker.kanbn4droid.app.boards.BoardsDrawerWidthCalculator
|
||||
import space.hackenslacker.kanbn4droid.app.boards.DrawerDataErrorCode
|
||||
import space.hackenslacker.kanbn4droid.app.boards.shouldIgnoreBoardClick
|
||||
import space.hackenslacker.kanbn4droid.app.boarddetail.BoardDetailActivity
|
||||
import space.hackenslacker.kanbn4droid.app.settings.SettingsDialogFragment
|
||||
|
||||
@@ -140,7 +141,11 @@ class BoardsActivity : AppCompatActivity() {
|
||||
|
||||
private fun setupRecycler() {
|
||||
boardsAdapter = BoardsAdapter(
|
||||
onBoardClick = { board -> navigateToBoard(board) },
|
||||
onBoardClick = { board ->
|
||||
if (!shouldIgnoreBoardClick()) {
|
||||
navigateToBoard(board)
|
||||
}
|
||||
},
|
||||
onBoardLongClick = { board -> showDeleteConfirmation(board) },
|
||||
)
|
||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||
@@ -458,6 +463,13 @@ class BoardsActivity : AppCompatActivity() {
|
||||
.show(supportFragmentManager, SettingsDialogFragment.TAG)
|
||||
}
|
||||
|
||||
private fun shouldIgnoreBoardClick(): Boolean {
|
||||
return shouldIgnoreBoardClick(
|
||||
pendingOpenSettingsAfterDrawerClose = pendingOpenSettingsAfterDrawerClose,
|
||||
isDrawerOpen = drawerLayout.isDrawerOpen(GravityCompat.START),
|
||||
)
|
||||
}
|
||||
|
||||
private fun navigateToBoard(board: BoardSummary) {
|
||||
startActivity(
|
||||
Intent(this, BoardDetailActivity::class.java)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package space.hackenslacker.kanbn4droid.app.boards
|
||||
|
||||
internal fun shouldIgnoreBoardClick(
|
||||
pendingOpenSettingsAfterDrawerClose: Boolean,
|
||||
isDrawerOpen: Boolean,
|
||||
): Boolean {
|
||||
return pendingOpenSettingsAfterDrawerClose || isDrawerOpen
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package space.hackenslacker.kanbn4droid.app.boards
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class BoardsClickGuardTest {
|
||||
@Test
|
||||
fun ignoresBoardClickWhenSettingsOpenIsPending() {
|
||||
assertTrue(
|
||||
shouldIgnoreBoardClick(
|
||||
pendingOpenSettingsAfterDrawerClose = true,
|
||||
isDrawerOpen = false,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun ignoresBoardClickWhenDrawerIsOpen() {
|
||||
assertTrue(
|
||||
shouldIgnoreBoardClick(
|
||||
pendingOpenSettingsAfterDrawerClose = false,
|
||||
isDrawerOpen = true,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun allowsBoardClickWhenNoSettingsOpenIsPendingAndDrawerClosed() {
|
||||
assertFalse(
|
||||
shouldIgnoreBoardClick(
|
||||
pendingOpenSettingsAfterDrawerClose = false,
|
||||
isDrawerOpen = false,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user