/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ- Ġpresent , ĠMulti ĠStep ĠPages Ġcontributors Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . um br al tech . mult iste pp ages Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . Measure Spec . make Measure Spec Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . constraint layout . widget . Constraint Layout . LayoutParams . PARENT _ ID Ċ import Ġandroidx . constraint layout . widget . Constraint Layout . LayoutParams . WRAP _ CONTENT Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 Ċ import Ġcom . um br al tech . mult iste pp ages . indicator . Indicator Ċ import Ġcom . um br al tech . mult iste pp ages . indicator . view . Bar Indicator View Ċ import Ġcom . um br al tech . mult iste pp ages . indicator . view . Indicator View Ċ import Ġcom . um br al tech . mult iste pp ages . indicator . view . Step Indicator View Ċ import Ġkotlinx . android . synt hetic . main . multi _ step _ layout .* Ċ import Ġkotlinx . android . synt hetic . main . multi _ step _ layout . view .* Ċ Ċ class ĠMulti Step Dialog Fragment Ġ: ĠDialog Fragment () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG : ĠString ? Ġ= ĠMulti Step Dialog Fragment :: class . simple Name ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( title : ĠString , Ġsteps : ĠList < Step < *, Ġ* >>, Ġindicator : ĠIndicator Ġ= ĠIndicator . NONE ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMulti Step Dialog Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretain Instance Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . steps Ġ= Ġsteps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . indicator Ġ= Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtitle : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsteps : ĠList < Step < *, Ġ* >> ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġindicator : ĠIndicator ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialog : ĠAlertDialog ĊĊĠĠĠ Ġprivate Ġvar Ġindicator View : ĠIndicator View ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġpager Adapter : ĠPage Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPage Adapter ( steps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlayout Listener : ĠView . On Layout ChangeListener Ġ= ĊĠĠĠĠĠĠĠ ĠView . On Layout ChangeListener Ġ{ Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġdialog . multi _ step _ layout _ view _ pager . currentItem ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpager Adapter . getView ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . multi _ step _ layout _ view _ pager . update Pager Height For Child ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Inf late Params ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate Dialog ( savedInstanceState : ĠBundle ?): ĠDialog Ġ{ ĊĠĠĠĠĠĠĠ Ġindicator View Ġ= Ġwhen Ġ( indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndicator . STEP Ġ-> ĠStep Indicator View ( require Context (), Ġstep Count Ġ= Ġsteps . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndicator . BAR Ġ-> ĠBar Indicator View ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndicator . NONE Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( require Context ()). inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . multi _ step _ layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ view _ pager . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis User Input Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġpager Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator View ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠConstraint Layout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWR AP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft To Left Ġ= ĠP ARENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright To Right Ġ= ĠP ARENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop To Top Ġ= ĠR . id . multi _ step _ layout _ back _ button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom To Bottom Ġ= ĠR . id . multi _ step _ layout _ back _ button ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ root . addView ( indicator View , Ġlayout Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdialog Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdialog ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĊĠĠĠĠĠĠĠ Ġwith ( dialog ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow ?. clear Flags ( WindowManager . LayoutParams . FLAG _ NOT _ FOCUS ABLE Ġor ĠWindow Manager . LayoutParams . FLAG _ ALT _ FOCUS ABLE _ IM ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ next _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Next Button Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ back _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Back Button Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ view _ pager . register On Page Change Callback ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Pager 2 . On Page Change Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Selected ( position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġall Ġpre - existing Ġlisteners ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i : ĠInt Ġin Ġ 0 Ġuntil Ġpager Adapter . item Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpager Adapter . getView ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . remove On Layout ChangeListener ( layout Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġlistener Ġfor Ġcurrent Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpager Adapter . getView ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . add On Layout ChangeListener ( layout Listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġsteps [ position ]. title Ġ?: Ġthis @ Multi Step Dialog Fragment . title ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( dialog ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( title ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ back _ button . isEnabled Ġ= Ġposition Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti _ step _ layout _ next _ button . setText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ( steps . size Ġ- Ġ 1 )) ĠR . string . finish Ġelse ĠR . string . next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep View Ġ= Ġpager Adapter . getView ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsteps [ position ]. layout Listener ?. on Layout ?. invoke ( step View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator View ?. set Progress ( position . toFloat () Ġ/ Ġsteps . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġpager Adapter . save State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdialog Next Button Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcur Index Ġ= Ġdialog . multi _ step _ layout _ view _ pager . currentItem ĊĊĠĠĠĠĠĠĠ Ġsteps [ cur Index ]. advance Listener . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpager Adapter . getView ( cur Index ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsteps . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdialog Back Button Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġdialog . multi _ step _ layout _ view _ pager . currentItem -- ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠFix Ġvisual Ġartifact Ġfrom Ġinitial Ġresize ĊĠĠĠ Ġprivate Ġfun ĠView Pager 2 . update Pager Height For Child ( view : ĠView ) Ġ= Ġpost Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw Measure Spec Ġ= Ġmake Measure Spec ( width , ĠView . Measure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġh Measure Spec Ġ= Ġmake Measure Spec ( 0 , ĠView . Measure Spec . UNSPECIFIED ) ĊĊĠĠĠĠĠĠĠ Ġview . measure ( w Measure Spec , Ġh Measure Spec ) ĊĊĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlayout Params . also Ġ{ Ġlp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . height Ġ= Ġview . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . width Ġ= Ġview . meas ured Width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }