/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġ ĠST Micro electron ics ĠâĢĵ ĠAll Ġrights Ġreserved Ċ Ġ* ĠThe ĠST Micro electron ics Ġcorpor ate Ġlogo Ġis Ġa Ġtrade mark Ġof ĠST Micro electron ics Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ġmodification , Ċ Ġ* Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ- ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ċ Ġ* Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ- ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ċ Ġ* Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ċ Ġ* Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ- ĠNeither Ġthe Ġname Ġnor Ġtrade marks Ġof ĠST Micro electron ics ĠInternational ĠN . V . Ġnor Ġany Ġother Ċ Ġ* ĠST Micro electron ics Ġcompany Ġnor Ġthe Ġnames Ġof Ġits Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ċ Ġ* Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* Ġ- ĠAll Ġof Ġthe Ġicons , Ġpictures , Ġlog os Ġand Ġother Ġimages Ġthat Ġare Ġprovided Ġwith Ġthe Ġsource Ġcode Ċ Ġ* Ġin Ġa Ġdirectory Ġwhose Ġtitle Ġbegins Ġwith Ġst _ images Ġmay Ġonly Ġbe Ġused Ġfor Ġinternal Ġpurposes Ġand Ċ Ġ* Ġshall Ġnot Ġbe Ġre distributed Ġto Ġany Ġthird Ġparty Ġor Ġmodified Ġin Ġany Ġway . Ċ Ġ* Ċ Ġ* Ġ- ĠAny Ġre distributions Ġin Ġbinary Ġform Ġshall Ġnot Ġinclude Ġthe Ġcapability Ġto Ġdisplay Ġany Ġof Ġthe Ċ Ġ* Ġicons , Ġpictures , Ġlog os Ġand Ġother Ġimages Ġthat Ġare Ġprovided Ġwith Ġthe Ġsource Ġcode Ġin Ġa Ġdirectory Ċ Ġ* Ġwhose Ġtitle Ġbegins Ġwith Ġst _ images . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY Ċ Ġ* ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER Ċ Ġ* ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR Ċ Ġ* ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ Ġ* ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR Ċ Ġ* ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY Ċ Ġ* ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . st . ST WIN Board _ Gui Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . st . Blue ST SDK . Features . high Speed Data Log . Feature HS Data Log Config Ċ import Ġcom . st . Blue ST SDK . Features . high Speed Data Log . communication . Device Model . Sensor Ċ import Ġcom . st . Blue ST SDK . Features . high Speed Data Log . communication . Device Model . Sensor Type Ċ import Ġcom . st . Blue ST SDK . Features . high Speed Data Log . communication . Device Parser Ċ import Ġcom . st . Blue ST SDK . Manager Ċ import Ġcom . st . Blue ST SDK . Node Ċ import Ġcom . st . ST WIN Board _ Gui . Utils . Sensor View Adapter Ċ import Ġcom . st . ST WIN Board _ Gui . Utils . Sensor ViewData Ċ import Ġcom . st . cl ab . st win . gui . R Ċ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ open Ġclass ĠH SD Config Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġview Models < H SD Config ViewModel >() ĊĠĠĠ Ġprivate Ġval Ġload ML C ViewModel Ġby Ġview Models < H SD ML C Config ViewModel >() ĊĊĠĠĠ Ġprivate Ġval Ġm Sensors Adapter Ġ= ĠSensor View Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSensor View Adapter . Sensor Interaction Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sensor Collapsed ( selected : ĠSensor ViewData ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . collapse Sensor ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sensor Expanded ( selected : ĠSensor ViewData ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . expand Sensor ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sub Sensor O DR Change Ġ= Ġ{ sensor , Ġsub Sensor , Ġnew O dr Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change O DR Value ( sensor , sub Sensor , new O dr Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sub Sensor Full Scale Change Ġ= Ġ{ sensor , Ġsub Sensor , Ġnew FS Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change Full Scale ( sensor , sub Sensor , new FS Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sub Sensor Sample Change Ġ= Ġ{ sensor , Ġsub Sensor , Ġnew Sample Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change Sample For TimeStamp ( sensor , sub Sensor , new Sample Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sub Sub Sensor Enable Status Change Ġ= Ġ{ sensor , Ġsub Sensor , ĠnewState , Ġparams Locked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change Enable State ( sensor , sub Sensor , ĠnewState , Ġparams Locked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sub Sensor Open ML C Conf Ġ= Ġ{ sensor , Ġsub Sensor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ML C ViewModel . open Load ML C Conf ( sensor , sub Sensor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ML C ConfigFile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon U CF Status Change Ġ= Ġ{ sensor , Ġsub Sensor , Ġnew Status Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change Enable State ( sensor , sub Sensor , new Status , false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠ Ġprivate Ġfun Ġrequest Configuration File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcho oser File Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ MIME _ TYPES , ĠarrayOf (" application / json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠP ICK FILE _ REQUEST _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcho oser Title Ġ= ĠgetString ( R . string . h sdl _ config FileChooser Title ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( Intent . create Chooser ( cho oser File , Ġcho oser Title ), ĠP ICK FILE _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest ML C ConfigFile () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcho oser File Ġ= ĠIntent ( Intent . ACTION _ GET _ CONTENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ MIME _ TYPES , ĠarrayOf (" application /* ", Ġ" text /* ")) // NOTE Ġuc f Ġtype Ġfile Ġcheck Ġis Ġdone Ġin Ġon Activity Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠP ICK FILE _ U CF _ REQUEST _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcho oser Title Ġ= ĠgetString ( R . string . h sdl _ config FileChooser Title ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĠIntent . create Chooser ( cho oser File , Ġcho oser Title ), ĠP ICK FILE _ U CF _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ICK FILE _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġdata ?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Config FromFile ( file Uri , require Context (). content Resolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ICK FILE _ U CF _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġdata ?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri String Ġ= Ġfile Uri . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (( file Uri String . substring ( file Uri String . lastIndexOf (". "))) Ġ== Ġ". uc f ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ML C ViewModel . load UC FF rom File ( file Uri , Ġrequire Context (). content Resolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change ML CL ock ed Params ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay ErrorMessage ( IO Conf Error . Invalid File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE _ FILE _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġdata ?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . store Config ToFile ( file Uri , require Context (). content Resolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAVE _ SETTINGS _ REQUEST _ CODE ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠH SD Config Save Dialog Fragment . extract Save Settings ( data ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Configuration ( settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Conf View : View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Loading View : View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Loading Text : TextView ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġinflater . inflate ( R . layout . fragment _ st win _ config , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġroot . findViewById < View >( R . id . st Win Conf _ load Button ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Configuration File () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroot . findViewById < View >( R . id . st Win Conf _ save Button ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Save Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġroot . findViewById < RecyclerView >( R . id . st Win Conf _ sensors List ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġm Sensors Adapter ĊĊĠĠĠĠĠĠĠ Ġm Conf View Ġ= Ġroot . findViewById ( R . id . st Win Conf _ conf View Layout ) ĊĠĠĠĠĠĠĠ Ġm Loading View Ġ= Ġroot . findViewById ( R . id . st Win Conf _ progress Layout ) ĊĠĠĠĠĠĠĠ Ġm Loading Text Ġ= Ġroot . findViewById ( R . id . st Win Conf _ progress Text ) ĊĊĠĠĠĠĠĠĠ Ġval Ġview Save Button Ġ= Ġroot . findViewById < View >( R . id . st Win Conf _ load Save Button Group ) ĊĠĠĠĠĠĠĠ Ġview Save Button . visibility Ġ= Ġif ( show Save Button ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel . error . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( error != null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay ErrorMessage ( error ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . sensors Configur ait on . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Sensors Adapter . submit List ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . saved Conf ug uration . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġconf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconf Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Config Complete Event ( conf ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . request File Location . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġask File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ask File ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest File Creation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . has Obsolete FW . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġhas Obsolete FW Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Obsolete FW Message ( has Obsolete FW ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . is Config Loading . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĠisLoading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Config Loading View ( isLoading ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġload ML C ViewModel . isLoading . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĠisLoading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow ML CL o ading View ( isLoading ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Progress View ( show It : Boolean , Ġ@ String Res Ġdesc : Int ){ ĊĠĠĠĠĠĠĠ Ġif ( show It ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Loading View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Conf View . visibility = View . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Loading Text . setText ( desc ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Loading View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Conf View . visibility = View . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow ML CL o ading View ( isLoading : Boolean ){ ĊĠĠĠĠĠĠĠ Ġshow Progress View ( isLoading , R . string . st win _ loading _ uc f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Obsolete FW Message ( has Obsolete FW : FW Error Info ){ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġwith ( builder ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" FW Ġversion ĠAlert !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Icon ( R . drawable . ic _ warning _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Message (" Obsolete ĠF irmware Ġdetected : Ġ[" Ġ+ Ġhas Obsolete FW . curr FW Ġ+ Ġ" ]. \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġupdate Ġit Ġto Ġthe Ġlatest Ġone : Ġ[" Ġ+ Ġhas Obsolete FW . target FW Ġ+ Ġ" ]. \ n \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġcan Ġdownload Ġit Ġhere : Ġ" Ġ+ Ġhas Obsolete FW . target FW Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Config Loading View ( isLoading : Boolean ){ ĊĠĠĠĠĠĠĠ Ġshow Progress View ( isLoading , R . string . st win _ loading _ conf ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay ErrorMessage ( error : ĠIO Conf Error ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( require View (), error . toString Res , Snackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNode (): Node ? { ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments ?. getString ( NODE _ TAG _ EXTRA )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManager . get Shared Instance (). getNode With Tag ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠgetNode () ĊĠĠĠĠĠĠĠ Ġif ( node != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Needed Notification ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable Needed Notification ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . enable Notification From Node ( node ) ĊĠĠĠĠĠĠĠ Ġload ML C ViewModel . attach To ( node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Need Notification ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . disable Notification From Node ( node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠgetNode () ĊĠĠĠĠĠĠĠ Ġif ( node != null Ġ&& Ġdisable Notification On Stop ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Need Notification ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġview ?. findViewById < RecyclerView >( R . id . st Win Conf _ sensors List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . adapter = null ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu _ st win _ hs _ dat alog , menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( item . itemId ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ h sdl _ wifi Conf Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠgetNode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( node != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw if Settings Ġ= ĠWiFi Configure Dialog Fragment . newInstance ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw if Settings . show ( child FragmentManager , ĠW IFI _ CONFIG _ FRAGMENT _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ h sdl _ save Conf Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Save Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ h sdl _ load Conf Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Configuration File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ h sdl _ change Alias Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠgetNode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( node != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalias Settings Ġ= ĠBoard Alias Conf Dialog Fragment . newInstance ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Settings . show ( child FragmentManager , ĠA LI AS _ CONFIG _ FRAGMENT _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Save Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠH SD Config Save Dialog Fragment () ĊĠĠĠĠĠĠĠ Ġdialog . setTarget Fragment ( null , ĠSAVE _ SETTINGS _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġdialog . show ( child FragmentManager ," save Dialog ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsend Config Complete Event ( new Conf : List < Sensor > ){ ĊĠĠĠĠĠĠĠ Ġval Ġnew Conf Str Ġ= ĠDevice Parser . toJson Str ( new Conf ) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send Broadcast ( build Config Completed Event ( new Conf Str )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġrequest File Creation (){ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ CREATE _ DOCUMENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠP ICK FILE _ REQUEST _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TITLE , ĠDEFAULT _ CON FI _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . request File Location . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠCREATE _ FILE _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġshow Save Button : Boolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ Ġarguments ?. getBoolean ( SHOW _ SAVE _ BUTTON _ EXTRA , false ) Ġ?: Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġdisable Notification On Stop : Boolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġarguments ?. getBoolean ( DISABLE _ NOTIFICATION _ ON _ STOP , true ) Ġ?: Ġtrue ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠW IFI _ CONFIG _ FRAGMENT _ TAG Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". WIFI _ CONFIG _ FRAGMENT " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠA LI AS _ CONFIG _ FRAGMENT _ TAG Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". ALIAS _ CONFIG _ FRAGMENT " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK FILE _ REQUEST _ CODE Ġ= Ġ 7 7 7 7 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK FILE _ REQUEST _ TYPE Ġ= Ġ" application / json " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK FILE _ U CF _ REQUEST _ CODE Ġ= Ġ 7 7 7 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK FILE _ U CF _ REQUEST _ TYPE Ġ= Ġ" application / uc f " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ CON FI _ NAME Ġ= Ġ" ST WIN _ conf . json " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNODE _ TAG _ EXTRA Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". NODE _ TAG _ EXTRA " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSHOW _ SAVE _ BUTTON _ EXTRA Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". SHOW _ SAVE _ BUTTON _ EXTRA " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDISABLE _ NOTIFICATION _ ON _ STOP Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". DISABLE _ NOTIFICATION _ ON _ STOP " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( node : ĠNode , show Save Button : Boolean Ġ= Ġfalse , disable Notification On Stop : Boolean Ġ= Ġtrue ): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠH SD Config Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( NODE _ TAG _ EXTRA , node . tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( SHOW _ SAVE _ BUTTON _ EXTRA , show Save Button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( DISABLE _ NOTIFICATION _ ON _ STOP , disable Notification On Stop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCREATE _ FILE _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSAVE _ SETTINGS _ REQUEST _ CODE Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠACTION _ CONFIG _ COMPLETE Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". ACTION _ CONFIG _ COMPLETE " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠACTION _ CONFIG _ EXTRA Ġ= ĠH SD Config Fragment :: class . java . name Ġ+ Ġ". ACTION _ CONFIG _ EXTRA " ĊĠĠĠĠĠĠĠ Ġfun Ġbuild Config Complete Intent Filter (): ĠIntent Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ CONFIG _ COMPLETE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġextract Saved Config ( intent : ĠIntent ?): String ? { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif ( intent ?. action Ġ== ĠACTION _ CONFIG _ COMPLETE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getString Extra ( ACTION _ CONFIG _ EXTRA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġbuild Config Completed Event ( new Config : ĠString ?): Intent { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( ACTION _ CONFIG _ COMPLETE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( new Config != null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ACTION _ CONFIG _ EXTRA , Ġnew Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠIO Conf Error . toString Res : Int ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Conf Error . Invalid File Ġ-> ĠR . string . h sdl _ error _ invalid File ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Conf Error . File NotFound Ġ-> ĠR . string . h sdl _ error _ file NotFound ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Conf Error . Imp ossible ReadFile Ġ-> ĠR . string . h sdl _ error _ read Error ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Conf Error . Imp ossible WriteFile Ġ-> ĠR . string . h sdl _ error _ write Error ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Conf Error . Imp ossible Create File Ġ-> ĠR . string . h sdl _ error _ create Error ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ } Ċ