Skip to content

Instantly share code, notes, and snippets.

View oliverspryn's full-sized avatar
☀️
Everyday is a great day!

Oliver Spryn oliverspryn

☀️
Everyday is a great day!
View GitHub Profile
@oliverspryn
oliverspryn / attrs.xml
Last active June 14, 2019 20:07
Custom attributes for the Android Navigation Component's custom destination type
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ChromeCustomTabsNavigator">
<attr name="toolbarColor" format="reference" />
<attr name="secondaryToolbarColor" format="reference" />
</declare-styleable>
</resources>
@oliverspryn
oliverspryn / Destination.kt
Created June 14, 2019 20:16
Android Navigation Component custom destination with support for two parameters
@NavDestination.ClassType(Activity::class)
class Destination(navigator: Navigator<out NavDestination>) : NavDestination(navigator) {
@ColorRes
var toolbarColor: Int = 0
@ColorRes
var secondaryToolbarColor: Int = 0
}
@oliverspryn
oliverspryn / Destination.kt
Created June 14, 2019 20:19
Fetches properties from a definition in an XML file and applies them to the properties on a class
@NavDestination.ClassType(Activity::class)
class Destination(navigator: Navigator<out NavDestination>) : NavDestination(navigator) {
@ColorRes
var toolbarColor: Int = 0
@ColorRes
var secondaryToolbarColor: Int = 0
override fun onInflate(context: Context, attrs: AttributeSet) {
@oliverspryn
oliverspryn / ChromeCustomTabsNavigator.kt
Last active June 20, 2019 15:04
A full-fledged custom destination type to a Chrome Custom tab instance
@Navigator.Name("chrome")
class ChromeCustomTabsNavigator(
private val context: Context
) : Navigator<ChromeCustomTabsNavigator.Destination>() {
override fun createDestination() = Destination(this)
override fun navigate(destination: Destination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Extras?): NavDestination? {
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(context, destination.toolbarColor))
@oliverspryn
oliverspryn / main_graph.xml
Last active June 20, 2019 20:25
A navigation graph with two destinations; one which is built-in, and other is custom
<?xml version="1.0" encoding="utf-8"?>
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/startup_graph"
app:startDestination="@id/login_fragment">
<fragment
android:id="@+id/login_fragment"
android:name="com.example.LoginFragment"
@oliverspryn
oliverspryn / activity_main.xml
Last active June 20, 2019 20:02
Implements a custom navigator host in an activity
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<fragment
android:id="@+id/navigation_host"
@oliverspryn
oliverspryn / MyNavHostFragment.kt
Last active June 20, 2019 15:50
A navigation host which supports a custom destination type
class MyNavHostFragment : NavHostFragment() {
override fun onCreateNavController(navController: NavController) {
super.onCreateNavController(navController)
context?.let {
navController.navigatorProvider += ChromeCustomTabsNavigator(it)
}
}
}
@oliverspryn
oliverspryn / ChromeCustomTabsNavigator.kt
Created June 20, 2019 14:19
A custom navigator with two of the three required methods fully populated
@Navigator.Name("chrome")
class ChromeCustomTabsNavigator(
private val context: Context
) : Navigator<ChromeCustomTabsNavigator.Destination>() {
override fun createDestination() = Destination(this)
override fun navigate(destination: Destination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Extras?): NavDestination? {
TODO("not implemented")
}
@oliverspryn
oliverspryn / ChromeCustomTabsNavigator.kt
Created June 20, 2019 15:04
A custom navigator with a populated navigate method
@Navigator.Name("chrome")
class ChromeCustomTabsNavigator(
private val context: Context
) : Navigator<ChromeCustomTabsNavigator.Destination>() {
override fun navigate(destination: Destination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Extras?): NavDestination? {
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(context, destination.toolbarColor))
builder.setSecondaryToolbarColor(ContextCompat.getColor(context, destination.secondaryToolbarColor))
@oliverspryn
oliverspryn / main_graph.xml
Last active June 20, 2019 20:25
Navigation graph with two destination and one action with an argument
<?xml version="1.0" encoding="utf-8"?>
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/startup_graph"
app:startDestination="@id/login_fragment">
<fragment
android:id="@+id/login_fragment"
android:name="com.example.LoginFragment"