Skip to content

Commit

Permalink
Refactor FragmentScreen and ActivityScreen to interfaces for flexibil…
Browse files Browse the repository at this point in the history
…ity in some cases.

See #144
  • Loading branch information
terrakok committed Apr 17, 2021
1 parent bbd27da commit 82256a9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 20 deletions.
Expand Up @@ -67,7 +67,7 @@ open class AppNavigator @JvmOverloads constructor(
}

protected open fun forward(command: Forward) {
when (val screen = command.screen as AppScreen) {
when (val screen = command.screen) {
is ActivityScreen -> {
checkAndStartActivity(screen)
}
Expand All @@ -78,7 +78,7 @@ open class AppNavigator @JvmOverloads constructor(
}

protected open fun replace(command: Replace) {
when (val screen = command.screen as AppScreen) {
when (val screen = command.screen) {
is ActivityScreen -> {
checkAndStartActivity(screen)
activity.finish()
Expand Down Expand Up @@ -147,7 +147,7 @@ open class AppNavigator @JvmOverloads constructor(
fragmentManager.popBackStack(forRemove.first().toString(), 0)
forRemove.clear()
} else {
backToUnexisting(command.screen as AppScreen)
backToUnexisting(command.screen)
}
}
}
Expand Down Expand Up @@ -204,7 +204,7 @@ open class AppNavigator @JvmOverloads constructor(
*
* @param screen screen
*/
protected open fun backToUnexisting(screen: AppScreen) {
protected open fun backToUnexisting(screen: Screen) {
backToRoot()
}

Expand Down
Expand Up @@ -7,26 +7,40 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import com.github.terrakok.cicerone.Screen

sealed class AppScreen : Screen

fun interface Creator<A, R> {
fun create(argument: A): R
}

open class FragmentScreen @JvmOverloads constructor(
private val key: String? = null,
val clearContainer: Boolean = true,
private val fragmentCreator: Creator<FragmentFactory, Fragment>
) : AppScreen() {
override val screenKey: String get() = key ?: fragmentCreator::class.java.name
fun createFragment(factory: FragmentFactory) = fragmentCreator.create(factory)
interface FragmentScreen : Screen {
val clearContainer: Boolean get() = true
fun createFragment(factory: FragmentFactory): Fragment

companion object {
operator fun invoke(
key: String? = null,
clearContainer: Boolean = true,
fragmentCreator: Creator<FragmentFactory, Fragment>
) = object : FragmentScreen {
override val screenKey = key ?: fragmentCreator::class.java.name
override val clearContainer = clearContainer
override fun createFragment(factory: FragmentFactory) = fragmentCreator.create(factory)
}
}
}

open class ActivityScreen @JvmOverloads constructor(
private val key: String? = null,
private val intentCreator: Creator<Context, Intent>
) : AppScreen() {
override val screenKey: String get() = key ?: intentCreator::class.java.name
open val startActivityOptions: Bundle? = null
fun createIntent(context: Context) = intentCreator.create(context)
interface ActivityScreen : Screen {
val startActivityOptions: Bundle? get() = null
fun createIntent(context: Context): Intent

companion object {
operator fun invoke(
key: String? = null,
startActivityOptions: Bundle? = null,
intentCreator: Creator<Context, Intent>
) = object : ActivityScreen {
override val screenKey = key ?: intentCreator::class.java.name
override val startActivityOptions = startActivityOptions
override fun createIntent(context: Context) = intentCreator.create(context)
}
}
}

0 comments on commit 82256a9

Please sign in to comment.