package Ġde . h ft _ le ip zig . hf app 2 . hf app _ kotlin Ċ Ċ import Ġandroidx . room .* Ċ import Ġandroid . location . Location Ċ import Ġandroid . os . Build Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . math . round To Long Ċ Ċ const Ġval ĠP ING _ REGEX Ġ= Ġ"( ?: \\ [( ?< ts >[ 0 - 9 . ]+ )] Ġ) ?( ?< size >[ 0 - 9 ]+) Ġbytes Ġfrom Ġ(? < ip >[ 0 - 9 . ]+ ): Ġicmp _ seq =( ?< seq >[ 0 - 9 ]+) Ġttl =( ?< ttl >[ 0 - 9 ]+ )( ?: Ġtime =( ?< rtt >[ 0 - 9 . ]+) Ġ(? < rtt metric > \\ w + )) ?" Ċ const Ġval ĠCSV _ HEADER _ PING Ġ= Ġ" timestamp , session ID , datetime , target , ttl , seq , rtt , rtt _ metric , size , lat , lon , alt , acc , speed , speed _ acc " Ċ @ Dao Ċ interface ĠPing Result Dao Ġ{ ĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġping Result ") ĊĠĠĠ Ġfun ĠgetAll (): ĠList < Ping Result > ĊĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġping Result ĠWHERE Ġsession ID =: session ID ") ĊĠĠĠ Ġfun ĠgetAll By Session ID ( session ID : ĠString ): ĠList < Ping Result > ĊĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġping Result ĠWHERE Ġsession ID ĠIN (: session IDs )") ĊĠĠĠ Ġfun ĠgetAll By Session ID ( session IDs : ĠArray < String >): ĠList < Ping Result > ĊĊĠĠĠ Ġ@ Query (" SELECT ĠDISTINCT Ġuid , Ġsession ID , Ġexported Status ĠFROM ĠPing Result ") ĊĠĠĠ Ġfun ĠgetAll Sessions (): ĠList < Session > ĊĊĠĠĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠĠĠ Ġfun Ġinsert All ( var arg Ġping Results : ĠPing Result ) ĊĊĠĠĠ Ġ@ Query (" DELETE ĠFROM Ġping Result ĠWHERE Ġsession ID =: session ID ") ĊĠĠĠ Ġfun Ġdelete By Session ID ( session ID : ĠString ) ĊĊĠĠĠ Ġ@ Query (" DELETE ĠFROM Ġping Result ĠWHERE Ġsession ID ĠIN (: session IDs )") ĊĠĠĠ Ġfun Ġdelete By Session ID ( session IDs : ĠArray < String >) ĊĊĠĠĠ Ġ@ Query (" UPDATE Ġping Result ĠSET Ġexported Status = exported Status |: exported Status ĠWHERE Ġsession ID ĠIN (: session IDs )") ĊĠĠĠ Ġfun Ġor Export Status By Session ID ( exported Status : ĠInt , Ġsession IDs : ĠArray < String >) ĊĊĠĠĠ Ġ@ Query (" UPDATE Ġping Result ĠSET Ġexported Status = exported Status |: exported Status ĠWHERE Ġsession ID =: session ID ") ĊĠĠĠ Ġfun Ġor Export Status By Session ID ( exported Status : ĠInt , Ġsession ID : ĠString ) ĊĊĠĠĠ Ġ@ Query (" UPDATE Ġping Result ĠSET Ġexported Status =: exported Status ĠWHERE Ġsession ID =: session ID ") ĊĠĠĠ Ġfun Ġset Export Status By Session ID ( exported Status : ĠInt , Ġsession ID : ĠString ) ĊĊĠĠĠ Ġ@ Query (" UPDATE Ġping Result ĠSET Ġexported Status =: exported Status ĠWHERE Ġsession ID ĠIN (: session IDs )") ĊĠĠĠ Ġfun Ġset Export Status By Session ID ( exported Status : ĠInt , Ġsession IDs : ĠArray < String >) Ċ } Ċ Ċ @ Entity ( primary Keys Ġ= Ġ[" timestamp ", Ġ" session ID ", Ġ" seq "]) Ċ data Ġclass ĠPing Result ( val Ġuid : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġtimestamp : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġsession ID : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġdatetime : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġexported Status : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtarget : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġttl : ĠInt Ġ= ĠN AN ĊĠĠĠ Ġvar Ġseq : ĠInt Ġ= ĠN AN ĊĠĠĠ Ġvar Ġr tt : ĠFloat Ġ= ĠN AN _ F ĊĠĠĠ Ġvar Ġr tt Metric : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġsize : ĠInt Ġ= ĠN AN ĊĠĠĠ Ġvar Ġloc Latitude : ĠDouble Ġ= ĠN AN _ F . toDouble () ĊĠĠĠ Ġvar Ġloc Longitude : ĠDouble Ġ= ĠN AN _ F . toDouble () ĊĠĠĠ Ġvar Ġloc Alt itude : ĠDouble Ġ= ĠN AN _ F . toDouble () ĊĠĠĠ Ġvar Ġloc Accuracy : ĠFloat Ġ= ĠN AN _ F ĊĠĠĠ Ġvar Ġloc Speed : ĠFloat Ġ= ĠN AN _ F ĊĠĠĠ Ġvar Ġloc Speed Acc : ĠFloat Ġ= ĠN AN _ F ĊĠĠĠ Ġ@ Ignore Ġvar Ġlocation : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġto CSV Row ( sep : ĠString ? Ġ= Ġ", "): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġtimestamp . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġsession ID Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġdatetime Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġtarget Ġ+ Ġsep ĊĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġttl . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġseq . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġr tt . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġr tt Metric Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġsize . toString () Ġ+ Ġsep ĊĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Latitude . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Longitude . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Alt itude . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Accuracy . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Speed . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġloc Speed Acc . toString () Ġ+ Ġsep ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Location (_ location : ĠLocation ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocation Ġ= Ġ_ location ĊĠĠĠĠĠĠĠ Ġloc Latitude Ġ= Ġ_ location . latitude ĊĠĠĠĠĠĠĠ Ġloc Longitude Ġ= Ġ_ location . longitude ĊĠĠĠĠĠĠĠ Ġloc Alt itude Ġ= Ġ_ location . altitude ĊĠĠĠĠĠĠĠ Ġloc Accuracy Ġ= Ġ_ location . accuracy ĊĠĠĠĠĠĠĠ Ġif Ġ(_ location . has Speed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloc Speed Ġ= Ġ_ location . speed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ location . has Speed Accuracy ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloc Speed Acc Ġ= Ġ_ location . speed Accuracy Met ers PerSecond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( ping String : ĠString , Ġsession ID : ĠString ? Ġ= Ġ" test "): Ġthis ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . session ID Ġ= Ġsession ID ?: "" ĊĠĠĠĠĠĠĠ Ġparse Ping String ( ping String ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Ping String ( s : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre Ġ= ĠPattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ING _ REGEX , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . CASE _ INS ENS ITIVE . or ( Pattern . DOT ALL )) ĊĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġre . matcher ( s ) ĊĠĠĠĠĠĠĠ Ġres . find () ĊĊĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġ( res . group ( 1 ). toDouble ()* 1 0 0 0 ). round To Long () ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ' T ' HH : mm : ss . SS S ' Z '", ĠLocale . US ) ĊĠĠĠĠĠĠĠ Ġsdf . time Zone Ġ= ĠTime Zone . getTime Zone (" UTC ") ĊĠĠĠĠĠĠĠ Ġdatetime Ġ= Ġsdf . format ( timestamp ) ĊĊĠĠĠĠĠĠĠ Ġsize Ġ= Ġres . group ( 2 ). toInt () ĊĠĠĠĠĠĠĠ Ġtarget Ġ= Ġres . group ( 3 ) ĊĠĠĠĠĠĠĠ Ġseq Ġ= Ġres . group ( 4 ). toInt () ĊĠĠĠĠĠĠĠ Ġttl Ġ= Ġres . group ( 5 ). toInt () ĊĊĠĠĠĠĠĠĠ Ġr tt Ġ= Ġif Ġ( res . group ( 6 ) Ġ!= Ġnull ) Ġres . group ( 6 ). toFloat () Ġelse ĠN AN _ F ĊĠĠĠĠĠĠĠ Ġr tt Metric Ġ= Ġif Ġ( res . group ( 7 ) Ġ!= Ġnull ) Ġres . group ( 7 ) Ġelse ĠN AN . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Ping Result " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstr Or Nan ( value To Conv : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value To Conv Ġ== ĠN AN ) Ġ" NaN " Ġelse Ġvalue To Conv . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstr Or Nan ( value To Conv : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value To Conv Ġ== ĠN AN . toString ()) Ġ" NaN " Ġelse Ġvalue To Conv ĊĠĠĠ Ġ} Ċ }