package Ġcom . ud acity . project 4 . location rem inders . sa ver em inder ĊĊ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException Ċ import Ġcom . google . android . gms . location .* Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . ud acity . project 4 . R Ċ import Ġcom . ud acity . project 4 . REQ _ PERMISSION _ FO REG ROUND _ BACKGROUND _ LOCATION Ċ import Ġcom . ud acity . project 4 . REQ _ PERMISSION _ FO REG ROUND _ LOCATION Ċ import Ġcom . ud acity . project 4 . REQ _ T URN _ DEVICE _ LOCATION _ ON Ċ import Ġcom . ud acity . project 4 . base . Base Permission Fragment Ċ import Ġcom . ud acity . project 4 . base . Navigation Command Ċ import Ġcom . ud acity . project 4 . databinding . Fragment Save Reminder Binding Ċ import Ġcom . ud acity . project 4 . location rem inders . ge ofence . add Ge ofence For Reminder Ċ import Ġcom . ud acity . project 4 . location rem inders . rem inders list . Reminder Data Item Ċ import Ġcom . ud acity . project 4 . utils .* Ċ import Ġorg . k oin . android . ext . android . inject Ċ Ċ private Ġconst Ġval ĠTAG : ĠString Ġ= Ġ" cy . frag . save _ reminder " Ċ class ĠSave Reminder Fragment Ġ: ĠBase Permission Fragment () Ġ{ ĊĠĠĠ Ġ// Get Ġthe Ġview Ġmodel Ġthis Ġtime Ġas Ġa Ġsingle Ġto Ġbe Ġshared Ġwith Ġthe Ġanother Ġfragment ĊĠĠĠ Ġoverride Ġval Ġ_ viewModel : ĠSave Reminder ViewModel Ġby Ġinject () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Save Reminder Binding ĊĠĠĠ Ġprivate Ġval Ġge of encing Client Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠLocation Services . get Ge of encing Client ( require Context ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ save _ reminder , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= Ġ_ viewModel ĊĊĠĠĠĠĠĠĠ Ġset Display Home As Up Enabled ( true ) ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . select Location . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ ĠNavigate Ġto Ġanother Ġfragment Ġto Ġget Ġthe Ġuser Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ viewModel . navigation Command . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Command . To ( Save Reminder Fragment Directions . action Save Reminder Fragment To Select Location Fragment ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . save Reminder . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ_ viewModel . reminder Title . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġ_ viewModel . reminder Description . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġ_ viewModel . reminder Selected Location Str . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatitude Ġ= Ġ_ viewModel . latitude . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlongitude Ġ= Ġ_ viewModel . longitude . value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreminder Ġ= ĠRem inder Data Item ( title , Ġdescription , Ġlocation , Ġlatitude , Ġlongitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġearly Ġending Ġif Ġuser Ġinputs Ġis Ġnot Ġpassing Ġvalidation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!_ viewModel . validate Entered Data ( reminder )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" some Ġuser Ġinput Ġdid Ġnot Ġpass Ġvalidate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġthe Ġuser Ġentered Ġreminder Ġdetails Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ 1 ) Ġadd Ġa Ġge of encing Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ 2 ) Ġsave Ġthe Ġreminder Ġto Ġthe Ġlocal Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Add Ge ofence For Reminder ( reminder ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Exception Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Add Ge ofence For Reminder ( reminder : ĠRem inder Data Item ){ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" do Add Ge ofence For Reminder ") ĊĠĠĠĠĠĠĠ Ġ/* Ġsave Ġreminder Ġflow Ġshould Ġbe .. ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . Ġcheck Ġlocation Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 . Ġcheck Ġdevice Ġlocation Ġis Ġturned Ġon ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 . Ġattempt Ġto Ġadd Ġge ofence ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 . Ġsave Ġreminder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġpermission ĊĠĠĠĠĠĠĠ Ġif Ġ( has Foreground Background Location Permission ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġlocation Ġon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Add Ge ofence ( reminder ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . save Reminder . tag Ġ= Ġreminder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Foreground Background Location Permissions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġ// make Ġsure Ġto Ġclear Ġthe Ġview Ġmodel Ġafter Ġdestroy , Ġas Ġit 's Ġa Ġsingle Ġview Ġmodel . ĊĠĠĠĠĠĠĠ Ġ_ viewModel . on Clear () ĊĠĠĠĠĠĠĠ Ġbinding . save Reminder . tag Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Activity Result Ġ$ request Code , Ġ$ result Code , Ġ$ data ") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ T URN _ DEVICE _ LOCATION _ ON Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Received Ġdevice 's Ġlocation Ġsetting Ġresult !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . save Reminder . tag ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠRem inder Data Item ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Add Ge ofence For Reminder ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġlocation Ġpermission Ġrelated ĊĠĠĠ Ġoverride Ġfun Ġon Permissions Granted ( request Code : ĠInt , Ġperms : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Permissions Granted Ġ$ request Code ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ PERMISSION _ FO REG ROUND _ LOCATION , ĠREQ _ PERMISSION _ FO REG ROUND _ BACKGROUND _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" foreground / background Ġlocation Ġpermissions Ġgranted !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . save Reminder . tag ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠRem inder Data Item ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Add Ge ofence ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Permissions Denied ( request Code : ĠInt , Ġperms : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Permissions Denied Ġ$ request Code ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQ _ PERMISSION _ FO REG ROUND _ LOCATION , ĠREQ _ PERMISSION _ FO REG ROUND _ BACKGROUND _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permissions R ationale ( perms )){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). show Permission Denied Dialog ( getString ( R . string . permission _ den ied _ explanation )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( require View (), ĠR . string . permission _ den ied _ explanation , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). to Setting Page () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ ĠUses Ġthe ĠLocation ĠClient Ġto Ġcheck Ġthe Ġcurrent Ġstate Ġof Ġsystem 's Ġlocation Ġsettings , Ġand Ġgives Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġ Ġthe Ġopportunity Ġto Ġturn Ġon Ġlocation Ġservices Ġwithin Ġour Ġapp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠContext . check Device Location (): ĠTask < Location Settings Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġprepare Ġfor Ġsetting Ġrequest ĊĠĠĠĠĠĠĠ Ġval Ġsettings Client Ġ= ĠLocation Services . get Settings Client ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġlocation Request Ġ= ĠLocation Request . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ LOW _ POWER ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsettings Request Ġ= ĠLocation Settings Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Location Request ( location Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn Ġsettings Client . check Location Settings ( settings Request ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġcheck Device Location Settings And Add Ge ofence ( reminder : Reminder Data Item ?, Ġresolve : Boolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" check Device Location Settings And Add Ge ofence ") ĊĠĠĠĠĠĠĠ Ġval Ġlocation Settings Response Task Ġ= Ġrequire Context (). check Device Location (). apply { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Failure Listener Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠRes olvable ApiException Ġ&& Ġresolve ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġsettings Ġare Ġnot Ġsatisfied , Ġbut Ġthis Ġcan Ġbe Ġfixed Ġby Ġshowing Ġthe Ġuser Ġa Ġdialog . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġdialog Ġby Ġcalling Ġstart Resolution For Result (), Ġand Ġcheck Ġthe Ġresult Ġin Ġon Activity Result (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor ĠActivity Ġ--> Ġexception . start Resolution For Result ( require Activity (), ĠREQ _ T URN _ DEVICE _ LOCATION _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Intent Sender For Result ( exception . resolution . intent Sender , ĠREQ _ T URN _ DEVICE _ LOCATION _ ON , Ġnull , Ġ 0 , Ġ 0 , Ġ 0 , Ġnull ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( send Ex : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Error Ġgetting Ġlocation Ġsettings Ġresolution : Ġ" Ġ+ Ġsend Ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ viewModel . show Sn ackBar . value Ġ= ĠgetString ( R . string . location _ required _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġaction Ġto Ġcheck Ġlocation Ġsetting Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġit . is Successful Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" device 's Ġlocation Ġis Ġon ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreminder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of encing Client . add Ge ofence For Reminder ( reminder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ viewModel . save Reminder ( reminder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ