package Ġcom . ro ud ikk . navigator . sample Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . receive As Flow Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠDeep Link ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġhandled Initial Intent Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġmain Dest inations Channel Ġ= ĠChannel < List < Main Destination >>() ĊĠĠĠ Ġval Ġmain Dest inations Flow Ġ= Ġmain Dest inations Channel . receive As Flow () ĊĊĠĠĠ Ġprivate Ġval Ġtab Dest inations Channel Ġ= ĠChannel < List < Tab Destination >>() ĊĠĠĠ Ġval Ġtab Dest inations Flow Ġ= Ġtab Dest inations Channel . receive As Flow () ĊĊĠĠĠ Ġprivate Ġval Ġnested Dest inations Channel Ġ= ĠChannel < List < Nested Destination >>() ĊĠĠĠ Ġval Ġnested Dest inations Flow Ġ= Ġnested Dest inations Channel . receive As Flow () ĊĊĠĠĠ Ġvar Ġmain Dest inations Ġ= Ġempty List < Main Destination >() ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield . also Ġ{ Ġfield Ġ= Ġempty List () Ġ} ĊĊĠĠĠ Ġvar Ġtab Dest inations Ġ= Ġempty List < Tab Destination >() ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield . also Ġ{ Ġfield Ġ= Ġempty List () Ġ} ĊĊĠĠĠ Ġvar Ġnested Dest inations Ġ= Ġempty List < Nested Destination >() ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield . also Ġ{ Ġfield Ġ= Ġempty List () Ġ} ĊĊĠĠĠ Ġfun ĠonCreate ( intent Data : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( handled Initial Intent ) Ġreturn ĊĠĠĠĠĠĠĠ Ġhandled Initial Intent Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġintent Data Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġparse Intent ( intent Data , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon New Intent ( intent Data : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent Data Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġparse Intent ( intent Data , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Intent ( intent Data : ĠString , Ġnew Intent : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġrun Catch ing Ġ{ ĠUri . parse ( intent Data ) Ġ}. get OrNull () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( uri . host ?. contains (" ro ud ikk ") Ġ== Ġfalse Ġ|| Ġuri . scheme Ġ!= Ġ" https ") Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġmain Dest inations Ġ= Ġmutable ListOf < Main Destination >() ĊĠĠĠĠĠĠĠ Ġval Ġtab Dest inations Ġ= Ġmutable ListOf < Tab Destination >() ĊĠĠĠĠĠĠĠ Ġval Ġnested Dest inations Ġ= Ġmutable ListOf < Nested Destination >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" bottom - nav ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Dest inations . add ( Main Destination . Bottom Nav ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" home ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations . add ( Tab Destination . Home Tab ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" details ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . getQuery Parameter (" item ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations . add ( Tab Destination . Details ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" nested ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations . add ( Tab Destination . Nested Tab ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . getQuery Parameter (" count ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġkotlin . run Catch ing Ġ{ Ġit . toInt () Ġ}. get OrNull () Ġ?: Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Dest inations . add ( Nested Destination . Nested ( count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" dialogs ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations . add ( Tab Destination . Dialog s Tab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" stack - tree ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations . add ( Tab Destination . Stack Tree Tab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . contains (" settings ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Dest inations . add ( Main Destination . Settings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Intent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Dest inations Channel . send ( main Dest inations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Dest inations Channel . send ( tab Dest inations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnested Dest inations Channel . send ( nested Dest inations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . main Dest inations Ġ= Ġmain Dest inations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tab Dest inations Ġ= Ġtab Dest inations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . nested Dest inations Ġ= Ġnested Dest inations ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠMain Destination Ġ{ ĊĠĠĠ Ġobject ĠBottom Nav Ġ: ĠMain Destination () ĊĠĠĠ Ġobject ĠSettings Ġ: ĠMain Destination () Ċ } Ċ Ċ sealed Ġclass ĠTab Destination Ġ{ ĊĠĠĠ Ġobject ĠHome Tab Ġ: ĠTab Destination () ĊĠĠĠ Ġobject ĠNested Tab Ġ: ĠTab Destination () ĊĠĠĠ Ġobject ĠDialog s Tab Ġ: ĠTab Destination () ĊĠĠĠ Ġobject ĠStack Tree Tab Ġ: ĠTab Destination () ĊĠĠĠ Ġdata Ġclass ĠDetails ( val Ġitem : ĠString ) Ġ: ĠTab Destination () Ċ } Ċ Ċ sealed Ġclass ĠNested Destination Ġ{ ĊĠĠĠ Ġdata Ġclass ĠNested ( val Ġcount : ĠInt ) Ġ: ĠNested Destination () Ċ } Ċ