package Ġnl . rv b soft dev . cur ios ity reporting . feature . favorite Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . core . view . Menu Compat Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . request . target . Custom Target Ċ import Ġcom . bump tech . glide . request . transition . Transition Ċ import Ġcom . st f alcon . image viewer . St f alcon Image Viewer Ċ import Ġnl . rv b soft dev . cur ios ity reporting . R Ċ import Ġnl . rv b soft dev . cur ios ity reporting . data . Photo Ċ import Ġnl . rv b soft dev . cur ios ity reporting . databinding . Fragment F avorites Binding Ċ import Ġnl . rv b soft dev . cur ios ity reporting . feature . explore . Photo Sw iper Ċ import Ġnl . rv b soft dev . cur ios ity reporting . global . Base Fragment Ċ import Ġnl . rv b soft dev . cur ios ity reporting . global . Navigation Activity Ċ import Ġnl . rv b soft dev . cur ios ity reporting . global . Shared ViewModel Ċ import Ġtim ber . log . Tim ber Ċ Ċ /** ĠF avorites ĠFragment Ġthat Ġprovides Ġa Ġunique ĠList Ġof ĠPh otos Ġsorted Ġby Ġmost Ġrecent Ġearth Ġdate Ġcontained Ġin Ġthe Ġlocal Ġroom Ġdatabase Ġ**/ Ċ Ċ class ĠF avorites Fragment Ġ: ĠBase Fragment < Fragment F avorites Binding >( false ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlayout Ġ= ĠR . layout . fragment _ favorites ĊĠĠĠ Ġprivate Ġval ĠREQUEST _ CODE : ĠInt Ġ= Ġ 1 ĊĠĠĠ Ġoverride Ġval Ġfirebase Tag Ġ= Ġ" Favorite ĠFragment " ĊĠĠĠ Ġprivate Ġval Ġnavigation Activity Ġby Ġlazy Ġ{ Ġactivity Ġas ĠNavigation Activity Ġ} ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠF avorites ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġshared ViewModel : ĠShared ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbuilder : ĠSt f alcon Image Viewer < Photo > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġphoto Sw iper : ĠPhoto Sw iper ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . favorites ViewModel Ġ= ĠviewModel ĊĊĠĠĠĠĠĠĠ Ġval Ġfavorite Photo Adapter Ġ= ĠF avorite Photo Adapter ( view Lifecycle Owner , ĠviewModel ) Ġ{ Ġphoto , Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . selected Favorite Photo . value Ġ= Ġphoto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Sw iper Ġ= ĠPhoto Sw iper ( require Context ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Click Listeners And Vm ( viewModel , Ġ{ Ġbuilder . close () Ġ}, Ġ{ Ġshare Photo () Ġ}, Ġclick Delete Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . remove Photo From F avorites ( photo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . deleted Favorite Photo . value Ġ= Ġphoto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . post Delayed ({ Ġbuilder . close () Ġ}, Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . favorite Photos . value ?. let Ġ{ Ġsetup Swipe Image Viewer ( it , Ġposition ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . favorite Photos . observe ( view Lifecycle Owner ) Ġ{ ĠlistOf Photos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . recyclerview Photo F avorites . adapter Ġ= Ġfavorite Photo Adapter . apply Ġ{ Ġsubmit List ( listOf Photos ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Options Menu (! listOf Photos . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listOf Photos . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . deleted All F avorites . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠL ets Ġthe Ġuser Ġselect Ġa Ġlist Ġor Ġgrid Ġas Ġpreference Ġ**/ ĊĠĠĠĠĠĠĠ Ġvar Ġlist Or Grid Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( Preference Manager . getDefault SharedPreferences ( require Context ()). getString (" favorites _ photo _ layout ", Ġ" List ") Ġ== Ġ" Grid ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Or Grid Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . recyclerview Photo F avorites . layout Manager Ġ= ĠGrid LayoutManager ( require Context (), Ġlist Or Grid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . fragment _ favorites _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ ĠMenu Compat . set Group Divider Enabled ( menu , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . delete _ all Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( it ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( android . R . layout . select _ dialog _ item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" Delete Ġall Ġphotos Ġfrom Ġfavor ites ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button (" OK ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . removeAll Photo From F avorites () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared ViewModel . deleted All F avorites . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠNavigation Activity ). show Styled Snackbar Message ( require View (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Favorite Ġphoto ( s ) Ġdeleted !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ms Ġ= Ġ 3 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= ĠR . drawable . icon _ delete _ all ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Negative Button (" Cancel ") Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Swipe Image Viewer ( list : ĠList < Photo >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Ġ= ĠSt f alcon Image Viewer . Builder ( require Context (), Ġlist ) Ġ{ Ġview , Ġimg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( require Context ()). load ( img . img _ src ). into ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Image ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . selected Favorite Photo . value Ġ= ĠviewModel . favorite Photos . value ?. get ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Sw iper . set Info Text ( getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . explore _ detail _ photo _ taken _ on , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . selected Favorite Photo . value ?. camera ?. full _ name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . format String Date ( viewModel . selected Favorite Photo . value ?. earth _ date Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . selected Favorite Photo . value ?. sol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Start Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Overlay View ( photo Sw iper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUses ĠG lide Ġto Ġconvert Ġthe Ġselected Ġphoto Ġto Ġa Ġbitmap Ġand Ġshare . ĊĠĠĠĠ Ġ* ĠInv okes Ġrequest Permission Ġfunction Ġto Ġrequest Ġruntime Ġpermission Ġfor Ġstorage Ġaccess Ġ**/ ĊĊĠĠĠ Ġprivate Ġfun Ġshare Photo () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . selected Favorite Photo . value ?. img _ src . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Bitmap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( viewModel . selected Favorite Photo . value ?. img _ src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( object Ġ: ĠCustom Target < Bitmap >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resource Ready ( resource : ĠBitmap , Ġtransition : ĠTransition < in ĠBitmap > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Path Ġ= ĠMedia Store . Images . Media . insert Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). content Resolver , Ġresource , Ġ" C uri osity ĠM ars ĠImage Ġ" Ġ+ ĠviewModel . selected Favorite Photo . value ?. earth _ date , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent ( Intent . ACTION _ SEND ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Check Ġout Ġthis Ġamazing Ġphoto ĠN ASA 's ĠM ars ĠR over ĠC uri osity Ġcaptured Ġon Ġ${ viewModel . selected Favorite Photo . value ?. earth _ date } !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( share Intent . resolve Activity ( require Activity (). package Manager ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( share Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Activity . show Styled Toast Message (" No Ġapp Ġinstalled Ġto Ġshare Ġthis Ġphoto !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad Cle ared ( placeholder : ĠDrawable ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CODE Ġ-> Ġif Ġ(( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Photo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnavigation Activity . show Styled Toast Message ( getString ( R . string . disk _ access _ required )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ