package Ġcom . ky hs ge ek code . file cho oser Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . ky hs ge ek code . dis assembler . Progress Handler Ċ import Ġcom . ky hs ge ek code . dis assembler . databinding . Activity New FileChooser Binding Ċ import Ġcom . ky hs ge ek code . dis assembler . show Yes No Dialog Ċ import Ġcom . ky hs ge ek code . download Ċ import Ġcom . ky hs ge ek code . file cho oser . model . File Item Ċ import Ġcom . ting y ik 9 0 . sn ack progressbar . Sn ack ProgressBar Ċ import Ġcom . ting y ik 9 0 . sn ack progressbar . Sn ack ProgressBar Manager Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . js oup . J soup Ċ import Ġsplit ties . init . app Ctx Ċ import Ġjava . net . URL ĊĊ Ċ class ĠNew FileChooser Activity Ġ: ĠAppCompatActivity (), ĠProgress Handler Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠActivity New FileChooser Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġprivate Ġval Ġsn ack ProgressBar Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ack ProgressBar Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . file Chooser Main Layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcircular Type Ġ= ĠSn ack ProgressBar ( Sn ack ProgressBar . TYPE _ HORIZONTAL , Ġ" Loading ...") ĊĠĠĠĠĠĠĠ Ġ. set IsIn determinate ( false ) ĊĠĠĠĠĠĠĠ Ġ. set Allow User Input ( false ) ĊĠĠĠ Ġprivate Ġval Ġin determinate Ġ= ĠSn ack ProgressBar ( Sn ack ProgressBar . TYPE _ C IRC ULAR , Ġ" Loading ...") ĊĠĠĠĠĠĠĠ Ġ. set IsIn determinate ( true ) ĊĠĠĠĠĠĠĠ Ġ. set Allow User Input ( false ) ĊĠĠĠ Ġlateinit Ġvar Ġadapter : ĠNew FileChooser Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlinear LayoutManager : ĠLinearLayoutManager ĊĠĠĠ Ġval ĠTAG Ġ= Ġ" New FileChooser A " ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" onCreate ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠActivity New FileChooser Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠNew FileChooser Adapter ( this ) ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . try Add Root Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . layout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen As Project ( item : ĠFile Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" file Item ", Ġitem ) ĊĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" open Project ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġresult Intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Raw ( item : ĠFile Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" file Item ", Ġitem ) ĊĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" open Project ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġresult Intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter . on Back Pressed Should Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpublish Progress ( current : ĠInt , Ġtotal : ĠInt ?, Ġmessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsn ack ProgressBar Manager . set Progress ( current ) ĊĠĠĠĠĠĠĠ Ġif Ġ( total Ġ!= Ġnull Ġ|| Ġmessage Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircular Type . set Progress Max ( total ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircular Type . setMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sn ack ProgressBar Manager . getLast Shown () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ack ProgressBar Manager . show ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircular Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ack ProgressBar Manager . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ack ProgressBar Manager . update To ( circular Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġsn ack ProgressBar Manager . show ( in determinate , ĠSn ack ProgressBar Manager . LENGTH _ IN DEFIN ITE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinish Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġsn ack ProgressBar Manager . dismiss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Other Chooser () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ"* /* " ĊĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠIntent . ACTION _ GET _ CONTENT ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( Intent . create Chooser ( intent , Ġ" Choose ĠContent "), Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġ 1 Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Uri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Intent Ġ= ĠIntent () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" file Item ", ĠFile Item ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" selected uri :${ data . data }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" intent ĠURI ", Ġintent . to Uri ( 0 )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= Ġdata . extras ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bundle Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġbundle . keySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġkey Ġ+ Ġ" Ġ: Ġ" Ġ+ Ġif Ġ( bundle [ key ] Ġ!= Ġnull ) Ġbundle [ key ] Ġelse Ġ" NULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Bundle Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" uri ", Ġselected Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" extras ", Ġdata . extras ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" open Project ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġresult Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Z oo () Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Download Ġa Ġsample Ġfrom Ġthe Ġz oo Ġand Ġopen Ġit Ġwith Ġthis Ġapp ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// github . com / yt is f / the Z oo / tree / master / mal wares " ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠ Ġi . data Ġ= ĠUri . parse ( url ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( i ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Hash Site ( hash : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Yes No Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" D anger Ġalert ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġfile Ġyou Ġare Ġtrying Ġto Ġdownload Ġmay Ġharm Ġyour Ġdevice . ĠPro ceed ?", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdlg , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// info sec . cert - pa . it / analyze /$ hash . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . data Ġ= ĠUri . parse ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Downloading ...", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠJ soup . parse ( URL ( url ), Ġ 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip addr Ġ= Ġdocument ?. select ("[ rel = nofollow ]") ?. first ()?. text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" ip addr =$ ip addr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Addr Ġ= Ġip addr ?. replace (" h XX p ", Ġ" http ") Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Real Addr :$ real Addr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget File Ġ= Ġapp Ctx . files Dir . resolve (" mal ware Samples ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload ( real Addr , Ġtarget File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ New FileChooser Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Download Ġsuccess ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Intent . putExtra (" mal ware File ", Ġtarget File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġresult Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġdownloading Ġfrom Ġ$ url ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ New FileChooser Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Download Ġfailed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ