Skip to content

Instantly share code, notes, and snippets.

@RadiationX
Created August 23, 2018 05:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save RadiationX/217ffa4e62f5b20fdae3633865457689 to your computer and use it in GitHub Desktop.
Save RadiationX/217ffa4e62f5b20fdae3633865457689 to your computer and use it in GitHub Desktop.
Cicerone
open class CustomNavigator(
activity: FragmentActivity?,
containerId: Int
) : SupportAppNavigator(activity, containerId) {
override fun createActivityIntent(context: Context?, screenKey: String?, data: Any?): Intent? {
return (data as? Screen)?.let { createActivityIntent(context, it) }
}
override fun createFragment(screenKey: String?, data: Any?): Fragment? {
return (data as? Screen)?.let { createFragment(it) }
}
open fun createActivityIntent(context: Context?, screen: Screen): Intent? {
return when (screen) {
is Screen.Main -> Intent(context, MainActivity::class.java)
is Screen.Auth.Register -> Intent(context, RegisterActivity::class.java)
is Screen.Auth.ConfirmSms -> Intent(context, RegisterEnterCodeActivity::class.java).apply {
putExtras(Bundle().apply {
putString("verificationId", screen.verificationId)
putString("phone", screen.phone)
putBoolean("mode", screen.mode)
})
}
else -> null
}
}
open fun createFragment(screen: Screen): Fragment? {
return when (screen) {
is Screen.ClientContainer -> ClientContainerFragment()
is Screen.DriverContainer -> DriverContainerFragment()
is Screen.Order.List -> OrderListFragment()
is Screen.Order.Create -> OrderCreateFragment()
is Screen.Offer.Create -> OfferCreateFragment()
else -> null
}
}
}
sealed class Screen {
fun getKey(): String = this::class.java.simpleName
sealed class Auth {
class Register() : Screen()
class ConfirmSms(
val verificationId: String,
val phone: String,
val mode: Boolean
) : Screen()
}
class Main() : Screen()
class ClientContainer() : Screen()
class DriverContainer() : Screen()
sealed class Order {
class List() : Screen()
class Create() : Screen()
}
sealed class Offer {
class Create() : Screen()
}
}
class ScreenRouter : Router() {
companion object {
private const val errorMessage = "Use methods with class Screen instead screenKey"
}
fun newScreenChain(screen: Screen) {
super.newScreenChain(screen.getKey(), screen)
}
fun navigateTo(screen: Screen) {
super.navigateTo(screen.getKey(), screen)
}
fun backTo(screen: Screen) {
super.backTo(screen.getKey())
}
fun replaceScreen(screen: Screen) {
super.replaceScreen(screen.getKey(), screen)
}
fun newRootScreen(screen: Screen) {
super.newRootScreen(screen.getKey(), screen)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun newScreenChain(screenKey: String) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun newScreenChain(screenKey: String, data: Any?) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun navigateTo(screenKey: String) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun navigateTo(screenKey: String, data: Any?) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun backTo(screenKey: String) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun replaceScreen(screenKey: String) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun replaceScreen(screenKey: String, data: Any?) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun newRootScreen(screenKey: String) {
throw Exception(errorMessage)
}
@Deprecated(errorMessage, level = DeprecationLevel.ERROR)
override fun newRootScreen(screenKey: String, data: Any?) {
throw Exception(errorMessage)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment