package Ġcom . we il iz an . k its un eb i . ui . proxy log Ċ Ċ import Ġcom . we il iz an . k its un eb i . R Ċ import Ġcom . we il iz an . k its un eb i . common . human Readable Byte Count Ċ import Ġcom . we il iz an . k its un eb i . storage . Proxy Log Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . paging . Paged ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ class ĠProxy Log Adapter ( val Ġcontext : ĠContext ) Ġ: ĠP aged ListAdapter < Proxy Log , ĠProxy Log Adapter . Proxy Log ViewHolder >( Proxy Log Diff Callback ()) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( log Holder : ĠProxy Log ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlog Ġ= ĠgetItem ( position ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Holder . clear () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Holder . bind ( log ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠProxy Log ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProxy Log ViewHolder ( LayoutInflater . from ( context ). inflate ( R . layout . proxy _ log _ record , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , Ġfalse ), Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠProxy Log ViewHolder ( view : ĠView , Ġcontext : ĠContext ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġvar Ġrow 1 : ĠTextView Ġ= Ġview . findViewById ( R . id . row 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġrow 2 _ 1 : ĠTextView Ġ= Ġview . findViewById ( R . id . row 2 _ 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġrow 2 _ 2 : ĠTextView Ġ= Ġview . findViewById ( R . id . row 2 _ 2 ) ĊĠĠĠĠĠĠĠ Ġvar Ġrow 3 : ĠTextView Ġ= Ġview . findViewById ( R . id . row 3 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( proxy Log : ĠProxy Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Log . record Type ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 1 . text Ġ= Ġproxy Log . target ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTCP / UDP Ġrecords ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . text Ġ= Ġ"${ proxy Log . tag }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Log . upload Bytes Ġ!= Ġnull Ġ&& Ġproxy Log . download Bytes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġup Ġ= Ġhuman Readable Byte Count ( proxy Log . upload Bytes !!. to Long (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdown Ġ= Ġhuman Readable Byte Count ( proxy Log . download Bytes !!. to Long (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . text Ġ= Ġ"${ up } âĨ ĳ , Ġ${ down } âĨ ĵ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Log . download Bytes !!. toInt () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Accent )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Default Text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= Ġjava . text . SimpleDateFormat (" HH : mm : ss ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġjava . util . Date ( proxy Log . startTime !! Ġ/ Ġ 1 0 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġjava . util . Date ( proxy Log . endTime !! Ġ/ Ġ 1 0 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 3 . text Ġ= Ġ"${ sdf . format ( start )}, Ġ${ sdf . format ( end )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDNS Ġrecords ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Log . tag Ġ== Ġnull Ġ|| Ġproxy Log . tag !!. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . text Ġ= Ġ" inherited " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . text Ġ= Ġ"${ proxy Log . tag }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Log . dns Query Type ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġ( proxy Log . endTime !! Ġ- Ġproxy Log . startTime !! ) Ġ/ Ġ 1 0 0 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġduration Repr : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ>= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Repr Ġ= Ġ"${ duration Ġ/ Ġ 1 0 0 0 } s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Repr Ġ= Ġ"${ duration } ms " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . text Ġ= Ġ" A , Ġ${ duration Repr }, Ġ${ proxy Log . dns Num IPs } Ġresults " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA AAA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . text Ġ= Ġ" AAAA , Ġ${ duration Repr }, Ġ${ proxy Log . dns Num IPs } Ġresults " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA , AAAA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . text Ġ= Ġ" A , AAAA , Ġ${ duration Repr }, Ġ${ proxy Log . dns Num IPs } Ġresults " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 3 . text Ġ= Ġ"${ proxy Log . dns Request }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Log . tag ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . toLowerCase (). contains (" proxy ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Proxy Tag )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . toLowerCase (). contains (" direct ") Ġ|| Ġit . toLowerCase (). contains (" free ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Direct Tag )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . toLowerCase (). contains (" block ") Ġ|| Ġit . toLowerCase (). contains (" reject ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Block Tag )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Default Text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow 1 . text Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 1 . text Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow 2 _ 2 . text Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow 3 . text Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }