package Ġcom . example . location test di . view model Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . example . location test di . Location App Ċ import Ġcom . example . location test di . model . Location Entity Ċ import Ġcom . example . location test di . model . Location Room DB Ċ import Ġcom . example . location test di . model . Locator Manager Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ /* Ċ Ġ* ĠData Ġcontainer Ġfor Ġlat Ġand Ġlng Ċ Ġ* ĠFuture Ġ-> ĠF avorite ĠPl aces Ċ Ġ*/ Ċ class ĠLocation ViewModel ( val Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocator Manager : ĠLoc ator Manager Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Room DB 2 : ĠLocation Room DB Ġ// ĠUsing Ġfield Ġinjection Ġinstead Ġof Ġconstructor Ġinjection Ċ ): ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġlocation Room DB : ĠLocation Room DB Ġ// ĠThis Ġis Ġcalled Ġa Ġfield Ġinjection ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLocation App . component . inject ViewModel ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠdataSet Ġ= ĠMutable LiveData < AppState >() ĊĊĠĠĠ Ġsealed Ġclass ĠApp State Ġ{ Ġ// ĠHold s Ġthe Ġcurrent Ġapplication Ġstate ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠLocation Response ( val Ġcurrent Location : ĠList < LatLng >): ĠApp State () Ġ// ĠCurrent ĠLocation ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠS ear ched Response ( val Ġfavorite Places : ĠList < Pair < LatLng , ĠString >> ): ĠApp State () Ġ// ĠSome ĠS ear ched ĠLoc ations ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠInfo Message ( val Ġinfo Message : ĠString ): ĠApp State () Ġ// ĠConfirm ation Ġfor ĠRoom Ġinsertion ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError Message ( val ĠerrorMessage : ĠString ): ĠApp State () Ġ// ĠInvalid ĠCoordinates ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget DataSet (): ĠLive Data < AppState > Ġ{ Ġ// ĠdataSet Ġcontains Ġone ĠApp State ĊĠĠĠĠĠĠĠ Ġreturn ĠdataSet ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Permission ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( Ġ// ĠRequest Ġuser Ġfor Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ PERMISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Info Message (" Location Ġpermission Ġis Ġturned Ġoff ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// ĠEx its Ġfunction Ġif ĠACCESS _ F INE _ LOCATION Ġis Ġnot Ġpermitted ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget Location From Model () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpermission Granted () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Location From Model () ĊĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Info Message (" Location Ġpermission Ġis Ġturned Ġon ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Location From Model () Ġ{ Ġ// ĠCallback Ġfrom ĠLoc ator Manager Ġ( Model ) ĊĠĠĠĠĠĠĠ Ġlocator Manager . getLast Location Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Location Response ( listOf ( location )) Ġ// Ġ. value Ġtriggers Ġan ĠonChange Ġin ĠActivity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisValid Double ( latitude : ĠString , Ġlongitude : ĠString , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat : ĠDouble ? Ġ= Ġlatitude . toDouble OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġlng : ĠDouble ? Ġ= Ġlongitude . toDouble OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( lat Ġ== Ġnull Ġ|| Ġlng Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . ErrorMessage (" Enter Ġa Ġvalid Ġnumber Ġfor Ġlatitude Ġand / or Ġlongitude Ġplease ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( lat Not Valid ( lat )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . ErrorMessage (" The Ġvalue Ġyou Ġentered Ġfor Ġlatitude Ġis Ġout Ġof Ġbounds !") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( lng Not Valid ( lng )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . ErrorMessage (" The Ġvalue Ġyou Ġentered Ġfor Ġlongitude Ġis Ġout Ġof Ġbounds !") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Location From UI ( lat , Ġlng , Ġname ) Ġ// ĠSmart Ġcast Ġbecause Ġof Ġif Ġstatement ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlat Not Valid ( num : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( num Ġ< Ġ- 9 0 Ġ|| Ġnum Ġ> Ġ 9 0 ) Ġreturn Ġtrue Ġ// ĠNot Ġvalid ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// ĠValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlng Not Valid ( num : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( num Ġ< Ġ- 1 8 0 Ġ|| Ġnum Ġ> Ġ 1 8 0 ) Ġreturn Ġtrue Ġ// ĠNot Ġvalid ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// ĠValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠCreate Ġa ĠLat Lng Ġfrom ĠMaps ĠEditText ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Location From UI ( lat : ĠDouble , Ġlng : ĠDouble , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpair : ĠPair < LatLng , ĠString > Ġ= ĠPair ( LatLng ( lat , Ġlng ), Ġname ) ĊĠĠĠĠĠĠĠ Ġ// ĠOption Ġ 1 ĊĠĠĠĠĠĠĠ Ġwith Ġ( pair ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Se ar ched Response ( listOf ( this )) Ġ// Ġ. value Ġtriggers Ġan ĠonChange Ġin ĠActivity ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ// ĠOption Ġ 2 Ċ // ĠĠĠĠĠĠĠ Ġpair . apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Se ar ched Response ( listOf ( this )) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave Favorite Places ( pair ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠStore ĠPair < LatLng , ĠString > Ġin ĠLocation Room DB Ġas Ġ[ Custom ] Entity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Favorite Places ( pair : ĠPair < LatLng , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfavorite Place Ġ= ĠLocation Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Room DB . get Dao (). new Favorite Place ( favorite Place ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠQuery Ġ[ Custom ] Room DB Ġto Ġget Ġall Ġ[ Custom ] Entity 's Ġand Ġtransform Ġto ĠPair < LatLng , ĠString > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetAll F avorites Places () Ġ{ Ġ// ĠThis Ġmethod Ġgoes Ġunused ... ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf Data Ġ= Ġmutable ListOf < Location Entity >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf Data . addAll ( location Room DB . get Dao (). get Favorite Places ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . value Ġ= ĠApp State . Se ar ched Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf Data . map Ġ{ ĠPair ( LatLng ( it . lat , Ġit . lng ), Ġit . place ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOC ATION _ PERMISSION _ REQUEST _ CODE Ġ= Ġ 9 2 7 4 Ġ// ĠRandom ĠInteger ĊĠĠĠ Ġ} Ċ }