package Ġru . spb . da ir . road movie Ċ Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Button Ċ import Ġandroid . content . Context . ACTIVITY _ SERVICE Ċ import Ġandroid . app . Activity Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroid . content . Component Name Ċ import Ġru . spb . da ir . road movie . My Service . Local Binder Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . pm . PackageManager . PERMISSION _ GRAN TED Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . view . View . IN VISIBLE Ċ import Ġandroid . view . View . VISIBLE Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule At Fixed Rate ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠActivity Compat . On Request Permissions Result Callback Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġ_ main Button : ĠButton ĊĠĠĠ Ġlateinit Ġvar Ġ_ unload Label : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġ_ speed Label : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġ_ time Passed : ĠTextView ĊĊĠĠĠ Ġprivate Ġvar Ġm Bound Service : ĠMy Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Should Un bind : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimer : ĠTimer ĊĊĠĠĠ Ġprivate Ġval Ġm Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( className : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġcalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġservice Ġhas Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġestablished , Ġgiving Ġus Ġthe Ġservice Ġobject Ġwe Ġcan Ġuse Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinteract Ġwith Ġthe Ġservice . Ġ ĠBecause Ġwe Ġhave Ġbound Ġto Ġa Ġexplicit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġservice Ġthat Ġwe Ġknow Ġis Ġrunning Ġin Ġour Ġown Ġprocess , Ġwe Ġcan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcast Ġits ĠI Binder Ġto Ġa Ġconcrete Ġclass Ġand Ġdirectly Ġaccess Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bound Service Ġ= Ġ( service Ġas ĠMy Service . Local Binder ). service ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( className : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġcalled Ġwhen Ġthe Ġconnection Ġwith Ġthe Ġservice Ġhas Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunexpected ly Ġdisconnected Ġ-- Ġthat Ġis , Ġits Ġprocess Ġcr ashed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġit Ġis Ġrunning Ġin Ġour Ġsame Ġprocess , Ġwe Ġshould Ġnever ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġthis Ġhappen . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bound Service Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Bind Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAt tempts Ġto Ġestablish Ġa Ġconnection Ġwith Ġthe Ġservice . Ġ ĠWe Ġuse Ġan ĊĠĠĠĠĠĠĠ Ġ// Ġexplicit Ġclass Ġname Ġbecause Ġwe Ġwant Ġa Ġspecific Ġservice ĊĠĠĠĠĠĠĠ Ġ// Ġimplementation Ġthat Ġwe Ġknow Ġwill Ġbe Ġrunning Ġin Ġour Ġown Ġprocess ĊĠĠĠĠĠĠĠ Ġ// Ġ( and Ġthus Ġwon 't Ġbe Ġsupporting Ġcomponent Ġreplacement Ġby Ġother ĊĠĠĠĠĠĠĠ Ġ// Ġapplications ). ĊĠĠĠĠĠĠĠ Ġif Ġ( bind Service ( Intent ( this @ MainActivity , ĠMy Service :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection , ĠContext . BIND _ AUTO _ CREATE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Should Un bind Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Un bind Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Should Un bind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRelease Ġinformation Ġabout Ġthe Ġservice 's Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bind Service ( m Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Should Un bind Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ_ main Button Ġ= Ġthis . findViewById < Button >( R . id . main _ button ) ĊĠĠĠĠĠĠĠ Ġ_ main Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Button Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ unload Label Ġ= Ġthis . findViewById ( R . id . unload Label ) ĊĠĠĠĠĠĠĠ Ġ_ unload Label . visibility Ġ= ĠIN VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ_ speed Label Ġ= Ġthis . findViewById ( R . id . last Speed ) ĊĠĠĠĠĠĠĠ Ġ_ speed Label . text Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ_ time Passed Ġ= Ġthis . findViewById ( R . id . time Passed ) ĊĠĠĠĠĠĠĠ Ġ_ time Passed . text Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis My Service Running ( service Class : ĠClass < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġget System Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ĊĠĠĠĠĠĠĠ Ġfor Ġ( service Ġin Ġmanager . get Running Services ( Integer . MAX _ VALUE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Class . name Ġ== Ġservice . service . className ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( this , Ġandroid . Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( android . Manifest . permission . ACCESS _ F INE _ LOCATION ), Ġ 4 2 ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is My Service Running ( My Service :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Bind Service () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate ButtonText () ĊĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer (" update Timer ") ĊĠĠĠĠĠĠĠ Ġtimer . schedule At Fixed Rate ( 1 0 0 0 , Ġ 1 0 0 0 , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ButtonText () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPER MISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhatever ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠ Ġif Ġ( is My Service Running ( My Service :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Un bind Service () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ButtonText () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is My Service Running ( My Service :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ main Button . text Ġ= Ġ" Ðŀ ÑģÑĤÐ°Ð½Ð¾Ð² Ð¸ÑĤÑĮ ĠÐ¿Ð¾ ÐµÐ· Ð´ ÐºÑĥ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bound Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun load Ġ= Ġm Bound Service !!. user Not ified ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ unload Label . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ unload Label . visibility Ġ= ĠIN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ speed Label . text Ġ= Ġ( m Bound Service !!. last Speed Found Ġ* Ġ 3 . 6 ). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsec Passed Ġ= Ġm Bound Service !! ._ total Time Passed Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Passed Ġ= Ġsec Passed Ġ/ Ġ 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsec Passed Ġ= Ġsec Passed Ġ% Ġ 6 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ time Passed . text Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġmin Passed , Ġsec Passed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ main Button . text Ġ= Ġ" ÐĿ Ð°Ñĩ Ð°ÑĤÑĮ ĠÐ¿Ð¾ ÐµÐ· Ð´ ÐºÑĥ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ unload Label . visibility Ġ= ĠIN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ speed Label . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ time Passed . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Button Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMy Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is My Service Running ( My Service :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Bind Service () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bound Service ?. user Not ified Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Un bind Service () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Service ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate ButtonText () ĊĠĠĠ Ġ} Ċ } Ċ