/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 . ĠZ ac ĠS we ers Ċ Ġ* Ċ Ġ* Ġ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 Ġio . s we ers . catch up . ui . activity Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . compose . animation . Animated Visibility Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . animation . expand In Ċ import Ġandroidx . compose . animation . shrink Out Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . indic ation Ċ import Ġandroidx . compose . foundation . interaction . Mutable Interaction Source Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ 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 . padding Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . layout . wrap Content Height Ċ import Ġandroidx . compose . foundation . layout . wrap Content Width Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . material . Floating ActionButton Ċ import Ġandroidx . compose . material . IconButton Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Sca ffold Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . Top AppBar Ċ import Ġandroidx . compose . material . ripple . remember R ipple Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . collect As State Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Color Filter Ċ import Ġandroidx . compose . ui . layout . on Glob ally Position ed Ċ import Ġandroidx . compose . ui . layout . position In Root Ċ import Ġandroidx . compose . ui . platform . Compose View Ċ import Ġandroidx . compose . ui . res . color Resource Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . text . font . FontStyle Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . constraint layout . compose . Constr ained Layout Reference Ċ import Ġandroidx . constraint layout . compose . Constraint Layout Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ch ib atch ing . kot pref . bulk Ċ import Ġdagger . Module Ċ import Ġdagger . h ilt . Install In Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġdagger . h ilt . android . components . Fragment Component Ċ import Ġdagger . mult ib ind ings . Mult ib inds Ċ import Ġdev . z acs we ers . catch up . app config . AppConfig Ċ import Ġdev . z acs we ers . catch up . compose . Catch Up Theme Ċ import Ġio . s we ers . catch up . Catch Up Preferences Ċ import Ġio . s we ers . catch up . R Ċ import Ġio . s we ers . catch up . base . ui . Injectable Base Fragment Ċ import Ġio . s we ers . catch up . databinding . Fragment Order Services Binding Ċ import Ġio . s we ers . catch up . edu . Sy ll ab us Ċ import Ġio . s we ers . catch up . flow For Ċ import Ġio . s we ers . catch up . injection . D agger Map Ċ import Ġio . s we ers . catch up . service . api . Service Meta Ċ import Ġio . s we ers . catch up . ui . Font Helper Ċ import Ġio . s we ers . catch up . util . set Light StatusBar Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . Sharing Started Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . drop Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . state In Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ /* Ċ Ġ* ĠThis Ġis Ġa ĠWIP Ġimplementation Ġof ĠOrder Services Ġview Ġwith ĠCompose . Ċ Ġ* Ċ Ġ* ĠTODO : Ċ Ġ* Ġ Ġ* ĠS yll ab us Ġhandling Ġ- Ġrequires Ġintegr ating Ġtap Ġtarget Ġon Ġthe Ġlocation Ċ Ġ* Ġ Ġ* ĠDrag - and - drop Ġ- Ġcompose Ġdoesn 't Ġsupport Ġthis Ġout Ġof Ġthe Ġbox . Ċ Ġ* ĠĠĠ Ġ* ĠAn Ġintermediate Ġsolution Ġmight Ġbe Ġto Ġadd Ġup / down Ġarrows Ċ Ġ*/ Ċ Ċ private Ġclass ĠOrder Services ViewModel ( ĊĠ Ġservice Met as Map : ĠD agger Map < String , ĠService Meta >, ĊĠ Ġprivate Ġval Ġcatch Up Preferences : ĠCatch Up Preferences Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠ Ġprivate Ġval Ġstored Order : ĠState Flow < List < String >> ĊĠ Ġprivate Ġval Ġ_ service Met as : ĠMutable State Flow < List < Service Meta >> ĊĠ Ġval Ġservice Met as : ĠState Flow < List < Service Meta >> Ġget () Ġ= Ġ_ service Met as ĊĠ Ġval Ġcan Save : ĠState Flow < Boolean > ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġinitial Order Ġ= Ġcatch Up Preferences . services Order ?. split (",") Ġ?: Ġempty List () ĊĠĠĠ Ġval Ġinitial Ordered Services Ġ= Ġservice Met as Map . values . sorted By Ġ{ Ġinitial Order . indexOf ( it . id ) Ġ} ĊĠĠĠ Ġstored Order Ġ= Ġcatch Up Preferences . flow For Ġ{ Ġ:: services Order Ġ} ĊĠĠĠĠĠ Ġ. drop ( 1 ) Ġ// ĠIgnore Ġthe Ġinitial Ġvalue Ġwe Ġread Ġsynchronous ly ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit ?. split (",") Ġ?: Ġempty List () Ġ} ĊĠĠĠĠĠ Ġ. state In ( viewModel Scope , ĠSh aring Started . L az ily , Ġinitial Order ) ĊĠĠĠ Ġ_ service Met as Ġ= ĠMutable State Flow ( initial Ordered Services ) ĊĊĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠ Ġstored Order ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnew Order Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġservice Met as Map . values . sorted By Ġ{ Ġnew Order . indexOf ( it . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ service Met as . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcan Save Ġ= Ġservice Met as ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ!= Ġinitial Ordered Services Ġ} ĊĠĠĠĠĠ Ġ. state In ( viewModel Scope , ĠSh aring Started . L az ily , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġfun Ġshuffle () Ġ{ ĊĠĠĠ Ġval Ġitems Ġ= Ġservice Met as . value . to Mutable List () ĊĠĠĠ Ġitems . shuffle () ĊĠĠĠ Ġ_ service Met as . value Ġ= Ġitems ĊĠ Ġ} ĊĊĠ Ġfun Ġsave () Ġ{ ĊĠĠĠ Ġcatch Up Preferences . bulk Ġ{ ĊĠĠĠĠĠ Ġservices Order Ġ= Ġservice Met as . value . join ToString (",", Ġtransform Ġ= ĠService Meta :: id ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġshould Show Sy ll ab us (): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġimplement Ġthis ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} Ċ } Ċ Ċ @ Android EntryPoint Ċ class ĠOrder Services Fragment 2 Ġ: ĠInjectable Base Fragment < Fragment Order Services Binding >() Ġ{ ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġservice Met as : ĠD agger Map < String , ĠService Meta > ĊĊĠ Ġ@ Inject ĊĠ Ġlateinit Ġvar Ġcatch Up Preferences : ĠCatch Up Preferences ĊĊĠ Ġ@ Inject ĊĠ Ġinternal Ġlateinit Ġvar Ġsy ll ab us : ĠS yll ab us ĊĊĠ Ġ@ Inject ĊĠ Ġinternal Ġlateinit Ġvar Ġfont Helper : ĠFont Helper ĊĊĠ Ġ@ Inject ĊĠ Ġinternal Ġlateinit Ġvar Ġapp Config : ĠApp Config ĊĊĠ Ġ// ĠHave Ġto Ġdo Ġthis Ġhere Ġbecause Ġwe Ġcan 't Ġset Ġa Ġfactory Ġseparately ĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġprivate Ġval ĠviewModel Ġby Ġview Models < Order Services ViewModel > Ġ{ ĊĠĠĠ Ġobject Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel > Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOrder Services ViewModel ( service Met as , Ġcatch Up Preferences ) Ġas ĠT ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠTODO Ġremove Ġwith Ġview binding ĠAPI Ġchange ĊĠ Ġoverride Ġval Ġbinding Inflater : Ġ( LayoutInflater , ĠViewGroup ?, ĠBoolean ) Ġ-> ĠFragment Order Services Binding Ġ= ĊĠĠĠ ĠFragment Order Services Binding :: inflate ĊĊĠ Ġoverride Ġfun Ġinit View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?): ĠView Ġ{ ĊĠĠĠ Ġreturn ĠCompose View ( in flater . context ). apply Ġ{ ĊĠĠĠĠĠ Ġset Light StatusBar ( app Config ) ĊĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠ ĠCatch Up Theme Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠHave Ġto Ġpass Ġthe Ġview model Ġhere Ġrather Ġthan Ġuse Ġcompose ' ĠviewModel () Ġbecause Ġotherwise Ġit ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġtry Ġthe Ġreflect ive Ġinstantiation Ġsince Ġthe Ġfactory Ġisn 't Ġinitialized Ġbecause Ġlo l ĊĠĠĠĠĠĠĠĠĠ ĠScaffold Content ( viewModel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Opt In ( Experimental Animation Api :: class ) ĊĠ Ġ@ Composable ĊĠ Ġprivate Ġfun ĠScaffold Content ( viewModel : ĠOrder Services ViewModel ) Ġ{ ĊĠĠĠ Ġval Ġcan Save : ĠBoolean Ġby ĠviewModel . can Save . collect As State () ĊĠĠĠ ĠScaffold ( ĊĠĠĠĠĠ Ġtop Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠTop AppBar ( ĊĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( string Resource ( id Ġ= ĠR . string . pref _ reorder _ services )) ĊĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġnavigation Icon Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ:: on Back Pressed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Resource ( id Ġ= ĠR . drawable . ic _ arrow _ back _ black _ 2 4 dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Resource ( id Ġ= ĠR . string . back ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġactions Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= ĠviewModel :: shuffle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Resource ( R . drawable . ic _ shuffle _ black _ 2 4 dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Resource ( R . string . shuffle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĠList Content ( viewModel ) Ġ}, ĊĠĠĠĠĠ Ġfloating ActionButton Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠAnimated Visibility ( ĊĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġcan Save , ĊĠĠĠĠĠĠĠĠĠ Ġenter Ġ= Ġexpand In ( expand From Ġ= ĠAlignment . Center ), ĊĠĠĠĠĠĠĠĠĠ Ġexit Ġ= Ġshrink Out ( shrink Tow ards Ġ= ĠAlignment . Center ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġri pple Ġcolor ? ĊĠĠĠĠĠĠĠĠĠ ĠFloating ActionButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. indic ation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMutable Interaction Source (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindication Ġ= Ġremember R ipple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . White ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Glob ally Position ed Ġ{ Ġcoordinates Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġcoordinates . position In Root () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġshow Ġsy ll ab us Ġon Ġfab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= Ġcolor Resource ( R . color . color Accent ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Resource ( R . drawable . ic _ save _ black _ 2 4 dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Resource ( R . string . save ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Filter Ġ= ĠColor Filter . tint ( Color . White ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Composable ĊĠ Ġprivate Ġfun ĠList Content ( viewModel : ĠOrder Services ViewModel ) Ġ{ ĊĠĠĠ Ġval Ġcurrent Items Sorted Ġby ĠviewModel . service Met as . collect As State () ĊĠĠĠ ĠSurface ( Modifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠ ĠLazy Column Ġ{ ĊĠĠĠĠĠĠĠ Ġitems ( current Items Sorted . size ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġcurrent Items Sorted [ index ] ĊĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( color Resource ( id Ġ= Ġitem . theme Color )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 1 6 . dp ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstraint Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () Ġ// ĠTODO Ġremove Ġthis ... ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Width ( Alignment . Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( icon , Ġsp acer , Ġtext ) Ġ= Ġcreate Refs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Resource ( id Ġ= Ġitem . icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Resource ( R . string . service _ icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 4 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 4 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. constr ain As ( icon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . link To ( parent . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . link To ( spacer . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . link To ( parent . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . link To ( parent . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 4 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. constr ain As ( spacer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . link To ( parent . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . link To ( text . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . link To ( icon . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . link To ( parent . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ref : ĠCon str ained Layout Reference Ġ= Ġsp acer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġstring Resource ( id Ġ= Ġitem . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . constr ain As ( text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . link To ( parent . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . link To ( parent . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . link To ( start Ref . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . link To ( parent . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Style Ġ= ĠFont Style . Normal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġwhat Ġabout ĠSub head ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . subtitle 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . White ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( viewModel . can Save . value ) Ġ{ ĊĠĠĠĠĠ ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . pending _ changes _ title ) ĊĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . pending _ changes _ message ) ĊĠĠĠĠĠĠĠ Ġ. set Neutral Button ( android . R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> Ġdialog . dismiss () Ġ} ĊĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . dont save ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . save ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠ ĠviewModel . save () ĊĠĠĠĠĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġactivity ?. finish () ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} Ċ } Ċ Ċ @ Install In ( Fragment Component :: class ) Ċ @ Module Ċ abstract Ġclass ĠOrder Services Module 2 Ġ{ ĊĊĠ Ġ@ Mult ib inds ĊĠ Ġabstract Ġfun Ġservice Met as (): ĠMap < String , ĠService Meta > Ċ } Ċ