package Ġcom . got t lic her . ped al 4 me Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Intent Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . jak ew h art on . ret rofit 2 . adapter . kotlin . coroutines . Coroutine Call Adapter Factory Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . ank o . sdk 2 7 . coroutines . onClick Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġcom . sh awn lin . number picker . Number Picker Ċ import Ġcom . sh awn lin . number picker . Number Picker . On Scroll Listener . SCROLL _ STATE _ IDLE ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġval ĠP REF _ NAME : String Ġ= Ġ" MAIN " ĊĠĠĠ Ġval ĠP REF _ IP : String Ġ= Ġ" IP " ĊĠĠĠ Ġval ĠP REF _ PIN : String Ġ= Ġ" PIN " ĊĊĠĠĠ Ġlateinit Ġvar Ġapi : Ped aler Api ĊĠĠĠ Ġvar Ġis Running : Boolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġstart Button . onClick Ġ{ Ġstart Stop Click () Ġ} ĊĠĠĠĠĠĠĠ Ġguide Button . onClick Ġ{ Ġopen Pin Guide () Ġ} ĊĠĠĠĠĠĠĠ Ġscan Button . onClick Ġ{ Ġgo To Scanner () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget Prefs () ĊĠĠĠĠĠĠĠ Ġip TextView . setText ( prefs . first ) ĊĠĠĠĠĠĠĠ Ġbcm Pin Text . setText ( prefs . second . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠP icker Listener () ĊĠĠĠĠĠĠĠ Ġrpm Picker . setOn ValueChanged Listener Ġ( listener ) ĊĠĠĠĠĠĠĠ Ġrpm Picker . setOn Scroll Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ Ġcheck Status () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck Status (){ ĊĠĠĠĠĠĠĠ Ġapi Ġ= Ġmake Ret rofit ( ip TextView . text . toString ()) ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi . status Async (). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Error Ġ${ response . error Body (). toString () }", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrunning Ġ= Ġresponse . body () !!. isRunning ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Button W he en State ( running ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbcm Pin Text . setText ( response . body () !!. bcm Pin . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpm Picker . value Ġ= Ġresponse . body () !!. rpm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Error Ġ$ e ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon R pm Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isRunning ) Ġreturn ĊĠĠĠĠĠĠĠ Ġrpm Picker . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpm Picker . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstart Stop Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Prefs () ĊĠĠĠĠĠĠĠ Ġapi Ġ= Ġmake Ret rofit ( ip TextView . text . toString ()) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Error Ġ$ e ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstart (){ ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi . set Async ( Set Params ( bcm Pin Text . text . toString (). toInt (), Ġrpm Picker . value )). await () ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Button W he en State ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Error Ġ${ response . error Body (). toString () }", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstop (){ ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi . stop Async (). await () ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Button W he en State ( false ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Error Ġ${ response . error Body (). toString () }", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Button W he en State Ġ( running : Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġrunning ; ĊĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . text Ġ= Ġ" Stop " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . background Tint List Ġ= ĠContext Compat . getColor State List ( this , ĠR . color . color Stop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwheel Image . start Animation ( anim ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . text Ġ= Ġ" Start " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . background Tint List Ġ= ĠContext Compat . getColor State List ( this , ĠR . color . color Go ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwheel Image . animation ?. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgo To Scanner () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( Intent ( this , ĠScanner Activity :: class . java ), Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġrequest Code Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġdata ?. getString Extra (" IP ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip TextView . setText ( ip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Ret rofit ( url : String ): ĠPed aler Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" http :// $ url /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Coroutine Call Adapter Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn Ġretrofit . create ( Ped aler Api :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Prefs (): Pair < String , Int >{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences ( PRE F _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġprefs . getString ( PRE F _ IP , Ġ" 1 9 2 . 1 6 8 . 1 . 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġpin Ġ= Ġprefs . getInt ( PRE F _ PIN , Ġ 2 1 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( ip , Ġpin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Prefs (){ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences ( PRE F _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġprefs . edit () ĊĠĠĠĠĠĠĠ Ġeditor . putString ( PRE F _ IP , Ġip TextView . text . toString ()) ĊĠĠĠĠĠĠĠ Ġeditor . put Int ( PRE F _ PIN , Ġbcm Pin Text . text . toString (). toInt ()) ĊĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Pin Guide (){ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// pin out . xyz /" ĊĠĠĠĠĠĠĠ ĠCustom Tabs Intent . Builder (). build (). launch Url ( this , ĠUri . parse ( url )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠP icker Listener Ġ: ĠNumber Picker . On Scroll Listener , ĠNumber Picker . On Value ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġscroll State Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChange ( view : ĠNumber Picker , Ġscroll State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . scroll State Ġ= Ġscroll State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll State Ġ== ĠSC ROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ Ġon R pm Changed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Value Change ( picker : ĠNumber Picker , Ġold Val : ĠInt , ĠnewVal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll State Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ Ġon R pm Changed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ