/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . example . fo ster . ui . detail Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . material . AlertDialog Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . IconButton Ċ import Ġandroidx . compose . material . Local Content Color Ċ 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 . Text Button Ċ import Ġandroidx . compose . material . Top AppBar Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Arrow Back Ċ import Ġandroidx . compose . material . icons . filled . Favorite Border Ċ import Ġandroidx . compose . material . icons . filled . Share Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . collect As State Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . save able . remember Save able Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġcom . example . fo ster . R Ċ import Ġcom . example . fo ster . data . post . Pet P als Repository Ċ import Ġcom . example . fo ster . data . post . impl . pal 3 Ċ import Ġcom . example . fo ster . model . Pet Pal Ċ import Ġcom . example . fo ster . ui . The med Preview Ċ import Ġcom . example . fo ster . ui . home . Bookmark Button Ċ import Ġcom . example . fo ster . utils . produce Ui State Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Composable Ċ fun ĠDetail Screen ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġrepository : ĠPet P als Repository , ĊĠĠĠ Ġon Back : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġ( pet Pal ) Ġ= Ġproduce Ui State ( repository ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Pet Pal ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpet Pal Data Ġ= Ġpet Pal . value . data Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġa do ption Ġby Ġrepository . observe A do ption (). collect As State ( set Of ()) ĊĊĠĠĠ Ġval Ġis A dopt Ġ= Ġa do ption . contains ( id ) ĊĊĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĊĠĠĠ ĠDetail Screen ( ĊĠĠĠĠĠĠĠ Ġpet Pal Ġ= Ġpet Pal Data , ĊĠĠĠĠĠĠĠ Ġon Back Ġ= Ġon Back , ĊĠĠĠĠĠĠĠ Ġis A dopt Ġ= Ġis A dopt , ĊĠĠĠĠĠĠĠ Ġon Toggle A dopt Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ Ġrepository . toggle A dopt ( id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠDetail Screen ( ĊĠĠĠ Ġpet Pal : ĠPet Pal , ĊĠĠĠ Ġon Back : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġis A dopt : ĠBoolean , ĊĠĠĠ Ġon Toggle A dopt : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġshow Dialog Ġby Ġremember Save able Ġ{ Ġmutable State Of ( false ) Ġ} ĊĊĠĠĠ Ġif Ġ( show Dialog ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFunction ality Not Available Popup ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Successful Ġa do ption Ġ\ uD 8 3 D \ u DC 4 F ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dismiss Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠScaffold ( ĊĠĠĠĠĠĠĠ Ġtop Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTop AppBar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġpet Pal . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠLocal Content Color . current ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Icon Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġon Back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Filled . Arrow Back , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( R . string . cd _ navigate _ up ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ Ġinner Padding Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier . padding ( inner Padding ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPet Pal Content ( pet Pal , Ġmodifier ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġbottom Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Bar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpet Pal Ġ= Ġpet Pal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Unimplemented Action Ġ= Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . confirm Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . on Confirm Ġ= Ġ{ Ġ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . text Ġ= Ġ" Function ality Ġnot Ġavailable Ġ\ uD 8 3 D \ u DE 4 8 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon A dopt Action Ġ= Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . confirm Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . on Confirm Ġ= Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . text Ġ= Ġ" ĠSuccessful Ġa do ption Ġ\ uD 8 3 D \ u DC 4 F " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis A dopt Ġ= Ġis A dopt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle A dopt Ġ= Ġon Toggle A dopt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠBottom Bar ( ĊĠĠĠ Ġpet Pal : ĠPet Pal , ĊĠĠĠ Ġon Unimplemented Action : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon A dopt Action : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġis A dopt : ĠBoolean , ĊĠĠĠ Ġon Toggle A dopt : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠSurface ( elevation Ġ= Ġ 2 . dp ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Alignment Ġ= ĠAlignment . Center Vert ically , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 5 6 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġon A dopt Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Filled . Favorite Border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( R . string . cd _ add _ to _ favorites ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBook mark Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Book marked Ġ= Ġis A dopt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Toggle A dopt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠLocal Context . current ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġ{ Ġshare Post ( pet Pal , Ġcontext ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Filled . Share , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( R . string . cd _ share ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( modifier Ġ= ĠModifier . weight ( 1 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġon Unimplemented Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( R . drawable . ic _ text _ settings ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( R . string . cd _ text _ settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠFunction ality Not Available Popup ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ Ġconfirm : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġon Confirm : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Dismiss : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠAlertDialog ( ĊĠĠĠĠĠĠĠ Ġon Dismiss Request Ġ= Ġon Dismiss , ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . body 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġconfirm Button Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( confirm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Button ( onClick Ġ= Ġon Confirm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġdismiss Button Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText Button ( onClick Ġ= Ġon Dismiss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" CLOSE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġshare Post ( pet Pal : ĠPet Pal , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TITLE , Ġpet Pal . name ) ĊĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , Ġpet Pal . bre eds ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontext . startActivity ( Intent . create Chooser ( intent , Ġ" Share Ġpost ")) Ċ } Ċ Ċ @ Preview (" Detail Ġbottom Ġbar ") Ċ @ Composable Ċ fun ĠPreview Bottom Bar () Ġ{ ĊĠĠĠ ĠThe med Preview Ġ{ ĊĠĠĠĠĠĠĠ ĠBottom Bar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpet Pal Ġ= Ġpal 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Unimplemented Action Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon A dopt Action Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis A dopt Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle A dopt Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" Popup Ġdialog ") Ċ @ Composable Ċ fun ĠPreview Popup () Ġ{ ĊĠĠĠ ĠThe med Preview Ġ{ ĊĠĠĠĠĠĠĠ ĠFunction ality Not Available Popup (" Function ality Ġnot Ġavailable Ġ\ uD 8 3 D \ u DE 4 8 ", Ġtrue , Ġ{ Ġ}, Ġ{ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ