Skip to content

Instantly share code, notes, and snippets.

View ingerul93's full-sized avatar

Vlad Ioan ingerul93

  • Baia Mare, Romania
View GitHub Profile
@ingerul93
ingerul93 / Injection.kt
Created March 18, 2022 09:06 — forked from code-twister/Injection.kt
Simple Kotlin Dependency Injection
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
/*
* Using the Injection framework:
*
* Create bindings somewhere in the application before the injections would occur.
*
* factory<MyInterface>(named = "specialName") { SomeImplementation() }
<style name="TopSheet_DialogAnimation">
  <item name="android:windowEnterAnimation">@anim/slide_out_from_top</item>
  <item name="android:windowExitAnimation">@anim/slide_back_to_top</item>
</style>

slide_out_from_top

@Navigator.Name("screen_view")
class ViewNavigator(private val container: ViewGroup) : Navigator<ViewDestination>() {
override fun navigate(...) {...}
override fun createDestination(): ViewDestination = ViewDestination(this)
override fun popBackStack(): Boolean {...}
}
<com.ingerul93.navigation.navigation.NavigationHostView
android:id="@+id/main_navigation_host"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
override fun onSupportNavigateUp(): Boolean = navController.navigateUp()
override fun onBackPressed() {
if (!navController.popBackStack()) {
super.onBackPressed()
}
}
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
navController = Navigation.findNavController(mainNavigationHost)
Navigation.setViewNavController(mainNavigationHost, navController)
}
<!-- Other screen view -->
<screen_view
android:id="@+id/first_screen_view"
app:layoutId="@layout/screen_view_first"
tools:layout="@layout/screen_view_first"/>
<!-- Other screen view -->
@NavDestination.ClassType(ViewGroup::class)
class ViewDestination(navigator: Navigator<out NavDestination>) : NavDestination(navigator) {
@LayoutRes var layoutId: Int = 0
override fun onInflate(context: Context, attrs: AttributeSet) {
//Some implementation here
}
}
class NavigationHostFrame(...) : FrameLayout(...), NavHost {
private val navigationController = NavController(context)
init {
Navigation.setViewNavController(this, navigationController)
navigationController.navigatorProvider.addNavigator(ViewNavigator(this))
navigationController.setGraph(R.navigation.navigation)
}
override fun getNavController() = navigationController
}
@Navigator.Name("screen_view")
class ViewNavigator(private val container: ViewGroup) : Navigator<ViewDestination>() {
private val viewStack: Deque<Pair<Int, Int?>> = LinkedList()
private val navigationHost: NavigationHostFrame = container as NavigationHostFrame
override fun navigate(
destination: ViewDestination,
args: Bundle?,