package Ġorg . vide ol an . resources . util Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . vide ol an . med iali brary . interfaces . Med iali brary Ċ import Ġorg . vide ol an . resources .* Ċ import Ġorg . vide ol an . tools .* Ċ import Ġjava . io . File Ċ import Ġkotlin . coroutines . resume ĊĊ Ċ @ Experimental Cor outines Api Ċ suspend Ġinline Ġfun Ġ< re ified ĠT > ĠContext . get From Ml ( cross inline Ġblock : ĠMed iali brary . () Ġ-> ĠT ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠ Ġval Ġml Ġ= ĠMed iali brary . getInstance () ĊĠĠĠ Ġif Ġ( ml . is Started ) Ġblock . invoke ( ml ) ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscan Ġ= ĠSettings . getInstance ( this @ get From Ml ). getInt ( KEY _ MEDI AL IB R ARY _ SCAN , ĠML _ SCAN _ ON ) Ġ== ĠML _ SCAN _ ON ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠMed iali brary . On Med iali brary Ready Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Med iali brary Ready () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! continu ation . is Completed ) Ġlaunch ( start Ġ= ĠCor outine Start . UN DISPATCH ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( block . invoke ( ml )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġml . remove On Med iali brary Ready Listener ( cb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Med iali brary Idle () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ Ġml . remove On Med iali brary Ready Listener ( listener ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġml . add On Med iali brary Ready Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Med iali brary ( false , Ġfalse , Ġscan ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠContext . start Med iali brary ( first Run : ĠBoolean Ġ= Ġfalse , Ġupgrade : ĠBoolean Ġ= Ġfalse , Ġparse : ĠBoolean Ġ= Ġtrue , Ġremove Devices : Boolean Ġ= Ġfalse , Ġcoroutine Context Provider : ĠCor outine Context Provider Ġ= ĠCor outine Context Provider ()) Ġ= ĠApp Scope . launch Ġ{ ĊĠĠĠ Ġif Ġ( Med iali brary . getInstance (). is Started Ġ|| Ġ! can Read Storage ( this @ start Med iali brary )) Ġreturn @ launch ĊĠĠĠ Ġval Ġprefs Ġ= Ġwith Context ( coroutine Context Provider . IO ) Ġ{ ĠSettings . getInstance ( this @ start Med iali brary ) Ġ} ĊĠĠĠ Ġval Ġscan Opt Ġ= Ġif Ġ( Settings . show Tv Ui ) ĠML _ SCAN _ ON Ġelse Ġprefs . getInt ( KEY _ MEDI AL IB R ARY _ SCAN , Ġ- 1 ) ĊĠĠĠ Ġif Ġ( parse Ġ&& Ġscan Opt Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( db Exists ( coroutine Context Provider )) Ġprefs . put Single ( KEY _ MEDI AL IB R ARY _ SCAN , ĠML _ SCAN _ ON ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ACTION _ INIT ). set ClassName ( application Context , ĠMED I AP AR SING _ SERVICE ) ĊĠĠĠ Ġlaunch Foreground ( this @ start Med iali brary , Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ FIRST _ RUN , Ġfirst Run ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ UP GR ADE , Ġupgrade ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ REMOVE _ DEVICE , Ġremove Devices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ PARSE , Ġparse Ġ&& Ġscan Opt Ġ!= ĠML _ SCAN _ OFF )) Ċ } Ċ Ċ suspend Ġfun ĠContext . db Exists ( coroutine Context Provider : ĠCor outine Context Provider Ġ= ĠCor outine Context Provider ()) Ġ= Ġwith Context ( coroutine Context Provider . IO ) Ġ{ ĊĠĠĠ ĠFile ( get Dir (" db ", ĠContext . MODE _ PRIVATE ). toString () Ġ+ ĠMed iali brary . VL C _ MEDIA _ DB _ NAME ). exists () Ċ } Ċ Ċ fun ĠContext . launch Foreground ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" foreground ", Ġtrue ) ĊĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( context , Ġintent ) ĊĠĠĠ Ġ} Ċ }