/** Ċ Ġ* Ġ ĠCopyright ĠÂ© Ġ 2 0 1 9 ĠC lar if ai Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġcom . cl ar if ai . cl arity Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . hardware . camera 2 . Camera Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Log Ċ import Ġcom . cl ar if ai . cl ar if ai _ android _ sdk . core . Cl ar if ai Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . content . Intent Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . view .* Ċ import Ġjava . io . File Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . util .* Ċ import Ġjava . io . IOException Ċ import Ġandroid . widget . Toast ; Ċ import Ġandroid . os . Environment Ċ import Ġorg . json .* Ċ Ċ import Ġandroid . location .* Ċ import Ġjava . time . Instant Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ import Ġandroid . location .* Ċ import Ġandroid . widget . TextView Ċ import Ġkotlinx . android . synt hetic . main . activity _ home .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠHome . kt Ċ Ġ* ĠC lar ity Ċ Ġ* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 8 ĠC lar if ai . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ class ĠHome Ġ: ĠAppCompatActivity (), ĠPeriod ic Prediction . Prediction Triggers , ĠCamera Control . Camera Control Triggers Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Camera Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! have Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . CAMERA , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . ACCESS _ F INE _ LOCATION ), ĠCAM ERA _ REQUEST _ CODE _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġcheck Camera Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhave Permissions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtexture View : ĠTexture View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Control : ĠOutput Control ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialog : ĠAlertDialog ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠtextView : ĠTextView ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Control : ĠCamera Control ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġperiodic Prediction : ĠPeriod ic Prediction ĊĊĠĠĠ Ġprivate Ġval ĠPER MISSION _ CODE Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġval ĠIMAGE _ CAPTURE _ CODE Ġ= Ġ 1 0 0 1 ĊĠĠĠ Ġvar Ġimage _ uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlocation Manager Ġ: ĠLocation Manager ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Window () ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ home ) ĊĠĠĠĠĠĠĠ Ġfind Views () ĊĠĠĠĠĠĠĠ Ġloading Screen ( show Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( findViewById ( R . id . my _ toolbar )) ĊĠĠĠĠĠĠĠ Ġprefs Ġ= Ġthis . get SharedPreferences (" Interval Prefs ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġsaved Interval Ġ= Ġget Interval ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġsaved String Ġ= Ġget Int String ( this ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Saved ĠInterval : Ġ" Ġ+ Ġsaved String , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= Ġthis . get SharedPreferences ( getString ( R . string . shared _ preferences _ key ), ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġmissing Key Ġ= ĠgetString ( R . string . missing _ api _ key ) ĊĠĠĠĠĠĠĠ Ġval ĠapiKey Ġ= Ġshared Preferences . getString ( getString ( R . string . shared _ preferences _ api _ key ), Ġmissing Key ) ĊĊĠĠĠĠĠĠĠ Ġoutput Control Ġ= ĠOutput Control ( this . application Context , Ġre cyclerView ) ĊĊĠĠĠĠĠĠĠ ĠC lar if ai . start ( this , ĠapiKey ) ĊĊĠĠĠĠĠĠĠ ĠPeriod ic Prediction . REFRESH _ RATE _ MS Ġ= Ġsaved Interval ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! have Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" No Ġpermission . ĠSo , Ġasking Ġfor Ġit ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . CAMERA , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . ACCESS _ F INE _ LOCATION ), ĠCAM ERA _ REQUEST _ CODE _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocation Manager Ġ= Ġget System Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ? ĊĊĠĠĠĠĠĠĠ ĠonCreate After Permissions () ĊĠĠĠĠĠĠĠ Ġperiodic Prediction Ġ= ĠPeriod ic Prediction ( this ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocation Ġ= Ġlocation Manager ?. getLast Known Location ( Location Manager . GPS _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" LOCATION ", Ġlocation . toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Error ", Ġ" ERROR !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu , menu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ) Ġ= Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠ ĠR . id . gallery Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠGraph _ view :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Gallery ĠClick ed ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠR . id . interval Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Interval ĠClick ed ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠOptions Action :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġgot Ġhere , Ġthe Ġuser 's Ġaction Ġwas Ġnot Ġrecognized . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInvoke Ġthe Ġsuperclass Ġto Ġhandle Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ(! have Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . CAMERA , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . ACCESS _ F INE _ LOCATION ), ĠCAM ERA _ REQUEST _ CODE _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Resume After Permissions () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġperiodic Prediction . on Pause () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġcamera Control . on Stop () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsetup Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . add Flags ( WindowManager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ) ĊĠĠĠĠĠĠĠ Ġwindow . set Flags ( WindowManager . LayoutParams . FLAG _ LAYOUT _ NO _ LIMIT S , ĠWindow Manager . LayoutParams . FLAG _ LAYOUT _ NO _ LIMIT S ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġfind Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġtexture View Ġ= ĠfindViewById ( R . id . texture ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠfindViewById ( R . id . concepts _ list _ rv ) ĊĊĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġbuilder . setView ( R . layout . progress ) ĊĠĠĠĠĠĠĠ Ġdialog Ġ= Ġbuilder . create () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġloading Screen ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Changing Ġthe Ġstate Ġof Ġloading Ġscreen Ġto Ġ$ show ") ĊĠĠĠĠĠĠĠ Ġif Ġ( show ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun ĠonCreate After Permissions () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Have Ġpermission Ġfrom Ġrequesting Ġwith ĠonCreate ") ĊĠĠĠĠĠĠĠ Ġcamera Control Ġ= ĠCamera Control ( texture View , Ġget System Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager , Ġthis ) ĊĠĠĠĠĠĠĠ Ġperiodic Prediction Ġ= ĠPeriod ic Prediction ( this ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġon Resume After Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( periodic Prediction . is Model Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Control . on Resume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiodic Prediction . on Resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġhave Permissions (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠActivity Compat . check Self Permission ( this , ĠManifest . permission . CAMERA ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCAM ERA _ REQUEST _ CODE _ INIT Ġ-> ĠonCreate After Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCAM ERA _ REQUEST _ CODE _ RE SU ME Ġ-> Ġon Resume After Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( se : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Permission Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Received Pred i ctions ( outputs : ĠList < Array < String >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outputs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap ToFile ( camera Control . bitmap , Ġoutputs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Control . update ( outputs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmodel Loaded () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Loaded Ġthe Ġmodel ") ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Screen ( show Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Resume After Permissions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġcapture Bitmap (): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Control . is Camera Setup ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcamera Control . bitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġbitmap ToFile ( bitmap : Bitmap , Ġoutputs : ĠList < Array < String >> ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Check Ġif Ġfile Ġexists ĊĠĠĠĠĠĠĠ Ġvar Ġdir Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ PI CTURE S +"/ Search Light ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! dir . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Directory Ġdid Ġnot Ġexist Ġcreating :"+ dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġa Ġnew Ġfile Ġinstance Ġto Ġsave Ġbitmap Ġobject ĊĠĠĠĠĠĠĠ Ġvar Ġfile Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ PI CTURE S +"/ Search Light ") ĊĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( file ," ${ DateTime Formatter . ISO _ INST ANT . with Zone ( Zone Offset . UTC ). format ( Instant . now ()) }. jpg ") ĊĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompress Ġthe Ġbitmap Ġand Ġsave Ġin Ġj pg Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream : OutputStream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , 1 0 0 , stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Data ( outputs , Ġfile . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : IOException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġsaved Ġbitmap Ġuri ĊĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġfile . absolute Path ) ĊĠĠĠĠĠĠĠ Ġreturn ĠUri . parse ( file . absolute Path ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun ĠSave Data ( outputs : ĠList < Array < String >>, Ġfilepath : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdir Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ PI CTURE S +"/ Search Light ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! dir . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Directory Ġdid Ġnot Ġexist Ġcreating :"+ dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġfile Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ PI CTURE S +"/ Search Light ") ĊĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( file ," Prediction Data . json ") ĊĊĠĠĠĠĠĠĠ Ġ// Get Location ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠGet Location () ĊĊĠĠĠĠĠĠĠ Ġ// make Ġjson Ġprototype ĊĠĠĠĠĠĠĠ Ġvar Ġobj Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġobj . put (" Filename ", filepath ) ĊĠĠĠĠĠĠĠ Ġobj . put (" TimeStamp ", ĠDateTime Formatter . ISO _ INST ANT . with Zone ( Zone Offset . UTC ). format ( Instant . now ())) ĊĠĠĠĠĠĠĠ Ġobj . put (" Latitude ", location [ 0 ]) ĊĠĠĠĠĠĠĠ Ġobj . put (" Longitude ", location [ 1 ]) ĊĊĠĠĠĠĠĠĠ Ġfor ( value Ġin Ġoutputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġvalue . join ToString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . put ( value [ 0 ], Ġvalue [ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . append Text ( obj . toString ()+ "; ") ĊĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : IOException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Done " ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget Interval ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs Ġ= Ġcontext . get SharedPreferences (" Interval Prefs ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprefs . getInt (" Picture ĠInter vals ", Ġ 5 0 0 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget Int String ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs Ġ= Ġcontext . get SharedPreferences (" Interval Prefs ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprefs . getString (" Interval ĠStrings ", Ġ" 5 Ġseconds ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun ĠGet Location (): ĠList < String >{ ĊĠĠĠĠĠĠĠ Ġvar Ġcoord Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlocation Manager ?. getLast Known Location ( Location Manager . GPS _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d (" LOCATION ", location ?. latitude . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlat Ġ= Ġlocation ?. latitude . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d (" LOCATION ", location ?. longitude . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlog Ġ= Ġlocation ?. longitude . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . add ( 0 , Ġlat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . add ( 1 , Ġlog ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch ( e : Security Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" LOCATION "," ERROR !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . add ( 0 , Ġ" 0 . 0 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . add ( 1 , Ġ" 0 . 0 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Update ĠScreen ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" Latitude :"+ coord [ 0 ] +"\ n Longitude :"+ coord [ 1 ] ĊĠĠĠĠĠĠĠ ĠLocation View . text Ġ= Ġtext ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcoord ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠHome :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAM ERA _ REQUEST _ CODE _ INIT Ġ= Ġ 1 0 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAM ERA _ REQUEST _ CODE _ RE SU ME Ġ= Ġ 1 0 2 ĊĠĠĠ Ġ} Ċ } Ċ