Skip to content

Commit 44e97b6

Browse files
author
Patrick Jackson
committed
android backstack adjustments
1 parent a8f4096 commit 44e97b6

File tree

6 files changed

+31
-16
lines changed

6 files changed

+31
-16
lines changed

android/src/main/java/com/jackson/openlibrary/AndroidNavigator.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import android.app.Application
55
import android.os.Bundle
66
import androidx.appcompat.app.AppCompatActivity
77
import androidx.fragment.app.Fragment
8+
import androidx.navigation.NavDirections
9+
import androidx.navigation.NavOptions
10+
import androidx.navigation.NavOptionsBuilder
811
import androidx.navigation.findNavController
912
import com.jackson.openlibrary.store.CompletedFragment
1013
import com.jackson.openlibrary.store.DetailsFragment
@@ -34,16 +37,17 @@ class AndroidNavigator : Navigator, Application.ActivityLifecycleCallbacks {
3437
} else {
3538
val navController = currentActivity!!.findNavController(R.id.nav_host_fragment)
3639

40+
val navOptions = NavOptions.Builder()
41+
.setPopUpTo(navController.currentDestination!!.id, true)
42+
.build()
3743

38-
navController.navigate(
39-
when (screen) {
40-
Screen.BOOK_DETAILS -> R.id.detailsFragment
41-
Screen.COMPLETED_LIST -> R.id.completedListFragment
42-
Screen.READING_LIST -> R.id.readingListFragment
43-
Screen.SEARCH -> R.id.searchFragment
44-
else -> throw IllegalArgumentException("Screen $screen is not handled in AndroidNavigator")
45-
}
46-
)
44+
when (screen) {
45+
Screen.BOOK_DETAILS -> navController.navigate(R.id.detailsFragment)
46+
Screen.COMPLETED_LIST -> navController.navigate(R.id.completedListFragment, null, navOptions)
47+
Screen.READING_LIST -> navController.navigate(R.id.readingListFragment, null, navOptions)
48+
Screen.SEARCH -> navController.navigate(R.id.searchFragment)
49+
else -> throw IllegalArgumentException("Screen $screen is not handled in AndroidNavigator")
50+
}
4751
}
4852
}
4953

android/src/main/res/navigation/nav_graph.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
xmlns:tools="http://schemas.android.com/tools"
55
app:startDestination="@id/readingListFragment">
66

7-
<activity
8-
android:id="@+id/mainActivity"
9-
android:name="com.jackson.openlibrary.MainActivity"
10-
android:label="fragment_search"
11-
tools:layout="@layout/activity_main" />
7+
128
<fragment
139
android:id="@+id/readingListFragment"
1410
android:name="com.jackson.openlibrary.store.ReadingListFragment"

common/src/commonMain/kotlin/com/willowtreeapps/common/AppState.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.willowtreeapps.common
22

3+
import com.willowtreeapps.common.middleware.Screen
34
import com.willowtreeapps.common.repo.Book
45
import kotlin.reflect.KProperty0
56

@@ -12,6 +13,7 @@ data class AppState(val isLoadingItems: Boolean = false,
1213
val completed: Set<Book> = setOf(),
1314
val currentList: KProperty0<Set<Book>>? = null,
1415
val errorMsg: String = "",
16+
val currentScreen: Screen = Screen.READING_LIST,
1517
val settings: UserSettings = UserSettings.defaults()) {
1618
companion object {
1719
val INITIAL_STATE = AppState()

common/src/commonMain/kotlin/com/willowtreeapps/common/LibraryApp.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.willowtreeapps.common.ui.LibraryView
1111
import com.willowtreeapps.common.ui.PresenterFactory
1212
import kotlinx.coroutines.CoroutineScope
1313
import kotlinx.coroutines.launch
14+
import org.reduxkotlin.combineReducers
1415
import kotlin.coroutines.CoroutineContext
1516

1617
class LibraryApp(navigator: Navigator,
@@ -25,7 +26,7 @@ class LibraryApp(navigator: Navigator,
2526
override val networkThunks = NetworkThunks(networkContext, bookRepository)
2627

2728
val store by lazy {
28-
createStore(reducer, AppState.INITIAL_STATE, applyMiddleware(createThunkMiddleware2(),
29+
createStore(combineReducers(reducer, navigationReducer), AppState.INITIAL_STATE, applyMiddleware(createThunkMiddleware2(),
2930
uiActionMiddleware(networkThunks),
3031
databaseMiddleware.middleware,
3132
navigationMiddleware::dispatch,
@@ -35,6 +36,7 @@ class LibraryApp(navigator: Navigator,
3536
init {
3637
CoroutineScope(uiContext).launch {
3738
//do any initialization here
39+
dispatch(NavigationActions.GotoScreen(state.currentScreen))
3840
}
3941
}
4042

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.willowtreeapps.common
2+
3+
4+
val navigationReducer = castingReducer { state: AppState, action ->
5+
if (action is NavigationActions.GotoScreen) {
6+
state.copy(currentScreen = action.screen)
7+
} else {
8+
state
9+
}
10+
}

common/src/commonMain/kotlin/com/willowtreeapps/common/Reducers.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ val reducer = castingReducer { state: AppState, action ->
2929
is PrevBook -> state.copy(selectedBook = state.searchBooks[state.currentSearchIndex() - 1])
3030
is NextBook -> state.copy(selectedBook = state.searchBooks[state.currentSearchIndex() + 1])
3131

32-
3332
else -> {
3433
// Logger.d("Action ${action::class.simpleName} not handled")
3534
state
3635
}
3736
}
3837
}
38+
39+
3940
inline fun <reified T> castingReducer(crossinline reducer: ((T, Any) -> Any)): Reducer = { state: Any, action: Any ->
4041
if (state is T) {
4142
reducer(state as T, action)

0 commit comments

Comments
 (0)