package Ġcom . w zd ct ool . android . ui . configuration Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Alpha Animation Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . widget . Switch Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . w zd ct ool . android . R Ċ import Ġcom . w zd ct ool . android . dat acl asses . Configuration Obj Ċ import Ġcom . w zd ct ool . android . dat acl asses . gps _ status Ċ import Ġcom . w zd ct ool . android . dat acl asses . gps _ type Ċ import Ġcom . w zd ct ool . android . repos . Configuration Repository Ċ import Ġcom . w zd ct ool . android . repos . Configuration Repository . active Config Subject Ċ import Ġcom . w zd ct ool . android . repos . Configuration Repository . active WZ ID Subject Ċ import Ġcom . w zd ct ool . android . repos . Data Classes Repository . active Location Source Subject Ċ import Ġcom . w zd ct ool . android . repos . Data Classes Repository . location Sources Subject Ċ import Ġcom . w zd ct ool . android . repos . Data Classes Repository . r sm Status Ċ import Ġrx . Subscription ĊĊ Ċ /** Ċ Ġ* Ġ ĠConfigure Ġsettings Ġbefore Ġdata Ġcollection . Ċ Ġ* Ċ Ġ* Ġ ĠEst ablish ĠGPS Ġdevice Ġconnection , Ġverify Ġmessages Ġto Ġbe Ġgenerated , Ċ Ġ* ĠĠĠĠĠ Ġchange Ġthe Ġstart Ġand Ġend Ġdata Ġcollection Ġmode , Ġselect Ġlocal Ġconfiguration Ġfiles Ġto Ġimport , Ċ Ġ* ĠĠĠĠĠ Ġstart Ġdata Ġcollection Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ class ĠConfiguration Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠConfiguration Fragment ViewModel ĊĠĠĠ Ġprivate Ġvar Ġis G ps Valid Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Config Valid Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġsubscriptions : ĠMutable List < Subscription > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . configuration _ fragment , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Button >( R . id . start Data Collection Button ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Data Collection Obj () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . action _ First Fragment _ to _ Second Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHelp Ġbutton Ġ( small Ġquestion Ġmark Ġin Ġtop Ġright ) ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . help _ button ). setOnClickListener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . help Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Spinner >( R . id . config Spinner ). on ItemSelected Listener Ġ= Ġobject Ġ: ĠAdapter View . On ItemSelected Listener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Config Valid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). findViewById < Button >( R . id . start Data Collection Button ). isEnabled Ġ= Ġis G ps Valid Ġ&& Ġis Config Valid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Name : ĠString Ġ= Ġparent ?. getItem At Position ( position ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess : ĠBoolean Ġ= ĠConfiguration Repository . activate Config ( config Name ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . activate Config ( config Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Switch Compat >( R . id . collection Mode Switch Guide line ). setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . automatic Detection Ġ= Ġis Checked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġsomething , Ġthe Ġis Checked Ġwill Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrue Ġif Ġthe Ġswitch Ġis Ġin Ġthe ĠOn Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Switch Compat >( R . id . gps Switch ). setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Location Source Subject . onNext ( gps _ type . usb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Location Source Subject . onNext ( gps _ type . internal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . refresh Button ). setOnClickListener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Spinner () Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Subscriptions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Subscriptions () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( subscription Ġin Ġsubscriptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . unsubscribe () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Subscriptions () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtriggered Ġby Ġgps Ġlocation Ġsources Ġon Ġstatus Ġchange ĊĠĠĠĠĠĠĠ Ġsubscriptions . add ( location Sources Subject . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInternal ĠGPS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . internal Ġ== Ġgps _ status . valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source Off ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ valid )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . internal Ġ== Ġgps _ status . invalid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source Off ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ invalid )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . internal Ġ== Ġgps _ status . disconnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source Off ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ disconnected )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUSB ĠGPS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . usb Ġ== Ġgps _ status . valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source On ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ valid )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . usb Ġ== Ġgps _ status . invalid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source On ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ invalid )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim : ĠAnimation Ġ= ĠAlpha Animation ( 0 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim . duration Ġ= Ġ 9 0 0 Ġ// You Ġcan Ġmanage Ġthe Ġblink ing Ġtime Ġwith Ġthis Ġparameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim . start Offset Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim . repeat Mode Ġ= ĠAnimation . RE VERSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim . repeat Count Ġ= ĠAnimation . INF IN ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . start Animation ( anim ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . usb Ġ== Ġgps _ status . disconnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġrequire View (). findViewById < TextView >( R . id . location Source On ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( resources . getColor ( R . color . usb _ status _ disconnected )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgps _ switch Ġ= Ġrequire View (). findViewById < Switch Compat >( R . id . gps Switch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgps _ switch . isEnabled Ġ= Ġit . internal Ġ== Ġgps _ status . valid Ġ&& Ġit . usb Ġ== Ġgps _ status . valid ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtriggered Ġby Ġchange Ġin Ġactive Ġlocation Ġsource ĊĠĠĠĠĠĠĠ Ġsubscriptions . add ( active Location Source Subject . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgps _ switch Ġ= Ġrequire View (). findViewById < Switch Compat >( R . id . gps Switch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġgps _ type . internal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps _ switch . isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis G ps Valid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġ== Ġgps _ type . usb ) Ġ{ Ġ// Ġif Ġ( usb Location Valid . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps _ switch . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis G ps Valid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis G ps Valid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). findViewById < Button >( R . id . start Data Collection Button ). isEnabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis G ps Valid Ġ&& Ġis Config Valid ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtriggered Ġby Ġmain Ġactivity ĠR SM Ġstatus Ġchange ĊĠĠĠĠĠĠĠ Ġsubscriptions . add ( r sm Status . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). findViewById < CheckBox >( R . id . checkBox 3 ). isChecked Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtriggered Ġby Ġconfiguration Ġfile Ġimport ĊĠĠĠĠĠĠĠ Ġval Ġconfig Observer Ġ= ĠObserver < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). findViewById < TextView >( R . id . active Config TextView ). text Ġ= Ġ" Active ĠConfig : Ġ$ it " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactive WZ ID Subject . observe ( view Lifecycle Owner , Ġconfig Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġadd Subscriptions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġremove Subscriptions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġremove Subscriptions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this ). get ( Configuration Fragment ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġrefresh Spinner () ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serve Ġactive Ġconfiguration Ġobject ĊĠĠĠĠĠĠĠ Ġval Ġconfig Observer Ġ= ĠObserver < Configuration Obj > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Config Valid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). findViewById < Button >( R . id . start Data Collection Button ). isEnabled Ġ= Ġis G ps Valid Ġ&& Ġis Config Valid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Data Collection Obj () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactive Config Subject . observe ( view Lifecycle Owner , Ġconfig Observer ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . update Config List () ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUse Ġthe ĠViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Spinner () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspinner Ġ= Ġrequire View (). findViewById ( R . id . config Spinner ) Ġas ĠSp inner ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠArray < String > Ġ= Ġresources . getString Array ( R . array . config _ files ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig List Ġ= ĠConfiguration Repository . getLocal Config List () ĊĠĠĠĠĠĠĠ Ġif Ġ( config List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspinner . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspinner Adapter : ĠArray Adapter < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Adapter < String >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . require Context (), Ġandroid . R . layout . simple _ spinner _ item , Ġconfig List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspinner Adapter . set DropDown View Resource ( android . R . layout . simple _ spinner _ dropdown _ item ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspinner . adapter Ġ= Ġspinner Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspinner Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspinner . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }