From 78b34ecef2de6ac5b14851224a7dbb12bbe66203 Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Mon, 16 Mar 2026 22:51:55 -0400 Subject: [PATCH] feat: route board cards to full card detail screen --- .../kanbn4droid/app/BoardDetailFlowTest.kt | 4 +++- .../kanbn4droid/app/CardDetailFlowTest.kt | 19 +++++++++++++++ app/src/main/AndroidManifest.xml | 3 --- .../app/CardDetailPlaceholderActivity.kt | 24 ------------------- .../app/boarddetail/BoardDetailActivity.kt | 14 +++++++---- 5 files changed, 31 insertions(+), 33 deletions(-) delete mode 100644 app/src/main/java/space/hackenslacker/kanbn4droid/app/CardDetailPlaceholderActivity.kt diff --git a/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/BoardDetailFlowTest.kt b/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/BoardDetailFlowTest.kt index b336f09..ec70da4 100644 --- a/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/BoardDetailFlowTest.kt +++ b/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/BoardDetailFlowTest.kt @@ -795,12 +795,13 @@ class BoardDetailFlowTest { onView(withText("Card 1")).perform(click()) Intents.intended(hasComponent(CardDetailActivity::class.java.name)) + Intents.intended(not(hasComponent("space.hackenslacker.kanbn4droid.app.CardDetailPlaceholderActivity"))) Intents.intended(hasExtra(CardDetailActivity.EXTRA_CARD_ID, "card-1")) Intents.intended(hasExtra(CardDetailActivity.EXTRA_CARD_TITLE, "Card 1")) } @Test - fun cardTapBlankTitle_usesCardFallbackInPlaceholderExtra() { + fun cardTapBlankTitle_usesCardFallbackInCardDetailExtra() { defaultDataSource.currentDetail = detailWithCardTitle(" ") launchBoardDetail() @@ -809,6 +810,7 @@ class BoardDetailFlowTest { .getString(R.string.card_detail_placeholder_fallback_title) Intents.intended(hasComponent(CardDetailActivity::class.java.name)) + Intents.intended(not(hasComponent("space.hackenslacker.kanbn4droid.app.CardDetailPlaceholderActivity"))) Intents.intended(hasExtra(CardDetailActivity.EXTRA_CARD_ID, "card-1")) Intents.intended(hasExtra(CardDetailActivity.EXTRA_CARD_TITLE, expectedFallback)) } diff --git a/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/CardDetailFlowTest.kt b/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/CardDetailFlowTest.kt index 848e304..087cd19 100644 --- a/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/CardDetailFlowTest.kt +++ b/app/src/androidTest/java/space/hackenslacker/kanbn4droid/app/CardDetailFlowTest.kt @@ -1,11 +1,14 @@ package space.hackenslacker.kanbn4droid.app import android.content.Intent +import android.content.ComponentName +import android.content.pm.PackageManager import android.graphics.Color import android.view.View import android.widget.TextView import android.view.inputmethod.EditorInfo import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.closeSoftKeyboard @@ -237,6 +240,22 @@ class CardDetailFlowTest { onView(withId(R.id.cardDetailTitleSavingText)).check(matches(not(isDisplayed()))) } + @Test + fun placeholderCardDetailRouteIsNotDeclaredInManifest() { + val context = ApplicationProvider.getApplicationContext() + val placeholderComponent = ComponentName( + context.packageName, + "space.hackenslacker.kanbn4droid.app.CardDetailPlaceholderActivity", + ) + + val isDeclared = runCatching { + @Suppress("DEPRECATION") + context.packageManager.getActivityInfo(placeholderComponent, PackageManager.GET_META_DATA) + }.isSuccess + + assertTrue(!isDeclared) + } + private fun launchCardDetail( cardId: String? = "card-1", waitForContent: Boolean = true, diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 94ef9ab..233a0ba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,9 +14,6 @@ - diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/CardDetailPlaceholderActivity.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/CardDetailPlaceholderActivity.kt deleted file mode 100644 index 4472643..0000000 --- a/app/src/main/java/space/hackenslacker/kanbn4droid/app/CardDetailPlaceholderActivity.kt +++ /dev/null @@ -1,24 +0,0 @@ -package space.hackenslacker.kanbn4droid.app - -import android.os.Bundle -import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity - -class CardDetailPlaceholderActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_card_detail_placeholder) - - val cardId = intent.getStringExtra(EXTRA_CARD_ID).orEmpty() - val cardTitle = intent.getStringExtra(EXTRA_CARD_TITLE).orEmpty() - - val titleView: TextView = findViewById(R.id.cardDetailPlaceholderTitle) - titleView.text = getString(R.string.card_detail_placeholder_title, cardTitle, cardId) - } - - companion object { - const val EXTRA_CARD_ID = "extra_card_id" - const val EXTRA_CARD_TITLE = "extra_card_title" - } -} diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailActivity.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailActivity.kt index 91e69ef..491b5a3 100644 --- a/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailActivity.kt +++ b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailActivity.kt @@ -242,11 +242,7 @@ class BoardDetailActivity : AppCompatActivity() { .orEmpty() .trim() .ifBlank { getString(R.string.card_detail_placeholder_fallback_title) } - startActivity( - Intent(this@BoardDetailActivity, CardDetailActivity::class.java) - .putExtra(CardDetailActivity.EXTRA_CARD_ID, event.cardId) - .putExtra(CardDetailActivity.EXTRA_CARD_TITLE, cardTitle), - ) + openCardDetail(cardId = event.cardId, cardTitle = cardTitle) } is BoardDetailUiEvent.ShowServerError -> { @@ -339,6 +335,14 @@ class BoardDetailActivity : AppCompatActivity() { .show() } + private fun openCardDetail(cardId: String, cardTitle: String) { + startActivity( + Intent(this, CardDetailActivity::class.java) + .putExtra(CardDetailActivity.EXTRA_CARD_ID, cardId) + .putExtra(CardDetailActivity.EXTRA_CARD_TITLE, cardTitle), + ) + } + private fun renderOpenDialogs(state: BoardDetailUiState) { if (state.isFabChooserOpen && fabChooserDialog == null) { showFabChooserDialog(state)