package Ġcom . gu avas . cz 3 0 0 2 . ui . violation Ċ Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . as LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . gu avas . cz 3 0 0 2 . data . violation . Violation Ċ import Ġcom . gu avas . cz 3 0 0 2 . data . violation . Violation ListItem Ċ import Ġcom . gu avas . cz 3 0 0 2 . data . violation . Violation Repository Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠVi olations Fragment ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġviolation Repo : ĠVi olation Repository , Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġvar Ġlayout Manager State : ĠParcel able ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġ_ isLoading Ġ= ĠMutable State Flow ( true ) ĊĊĠĠĠ Ġ/** ĠReturns Ġ` true ` Ġif Ġthe Ġapp Ġis Ġstill Ġfetching Ġdata . Ġ*/ ĊĠĠĠ Ġval ĠisLoading Ġ= Ġ_ isLoading . as LiveData () ĊĊĠĠĠ Ġfun Ġupdate Loading ( loading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ isLoading . value Ġ= Ġloading ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ assigned Location Ġ= ĠMutable State Flow ("") ĊĠĠĠ Ġval Ġassigned Location Ġ= Ġ_ assigned Location . as LiveData () ĊĊĠĠĠ Ġ/** ĠReturns Ġ` true ` Ġif Ġthe Ġsecurity Ġguard Ġis Ġassigned Ġa Ġlocation */ ĊĠĠĠ Ġval Ġis Assigned Location Ġ= Ġ_ assigned Location . map Ġ{ Ġit . isNotBlank () Ġ}. as LiveData () ĊĊĠĠĠ Ġfun Ġset Assigned Location ( location : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ assigned Location . value Ġ= Ġlocation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ show False Positive Ġ= ĠMutable State Flow ( false ) ĊĊĠĠĠ Ġfun ĠsetShow False Positive ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ show False Positive . value Ġ= Ġshow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġall Vi olations Ġ= Ġ_ assigned Location . flatMap Latest Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( location . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviolation Repo . get Vi olations ( location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcategor ized Vi olations Ġ= ĊĠĠĠĠĠĠĠ Ġall Vi olations . combine (_ show False Positive ) Ġ{ Ġlist Vi olations , Ġwith False Positive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with False Positive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Vi olations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Vi olations ?. filter Ġ{ Ġ! it . isFalse Positive Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. sorted By Descending Ġ{ Ġit . timestamp Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . sorted By Ġ{ Ġit . is Verified Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġminute Delay Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 _ 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠContains Ġviolations Ġof Ġthe Ġassigned Ġlocation . ĠVi olation Ġis Ġnull Ġmeans Ġthat Ġthe Ġsecurity Ġguard ĊĠĠĠĠ Ġ* Ġis Ġnot Ġassigned Ġto Ġany Ġlocation . ĠEmpty Ġlist Ġmeans Ġthat Ġthere Ġis Ġno Ġviolation . Ġ*/ ĊĠĠĠ Ġval Ġviolations Ġ= Ġcategor ized Vi olations . combine ( minute Delay ) Ġ{ Ġlist , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġlist ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Ġ= ĠDate Utils . get Relative TimeSpan String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . adjusted Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate (). time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate Utils . MINUTE _ IN _ M ILL IS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVi olation ListItem ( it , Ġspan . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Image ( violation : ĠVi olation , Ġimage : ĠImageView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġviolation Repo . load Violation Image ( view Ġ= Ġimage , Ġviolation Ġ= Ġviolation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Violation ( violation : ĠVi olation , Ġis True : ĠBoolean , Ġuid : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviolation Repo . verify Violation ( violation , Ġis True , Ġuid ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ