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.Intents
|
||||||
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
|
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
|
||||||
import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra
|
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.RootMatchers.isDialog
|
||||||
import androidx.test.espresso.matcher.ViewMatchers.isEnabled
|
import androidx.test.espresso.matcher.ViewMatchers.isEnabled
|
||||||
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
||||||
@@ -578,6 +579,30 @@ class BoardsFlowTest {
|
|||||||
onView(withId(R.id.settingsSaveAndCloseButton)).check(matches(isDisplayed()))
|
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() {
|
private fun openSettingsFromDrawer() {
|
||||||
onView(withId(R.id.boardsDrawerLayout)).perform(DrawerActions.open())
|
onView(withId(R.id.boardsDrawerLayout)).perform(DrawerActions.open())
|
||||||
onView(withId(R.id.drawerSettingsButton)).perform(click())
|
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.BoardsViewModel
|
||||||
import space.hackenslacker.kanbn4droid.app.boards.BoardsDrawerWidthCalculator
|
import space.hackenslacker.kanbn4droid.app.boards.BoardsDrawerWidthCalculator
|
||||||
import space.hackenslacker.kanbn4droid.app.boards.DrawerDataErrorCode
|
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.boarddetail.BoardDetailActivity
|
||||||
import space.hackenslacker.kanbn4droid.app.settings.SettingsDialogFragment
|
import space.hackenslacker.kanbn4droid.app.settings.SettingsDialogFragment
|
||||||
|
|
||||||
@@ -140,7 +141,11 @@ class BoardsActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private fun setupRecycler() {
|
private fun setupRecycler() {
|
||||||
boardsAdapter = BoardsAdapter(
|
boardsAdapter = BoardsAdapter(
|
||||||
onBoardClick = { board -> navigateToBoard(board) },
|
onBoardClick = { board ->
|
||||||
|
if (!shouldIgnoreBoardClick()) {
|
||||||
|
navigateToBoard(board)
|
||||||
|
}
|
||||||
|
},
|
||||||
onBoardLongClick = { board -> showDeleteConfirmation(board) },
|
onBoardLongClick = { board -> showDeleteConfirmation(board) },
|
||||||
)
|
)
|
||||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
@@ -458,6 +463,13 @@ class BoardsActivity : AppCompatActivity() {
|
|||||||
.show(supportFragmentManager, SettingsDialogFragment.TAG)
|
.show(supportFragmentManager, SettingsDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun shouldIgnoreBoardClick(): Boolean {
|
||||||
|
return shouldIgnoreBoardClick(
|
||||||
|
pendingOpenSettingsAfterDrawerClose = pendingOpenSettingsAfterDrawerClose,
|
||||||
|
isDrawerOpen = drawerLayout.isDrawerOpen(GravityCompat.START),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun navigateToBoard(board: BoardSummary) {
|
private fun navigateToBoard(board: BoardSummary) {
|
||||||
startActivity(
|
startActivity(
|
||||||
Intent(this, BoardDetailActivity::class.java)
|
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