package Ġcom . ant on kes y . ud pt ool . data . store Ċ Ċ import Ġandroidx . datastore . core . DataStore Ċ import Ġandroidx . datastore . preferences . core .* Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġcom . ant on kes y . ud pt ool . ui . log . ASCII Ċ import Ġcom . ant on kes y . ud pt ool . ui . log . HEX Ċ import Ġcom . ant on kes y . ud pt ool . ui . log . Log Message Coding Ċ import Ġcom . ant on kes y . ud pt ool . ui . log . Message Log ViewModel Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ private Ġval ĠLOCAL _ PORT Ġ= Ġint Preferences Key (" local _ port ") Ċ private Ġval ĠRE MOTE _ PORT Ġ= Ġint Preferences Key (" remote _ port ") Ċ private Ġval ĠRE MOTE _ IP Ġ= Ġstring Preferences Key (" remote _ ip ") Ċ private Ġval ĠTIME OUT _ TIME Ġ= Ġint Preferences Key (" timeout _ time ") Ċ private Ġval ĠIS _ TIMEOUT Ġ= Ġboolean Preferences Key (" is Timeout ") Ċ private Ġval ĠIS _ MESSAGE Ġ= Ġboolean Preferences Key (" is Message ") Ċ private Ġval ĠBUFFER _ SIZE Ġ= Ġint Preferences Key (" buffer _ size ") Ċ private Ġval ĠMESSAGE _ CODING Ġ= Ġint Preferences Key (" message _ coding ") Ċ private Ġval ĠIS _ LIST EN ING Ġ= Ġboolean Preferences Key (" is _ list ening ") Ċ private Ġval ĠIS _ LIST EN ING _ INTERVAL Ġ= Ġboolean Preferences Key (" is _ list ening _ interval ") Ċ private Ġval ĠLIST EN ING _ INTERVAL Ġ= Ġint Preferences Key (" list ening _ interval ") Ċ Ċ internal Ġfun Ġload Saved Data ( viewModel : ĠMessage Log ViewModel , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Local Port ( getLocal Port ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Remote Port ( get Remote Port ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Remote IP ( get Remote IP ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset TimeOut Time ( getTime Out Time ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs TimeOut Time ( getIs TimeOut ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Message ( getIs Message ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset BufferSize ( get BufferSize ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Message Coding ( getMessage Coding ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Listening ( getIs Listening ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Listening Interval ( getIs Listening Interval ( data Store )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Listen Interval ( getList ening Interval ( data Store )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġobserve To SaveData ( ĊĠĠĠ Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠ ĠviewModel : ĠMessage Log ViewModel , ĊĠĠĠ Ġdata Store : ĠData Store < Preferences > Ċ ) Ġ{ ĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . local Port , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Local Port ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . remote Port , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Remote Port ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . remote IP , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Remote IP ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . time Out Time , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TimeOut Time ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . is TimeOut Time , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs TimeOut ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . is Message , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Message ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . buffer Size , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BufferSize ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . message Coding , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message Coding ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . listen Interval , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Listening Interval ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . is Listening , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Listening ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġobserve Data ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġlifecycle Owner , ĊĠĠĠĠĠĠĠ Ġlive Data Ġ= ĠviewModel . is Listening Interval , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Listening Interval ( it , Ġdata Store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġ< T > Ġobserve Data ( ĊĠĠĠ Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠ Ġlive Data : ĠLive Data < T >, ĊĠĠĠ Ġset Function : Ġ( T ) Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġlive Data . observe ( lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠ Ġset Function ( it ) ĊĠĠĠ Ġ}) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġ< T > ĠgetData ( ĊĠĠĠ Ġkey : ĠPreferences . Key < T >, ĊĠĠĠ Ġdata Store : ĠData Store < Preferences >, Ġdefault : ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġvar Ġvalue Ġ= Ġdefault ĊĊĠĠĠ Ġval Ġexample Counter Flow : ĠFlow < T > Ġ= Ġdata Store . data ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpreferences Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences [ key ] Ġ?: Ġdefault ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġexample Counter Flow . first Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvalue Ċ } Ċ Ċ private Ġsuspend Ġfun Ġ< T > ĠsetData ( ĊĠĠĠ ĠnewValue : ĠT , ĊĠĠĠ Ġkey : ĠPreferences . Key < T >, ĊĠĠĠ Ġdata Store : ĠData Store < Preferences > Ċ ) Ġ{ ĊĠĠĠ Ġdata Store . edit Ġ{ Ġsettings Ġ-> ĊĠĠĠĠĠĠĠ Ġsettings [ key ] Ġ= ĠnewValue ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Local Port ( data Store : ĠData Store < Preferences >): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( LOCAL _ PORT , Ġdata Store , Ġ 0 ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset Local Port ( newValue : ĠInt , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠLOCAL _ PORT , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Remote Port ( data Store : ĠData Store < Preferences >): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( REMOTE _ PORT , Ġdata Store , Ġ 0 ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset Remote Port ( newValue : ĠInt , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠRE MOTE _ PORT , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget TimeOut Time ( data Store : ĠData Store < Preferences >): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( TIMEOUT _ TIME , Ġdata Store , Ġ 0 ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset TimeOut Time ( newValue : ĠInt , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠTIME OUT _ TIME , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget BufferSize ( data Store : ĠData Store < Preferences >): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( BUFFER _ SIZE , Ġdata Store , Ġ 0 ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset BufferSize ( newValue : ĠInt , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠBUFFER _ SIZE , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠgetMessage Coding ( data Store : ĠData Store < Preferences >): ĠLog Message Coding Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( getData ( MESSAGE _ CODING , Ġdata Store , Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠASCII ĊĠĠĠĠĠĠĠĠ 2 Ġ-> ĠHEX ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠASCII ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset Message Coding ( ĊĠĠĠ ĠnewValue : ĠLog Message Coding , ĊĠĠĠ Ġdata Store : ĠData Store < Preferences > Ċ ) Ġ{ ĊĠĠĠ ĠsetData ( ĊĠĠĠĠĠĠĠ Ġwhen Ġ( newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠASCII Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEX Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġ}, ĠMESSAGE _ CODING , Ġdata Store ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Remote IP ( data Store : ĠData Store < Preferences >): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( REMOTE _ IP , Ġdata Store , Ġ" 0 . 0 . 0 . 0 ") Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset Remote IP ( newValue : ĠString , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠRE MOTE _ IP , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Is TimeOut ( data Store : ĠData Store < Preferences >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( IS _ TIMEOUT , Ġdata Store , Ġfalse ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠsetIs TimeOut ( newValue : ĠBoolean , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠIS _ TIMEOUT , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Is Message ( data Store : ĠData Store < Preferences >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( IS _ MESSAGE , Ġdata Store , Ġfalse ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠsetIs Message ( newValue : ĠBoolean , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠIS _ MESSAGE , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Is Listening ( data Store : ĠData Store < Preferences >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( IS _ LIST EN ING , Ġdata Store , Ġfalse ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠsetIs Listening ( newValue : ĠBoolean , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠIS _ LIST EN ING , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Is Listening Interval ( data Store : ĠData Store < Preferences >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( IS _ LIST EN ING _ INTERVAL , Ġdata Store , Ġfalse ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠsetIs Listening Interval ( newValue : ĠBoolean , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠIS _ LIST EN ING _ INTERVAL , Ġdata Store ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġget Listening Interval ( data Store : ĠData Store < Preferences >): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠgetData ( LIST EN ING _ INTERVAL , Ġdata Store , Ġ 0 ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġset Listening Interval ( newValue : ĠInt , Ġdata Store : ĠData Store < Preferences >) Ġ{ ĊĠĠĠ ĠsetData ( newValue , ĠLIST EN ING _ INTERVAL , Ġdata Store ) Ċ }