/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ // Ġk tl int - disable Ġindent Ġhttps :// github . com / p interest / kt lint / issues / 9 6 7 Ċ // ĠIgnore Ġlint Ġwarnings Ġin Ġdocumentation Ġsnippets Ċ @ file : Suppress ( ĊĠĠĠ Ġ" unused ", Ġ" UNUSED _ PARAMETER ", Ġ" UNUSED _ VARIABLE ", Ġ" UNUSED _ AN ONY MO US _ PARAMETER ", ĊĠĠĠ Ġ" Red undant Suspend Modifier ", Ġ" Cascade If ", Ġ" ClassName ", Ġ" Remove Explicit Type Arguments ", ĊĠĠĠ Ġ" Control Flow With Empty Body ", Ġ" PropertyName ", Ġ" Can Be Parameter " Ċ ) Ċ Ċ package Ġandroidx . compose . integration . docs . inter oper ability Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . activity . On Back Pressed Dispatcher Ċ import Ġandroidx . activity . compose . setContent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . TextField Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . Side Effect Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . li ved ata . observe As State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Updated State Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . platform . Compose View Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . view model . compose . viewModel Ċ import Ġandroidx . navigation . compose . Nav Host Ċ import Ġandroidx . navigation . compose . comp osable Ċ import Ġandroidx . navigation . compose . remember Nav Controller Ċ Ċ /** Ċ Ġ* ĠThis Ġfile Ġlets ĠDev Rel Ġtrack Ġchanges Ġto Ġsnippets Ġpresent Ġin Ċ Ġ* Ġhttps :// developer . android . com / jet pack / compose / interop / compose - in - existing - arch Ċ Ġ* Ċ Ġ* ĠNo Ġaction Ġrequired Ġif Ġit 's Ġmodified . Ċ Ġ*/ Ċ Ċ private Ġobject ĠInter op Architecture Snippet 1 Ġ{ ĊĠĠĠ Ġclass ĠExample Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Theme Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG reeting (" user 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG reeting (" user 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠG reeting ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg reeting ViewModel : ĠG reeting ViewModel Ġ= ĠviewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= ĠG reeting ViewModel Factory ( userId ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage User Ġby Ġg reeting ViewModel . message . observe As State ("") ĊĊĠĠĠĠĠĠĠ ĠText ( message User ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠG reeting ViewModel ( private Ġval ĠuserId : ĠString ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ message Ġ= ĠMutable LiveData (" Hi Ġ$ userId ") ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠLive Data < String > Ġ= Ġ_ message ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠG reeting ViewModel Factory ( private Ġval ĠuserId : ĠString ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠG reeting ViewModel ( userId ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠInter op Architecture Snippet 2 Ġ{ ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠMy Screen () Ġ{ ĊĠĠĠĠĠĠĠ ĠNav Host ( remember Nav Controller (), Ġstart Destination Ġ= Ġ" profile /{ userId }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ... Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomp osable (" profile /{ userId }") Ġ{ Ġback Stack Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG reeting ( back Stack Entry . arguments ?. getString (" userId ") Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠG reeting ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg reeting ViewModel : ĠG reeting ViewModel Ġ= ĠviewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= ĠG reeting ViewModel Factory ( userId ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage User Ġby Ġg reeting ViewModel . message . observe As State ("") ĊĊĠĠĠĠĠĠĠ ĠText ( message User ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠInter op Architecture Snippet 3 Ġ{ ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġfun ĠBack Handler ( ĊĠĠĠĠĠĠĠ Ġenabled : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġback Dispatcher : ĠOn Back Pressed Dispatcher , ĊĠĠĠĠĠĠĠ Ġon Back : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠS af ely Ġupdate Ġthe Ġcurrent Ġ` on Back ` Ġlambda Ġwhen Ġa Ġnew Ġone Ġis Ġprovided ĊĠĠĠĠĠĠĠ Ġval Ġcurrent On Back Ġby Ġremember Updated State ( on Back ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemember Ġin ĠComp osition Ġa Ġback Ġcallback Ġthat Ġcalls Ġthe Ġ` on Back ` Ġlambda ĊĠĠĠĠĠĠĠ Ġval Ġback Callback Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġintercept Ġback Ġevents . ĠSee Ġthe ĠSide Effect Ġfor Ġa Ġmore Ġcomplete Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Back Pressed Callback ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent On Back () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Ġevery Ġsuccessful Ġcomposition , Ġupdate Ġthe Ġcallback Ġwith Ġthe Ġ` enabled ` Ġvalue ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġtell Ġ` back Callback ` Ġwhether Ġback Ġevents Ġshould Ġbe Ġintercept ed Ġor Ġnot ĊĠĠĠĠĠĠĠ ĠSide Effect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Callback . isEnabled Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġ` back Dispatcher ` Ġchanges , Ġdispose Ġand Ġreset Ġthe Ġeffect ĊĠĠĠĠĠĠĠ ĠDis posable Effect ( back Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcallback Ġto Ġthe Ġback Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Dispatcher . add Callback ( back Callback ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġeffect Ġleaves Ġthe ĠComp osition , Ġremove Ġthe Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback Callback . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠInter op Architecture Snippet 4 Ġ{ ĊĠĠĠ Ġclass ĠCustom ViewGroup Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdef Style : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ: ĠLinearLayout ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠSource Ġof Ġtruth Ġin Ġthe ĠView Ġsystem Ġas Ġmutable State Of ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġmake Ġit Ġthread - safe Ġfor ĠCompose ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtext Ġby Ġmutable State Of ("") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextView : ĠTextView ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠV ERT ICAL ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompose View Ġ= ĠCompose View ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Theme Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTextField ( value Ġ= Ġtext , Ġon Value Change Ġ= Ġ{ Ġupdate State ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( compose View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġboth Ġthe Ġsource Ġof Ġtruth Ġand Ġthe ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate State ( newValue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* Ċ F akes Ġneeded Ġfor Ġsnippets Ġto Ġbuild : Ċ Ġ*/ Ċ Ċ private Ġclass ĠG reeting ViewModel ( userId : ĠString ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġ_ message Ġ= ĠMutable LiveData ("") ĊĠĠĠ Ġval Ġmessage : ĠLive Data < String > Ġ= Ġ_ message Ċ } Ċ private Ġclass ĠG reeting ViewModel Factory ( private Ġval ĠuserId : ĠString ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠG reeting ViewModel ( userId ) Ġas ĠT ĊĠĠĠ Ġ} Ċ } Ċ