package Ġcom . ro sha an . multiple bottom sheets Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Ċ Ċ /** Ċ Ġ* ĠMultiple Sheet s Container Ġmust Ġhave Ġlayout _ height =" match _ parent " Ġor Ġdefined Ġin Ġdp , Ġwrap _ content Ġis Ġnot Ġsupported Ċ Ġ* ĠDefault Ġminimum Sheet s Height Difference Ġis Ġ 3 0 dp Ċ Ġ* ĠDefault Ġsheets Count Ġis Ġ 3 Ċ Ġ* ĠDefault Ġsheets Corner Radius Ġis Ġ 0 dp Ċ Ġ* ĠDefault Ġlocked Sheet Index Ġis ĠUN LOCK ED Ċ Ġ* Ġlower Ġsheet Ġwill Ġbe Ġadded Ġin Ġlast Ġ, Ġlower Ġsheet Ġwill Ġhave Ġminimum Ġheight s , Ġlower Ġsheet Ġwill Ġhave Ġhe ighest Ġindex Ċ Ġ* Ġbottom Ġsheets Ġshould Ġbe Ġattached Ġto Ġthe Ġbottom Ġof Ġthe Ġscreen Ġi , e Ġno Ġview Ġshould Ġbe Ġplaced Ġbelow Ġbottom Ġsheets Ċ Ġ* Ġ Ġ*/ Ċ class ĠMultiple Sheet s Container Ġ: ĠRelative Layout Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsheets Count : ĠInt Ġ= ĠDEFAULT _ SHE ETS _ COUNT ĊĠĠĠ Ġ// ĠĠ ĠValues ĠIN ĠDP ĊĠĠĠ Ġprivate Ġvar Ġminimum Sheet s Height Difference : ĠInt Ġ= ĊĠĠĠĠĠĠĠ ĠDEFAULT _ MIN IMUM _ SHE ETS _ HEIGHT _ DI FFER ENCE ĊĠĠĠ Ġprivate Ġvar Ġsheets Top Corner Radius : ĠFloat Ġ= ĊĠĠĠĠĠĠĠ ĠDEFAULT _ SHE ETS _ TOP _ COR NER _ RADIUS ĊĊĠĠĠ Ġvar Ġlocked Sheet Index Ġ= ĠREMOVE _ LOCK ĊĊĊĠĠĠ Ġprivate Ġval Ġsheets Ġ= Ġmutable ListOf < Custom Sheet >() ĊĠĠĠ Ġprivate Ġval Ġscreen Max Height Ġ= Ġcontext . getResources (). getDisplay Metrics (). height Pixels ; ĊĠĠĠ Ġprivate Ġvar Ġare Sheet s Added Ġ= Ġfalse ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Multiple Sheet s Container , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsheets Count Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . getInt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Multiple Sheet s Container _ sheets Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ SHE ETS _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġminimum Sheet s Height Difference Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . get Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Multiple Sheet s Container _ sheets Height Difference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpx From Dp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ MIN IMUM _ SHE ETS _ HEIGHT _ DI FFER ENCE . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toInt () ĊĊĠĠĠĠĠĠĠ Ġsheets Top Corner Radius Ġ= Ġtyped Array . get Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Multiple Sheet s Container _ sheets Top Corner Radius , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ SHE ETS _ TOP _ COR NER _ RADIUS ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġon Size Changed Ġcould Ġbe Ġcalled Ġmultiple Ġtypes Ġlike Ġfor Ġevents Ġlike Ġkeyboard Ġopen ĊĠĠĠĠĠĠĠ Ġif Ġ(! are Sheet s Added ) Ġ{ Ċ /* Ċ * ĠĠĠĠĠĠĠĠĠĠ Ġcalling Ġadd Sheet s Ġhere Ġso Ġwe Ġcan Ġget Ġactual Ġheight Ġof Ġthis Ġview Ċ * ĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġon Size Changed Ġthis Ġview 's Ġheight Ġcan Ġchange Ċ */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sheet s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġare Sheet s Added Ġ= Ġtrue Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġlayout Ġwon 't Ġwork Ġinside Ġon Size Changed Ġbecause Ġit Ġis Ġpart Ġof Ġview Ġcycle Ġso Ġdelay ing Ġits Ġexecution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ Ġrequest Layout () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Sheet s () Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsheets Count Ġdown To Ġ 1 ) Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġsheet Ġwill Ġhave Ġmaximum Ġminimum Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġminimum Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Sheet s Height Difference Ġ* Ġi Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġadding Ġfirst Ġsheet Ġthen Ġmake Ġits Ġheight Ġ= Ġto Ġthis Ġview 's Ġheight Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsubtract Ġheight Ġdifference Ġfrom Ġprevious Ġsheet 's Ġmax Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmaximum Height Ġ= Ġif Ġ( sheets . size Ġ== Ġ 0 ) Ġheight // this . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsheets . get ( sheets . size Ġ- Ġ 1 ). max Height Ġ- Ġminimum Sheet s Height Difference ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparams Ġ= ĠLayout Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġalign ing Ġsheet Ġto Ġthe Ġbottom Ġof Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Rule ( ALIGN _ PARENT _ BOTTOM ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsheet Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustom Sheet ( this . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . min Height Ġ= Ġminimum Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . max Height Ġ= Ġmaximum Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . id Ġ= ĠView . generate View Id () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . top Corner Radius Ġ= Ġsheets Top Corner Radius ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( sheet , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Sheet Touch Listener ( sheet ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheets . add ( sheet ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . index Ġ= Ġsheets . size Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġprivate Ġfun Ġset On Sheet Touch Listener ( custom Sheet : ĠCustom Sheet ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġdy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġshould Drag Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġcustom Sheet . setOn Touch Listener Ġ{ Ġcurrent Sheet , Ġevent Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsheet Actual Coord inated On Screen Ġ= Ġint ArrayOf ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġget Location On Screen Ġreturns Ġactual Ġcoordinate Ġof Ġview Ġw . r . t Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġnot Ġw . r . t Ġparent Ġview group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Sheet . getLocation On Screen ( sheet Actual Coord inated On Screen ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Y Ġrepresents Ġthe Ġarea Ġwhich Ġshould Ġbe Ġignored Ġwhile Ġsetting Ġnew Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy Ġ= Ġ( event . raw Y Ġ- Ġsheet Actual Coord inated On Screen . get ( 1 )). toInt () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġdrag Ġeffect Ġworks Ġif Ġit Ġis Ġoccured Ġon Ġtop Ġarea Ġof Ġsheet Ġheight = ĠminHeight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġnot Ġusing Ġevent . raw Y - sheet . y , Ġbecause Ġsheet . y Ġreturns Ġy Ġcoordinate Ġof Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġw . r . t Ġparent Ġview group Ġand Ġevent . raw Y Ġreturns Ġactual Ġlocation Ġof Ġevent Ġw . r . t Ġwhole Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ|| Ġdrag Ġeffect Ġworks Ġif Ġsheet Ġis Ġnot Ġlocked , Ġall Ġthe Ġsheets Ġhaving Ġindex Ġ>= Ġto Ġlocked Sheet Index Ġwill Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġconsidered Ġas Ġlocked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Drag Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((( event . raw Y . toInt () Ġ- Ġsheet Actual Coord inated On Screen . get ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ> Ġminimum Sheet s Height Difference ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( locked Sheet Index Ġ!= ĠREMOVE _ LOCK Ġ&& Ġlocked Sheet Index Ġ<= Ġ( current Sheet Ġas ĠCustom Sheet ). index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! should Drag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġfalse ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġsubtract ing Ġevent 's Ġy Ġvalue Ġfrom Ġtotal Ġscreen Ġheight Ġand Ġadding Ġignored Ġarea Ġto Ġget Ġactual Ġlocation Ġof Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġnew Height Ġwill Ġbe Ġequal Ġto Ġthat Ġvalue Ġonly Ġfr Ġcurrent Ġsheet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Height Ġ= Ġ( screen Max Height Ġ- Ġevent . raw Y ). toInt () Ġ+ Ġdy Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtract ing Ġsheet 's Ġprevious Ġheight Ġfrom Ġnew Height Ġto Ġbe Ġto Ġget Ġdrag ged Ġarea ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdrag ged Y Pixels Ġ= ĠMath . abs ( current Sheet . height Ġ- Ġnew Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Up ward Motion Ġ= Ġnew Height Ġ> Ġcurrent Sheet . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Down ward Motion Ġ= Ġnew Height Ġ< Ġcurrent Sheet . height Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġshould Ġrespect Ġits Ġminimum Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Height Ġ< Ġ( current Sheet Ġas ĠCustom Sheet ). min Height ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height Ġ= Ġcurrent Sheet . min Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged Y Pixels Ġ= ĠMath . abs ( current Sheet . height Ġ- Ġnew Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Up ward Motion Ġ= Ġnew Height Ġ> Ġcurrent Sheet . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Down ward Motion Ġ= Ġnew Height Ġ< Ġcurrent Sheet . height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġshould Ġrespect Ġits Ġmax Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( new Height Ġ> Ġcurrent Sheet . max Height ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height Ġ= Ġcurrent Sheet . max Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged Y Pixels Ġ= ĠMath . abs ( current Sheet . height Ġ- Ġnew Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Up ward Motion Ġ= Ġnew Height Ġ> Ġcurrent Sheet . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Down ward Motion Ġ= Ġnew Height Ġ< Ġcurrent Sheet . height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP PLY ING ĠCAL C UL ATIONS ĠTO ĠS HE ETS Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMOV ING ĠCURRENT ĠS HE ET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( current Sheet . layout Params Ġas ĠLayout Params ). height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġit Ġis Ġup ward Ġmotion ĠDR AGG ĠS HE ETS ĠA BO VE ĠCURRENT ĠS HE ET ĠAL SO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Up ward Motion ) Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġeach Ġabove Ġsheet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġcurrent Sheet . index ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġabove Sheet Ġ= Ġsheets . get ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height Ġ= Ġabove Sheet . height Ġ+ Ġdrag ged Y Pixels Ċ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsheet Ġshould Ġrespect Ġits Ġmax Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Height Ġ> Ġabove Sheet . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( above Sheet . layout Params Ġas ĠLayout Params ). height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabove Sheet . max Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoving Ġsheet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( above Sheet . layout Params Ġas ĠLayout Params ). height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOWN WARD ĠM OT ION ĠDR AG ĠS HE ETS ĠBE LOW ĠCURRENT ĠS HE ET ĠAL SO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Down ward Motion ) Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġeach Ġbelow Ġsheet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġcurrent Sheet . index Ġ+ Ġ 1 Ġuntil Ġsheets . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbelow Sheet Ġ= Ġsheets . get ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height Ġ= Ġbelow Sheet . height Ġ- Ġdrag ged Y Pixels Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsheet Ġshould Ġrespect Ġits Ġminimum Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Height Ġ< Ġ( below Sheet ). min Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( below Sheet . layout Params Ġas ĠLayout Params ). height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbelow Sheet . min Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoving Ġsheet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( below Sheet . layout Params Ġas ĠLayout Params ). height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Ġmotion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalling Ġreq e ust Ġlayout Ġfor Ġall Ġsheets Ġto Ġmake Ġheight Ġchanges Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsheets . forEach Ġ{ Ġit . request Layout () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Fragment ( index : ĠInt , Ġfragment : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠ Ġadding Ġdelay Ġso Ġfragment Ġwill Ġbe Ġadded Ġafter Ġsheets Ġhave Ġbeen Ġrendered ĊĠĠĠĠĠĠĠ Ġpost Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠAppCompatActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠAppCompatActivity ). support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( sheets . get ( index ). id , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Fragments ( fragments : ĠList < Fragment >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fragments Ġ== Ġnull ) Ġreturn Ċ Ċ // ĠĠĠĠ Ġadding Ġdelay Ġso Ġfragment Ġwill Ġbe Ġadded Ġafter Ġsheets Ġhave Ġbeen Ġrendered ĊĠĠĠĠĠĠĠ Ġpost Delayed ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠAppCompatActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfragments . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠAppCompatActivity ). support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( sheets . get ( i ). id , Ġfragments . get ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġclass ĠCustom Sheet Ġ: ĠFrame Layout Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar ĠmaxHeight : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar ĠminHeight : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġvar Ġtop Corner Radius Ġ= ĠDEFAULT _ SHE ETS _ TOP _ COR NER _ RADIUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġpx From Dp ( context , Ġvalue ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġset Layer Type ( View . LAYER _ TYPE _ SOFTWARE , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠĠĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġprotected Ġfun Ġdispatch Draw ( canvas : ĠCanvas ) Ġ{ Ċ Ċ // ĠĠĠĠĠĠ Ġsetting Ġcorner Ġradius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcanvas . save () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorner Dimensions Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Corner Radius , Ġ// top Right Corner Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Corner Radius , Ġ// top Right Corner Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Corner Radius , Ġ// top Left Corner Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Corner Radius , Ġ// top Left Corner Radius ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Right Corner Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ,// ĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Right Corner Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ,// ĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Left Corner Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Left Corner Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add Round Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect F ( 0 f , Ġ 0 f , Ġcanvas . getWidth (). toFloat (), Ġcanvas . getHeight (). toFloat ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Dimensions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath . Direction . CW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . clip Path ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore To Count ( count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } ĊĊ