/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . ui . demos . view interop Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . activity . Component Activity Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Padding Values Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . offset Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . Top AppBar Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Experimental Compose Ui Api Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . demos . R Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . input . nested scroll . Nested Scroll Connection Ċ import Ġandroidx . compose . ui . input . nested scroll . Nested Scroll Source Ċ import Ġandroidx . compose . ui . input . nested scroll . nested Scroll Ċ import Ġandroidx . compose . ui . platform . Compose View Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . platform . remember Nested Scroll Interop Connection Ċ import Ġandroidx . compose . ui . unit . Int Offset Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . view interop . Android View Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġkotlin . math . round ToInt Ċ Ċ private Ġval ĠToolbar Height Ġ= Ġ 4 8 . dp Ċ Ċ @ Suppress Lint (" Un necessary Lambda Creation ") Ċ @ Composable Ċ private Ġfun ĠO uter Compose With Nested Scroll ( factory : Ġ( Context ) Ġ-> ĠView ) Ġ{ ĊĠĠĠ Ġval Ġtoolbar Height Px Ġ= Ġwith ( Local Density . current ) Ġ{ ĠToolbar Height . round To Px (). toFloat () Ġ} ĊĠĠĠ Ġval Ġtoolbar Offset Height Px Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĊĠĠĠ Ġval Ġnested Scroll Connection Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠNested Scroll Connection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Scroll ( available : ĠOffset , Ġsource : ĠNested Scroll Source ): ĠOffset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġavailable . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Offset Ġ= Ġtoolbar Offset Height Px . value Ġ+ Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar Offset Height Px . value Ġ= Ġnew Offset . coerce In (- toolbar Height Px , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOffset . Zero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCompose ĠScroll able ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. nested Scroll ( nested Scroll Connection ) ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠTop AppBar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( Toolbar Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset Ġ{ ĠInt Offset ( x Ġ= Ġ 0 , Ġy Ġ= Ġtoolbar Offset Height Px . value . round ToInt ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText (" toolbar Ġoffset Ġis Ġ${ toolbar Offset Height Px . value }") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAndroid ĠView ĊĠĠĠĠĠĠĠ ĠAndroid View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= Ġ{ Ġcontext Ġ-> Ġfactory ( context ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill Max Width () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAndroid View With Nested Scroll Enabled ( context : ĠContext ): ĠView Ġ{ ĊĠĠĠ Ġreturn ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . android _ in _ compose _ nested _ scroll _ interop , Ġnull ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( findViewById < RecyclerView >( R . id . main _ list )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( context , ĠRecyclerView . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠNested Scroll Interop Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Nested Scrolling Enabled ( it , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ internal Ġfun ĠNested Scroll Interop Compose Parent With Android Child () Ġ{ ĊĠĠĠ ĠO uter Compose With Nested Scroll Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠ ĠAndroid View With Nested Scroll Enabled ( context ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Compose Ui Api :: class ) Ċ @ Composable Ċ private Ġfun ĠLazy Column With Nested Scroll Interop Enabled () Ġ{ ĊĠĠĠ ĠLazy Column ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . nested Scroll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremember Nested Scroll Interop Connection () ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġcontent Padding Ġ= ĠPadding Values ( top Ġ= ĠToolbar Height ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" This Ġis Ġa ĠLazy ĠColumn ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitems ( 4 0 ) Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 1 6 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 5 6 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Gray ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Alignment Ġ= ĠAlignment . Center ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( item . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ internal Ġfun ĠCompose View Compose Nested Interop () Ġ{ ĊĠĠĠ ĠO uter Compose With Nested Scroll Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠ ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . three _ fold _ nested _ scroll _ interop , Ġnull ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( findViewById < Compose View >( R . id . compose _ view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĠLazy Column With Nested Scroll Interop Enabled () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Nested Scrolling Enabled ( it , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠNested Scroll Interop Adapter Ġ: ĊĠĠĠ ĠRecyclerView . Adapter < Nested Scroll Interop Adapter . Nested Scroll Interop ViewHolder >() Ġ{ ĊĠĠĠ Ġval Ġitems Ġ= Ġ( 1 .. 1 0 0 ). map Ġ{ Ġit . toString () Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( ĊĠĠĠĠĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠĠĠĠĠ Ġview Type : ĠInt ĊĠĠĠ Ġ): ĠNested Scroll Interop ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNested Scroll Interop ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . android _ in _ compose _ nested _ scroll _ interop _ list _ item , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠNested Scroll Interop ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind (" This Ġis Ġa ĠR V ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( items [ position ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġitems . size ĊĊĠĠĠ Ġclass ĠNested Scroll Interop ViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < TextView >( R . id . list _ item ). text Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Compose Ui Api Ċ internal Ġclass ĠCompose In Android Coordinator Layout Ġ: ĠComponent Activity () Ġ{ ĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . compose _ in _ android _ coordinator _ layout ) ĊĠĠĠĠĠĠĠ ĠfindViewById < Compose View >( R . id . compose _ view ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĠLazy Column With Nested Scroll Interop Enabled () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Compose Ui Api Ċ internal Ġclass ĠView Compose View Nested Scroll Interop Demo Ġ: ĠComponent Activity () Ġ{ ĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . compose _ in _ android _ coordinator _ layout ) ĊĠĠĠĠĠĠĠ ĠfindViewById < Compose View >( R . id . compose _ view ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnested Scroll Interop Ġ= Ġremember Nested Scroll Interop Connection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( modifier Ġ= ĠModifier . nested Scroll ( nested Scroll Interop )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid View ({ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid View With Nested Scroll Enabled ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġmodifier Ġ= ĠModifier . fill Max Width ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }