package Ġaws . location . demo . track ings ample Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġcom . amazonaws . mobile . client . AWS Mobile Client Ċ import Ġcom . amazonaws . mobile . client . Callback Ċ import Ġcom . amazonaws . mobile . client . User State Details Ċ import Ġcom . amazonaws . mobile connectors . geo . tracker .* Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠActivity Compat . On Request Permissions Result Callback Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Tracking Sample " ĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ PERMISSION _ CODE Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġlogging Tracking Listener Ġ= ĠLogging Tracking Listener () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtracking Options : ĠTracking Options ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtracker : ĠAWS Location Tracker ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWire Ġup ĠUI Ġevents ĊĠĠĠĠĠĠĠ Ġlayout Ġ= ĠfindViewById ( R . id . main _ layout ) ĊĠĠĠĠĠĠĠ Ġval Ġbtn Start Ġ= ĠfindViewById < Button >( R . id . btn Start ) ĊĠĠĠĠĠĠĠ Ġval Ġbtn Stop Ġ= ĠfindViewById < Button >( R . id . btn Stop ) ĊĠĠĠĠĠĠĠ Ġbtn Start . setOnClickListener ( this :: onStart Stop Clicked ) ĊĠĠĠĠĠĠĠ Ġbtn Stop . setOnClickListener ( this :: onStart Stop Clicked ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠAWS ĠMobile ĠSDK ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes ĠAWS ĠMobile ĠClient Ġand Ġsets Ġup Ġan Ġinstance Ġof ĊĠĠĠĠ Ġ* Ġthe ĠAWS Location Tracker Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġtracking Options Ġ= ĠTracking Options . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retrieve Location Frequency ( TimeUnit . SECONDS . to Millis ( 3 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. emit Location Frequency ( TimeUnit . MIN UTES . to Millis ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom DeviceId ( getString ( R . string . tracker _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCredential Ġinitialization ĊĠĠĠĠĠĠĠ ĠAWS Mobile Client . getInstance (). initialize ( application Context , Ġobject Ġ: ĠCallback < User State Details ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( user State Details : ĠUser State Details ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġinstance Ġof Ġthe ĠAWS Location Tracker Ġusing Ġthe ĠAWS Mobile Client Ġas Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcredential Ġprovider . ĠBe Ġsure Ġto Ġcreate Ġyour Ġtracker Ġvia Ġthe ĠAmazon ĠLocation ĠService ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconsole Ġand Ġupdate Ġthe Ġtracker _ name Ġresource Ġvalue Ġin Ġapp / src / main / res / values / strings . xml ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker Ġ= ĠAWS Location Tracker ( getString ( R . string . tracker _ name ), ĠAWS Mobile Client . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Tracker Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBe Ġsure Ġto Ġfollow Ġthe Ġinstructions Ġin Ġthe ĠREADME . md Ġfile Ġfor Ġthis Ġsample Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġconfigure Ġauthentication . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġinitializing Ġthe ĠAWS Ġmobile Ġclient .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonStart Stop Clicked ( button Clicked : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( button Clicked . id . equals ( R . id . btn Start )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġstart Ġbutton Ġis Ġclicked , Ġcall Ġthe Ġfunction Ġthat Ġwill Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpermissions Ġand Ġstart Ġthe Ġtracker . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Permission () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġtracking Ġdevice Ġlocation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . stop Tracking ( application Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġfunction Ġthat Ġis Ġinvoked Ġas Ġa Ġresult Ġof Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġgrant ing Ġor Ġden ying Ġthe Ġnecessary Ġpermissions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠLOC ATION _ PERMISSION _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . size Ġ== Ġ 1 Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . start Tracking ( application Context , Ġtracking Options , Ġlogging Tracking Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( layout , Ġ" Location Ġpermission Ġdenied ", ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġthe Ġnecessary Ġpermissions Ġ( if Ġnot Ġalready Ġgranted ) Ġto Ġconsume ĊĠĠĠĠ Ġ* Ġdevice Ġlocation Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPermission Ġhas Ġnot Ġbeen Ġgranted Ġand Ġmust Ġbe Ġrequested . ĊĠĠĠĠĠĠĠ Ġif Ġ( application Context ?. check Self Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Permissions Ġnot Ġavailable .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( Manifest . permission . ACCESS _ F INE _ LOCATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProvide Ġan Ġadditional Ġr ationale Ġto Ġthe Ġuser Ġif Ġthe Ġpermission Ġwas Ġnot Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġuser Ġwould Ġbenefit Ġfrom Ġadditional Ġcontext Ġfor Ġthe Ġuse Ġof Ġthe Ġpermission . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġa ĠSn ackBar Ġwith Ġa Ġbutton Ġto Ġrequest Ġthe Ġmissing Ġpermission . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( layout , ĠR . string . request _ location _ permission , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( R . string . request _ location _ permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĠLOC ATION _ PERMISSION _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġthe Ġpermission . ĠThe Ġresult Ġwill Ġbe Ġreceived Ġin Ġon Request Permissions Result (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĠLOC ATION _ PERMISSION _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Starting Ġlocation Ġtracker .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . start Tracking ( application Context , Ġtracking Options , Ġlogging Tracking Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( layout , ĠStringBuilder ( ex . message ), ĠSn ackbar . LENGTH _ LONG ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Ġimplementation Ġof Ġthe ĠTracking Listener Ġinterface Ġthat ĊĠĠĠĠ Ġ* Ġjust Ġlogs Ġthe Ġevents Ġreceived . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠLogging Tracking Listener Ġ: ĠTracking Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= Ġ" Logging Location Listener " ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Stop ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Published ( event : ĠTracking Published Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Data Published ĠRequest Ġ= Ġ${ event ?. request }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Data Published ĠResponse Ġ= Ġ${ event ?. result }") ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Publication Error ( error : ĠTracking Error ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Data Publication Error Ġ${ error ?. message }", Ġerror Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }