package Ġex po . modules . updates . db . dao Ċ Ċ import Ġandroidx . room .* Ċ import Ġex po . modules . updates . db . entity . Asset Entity Ċ import Ġex po . modules . updates . db . entity . Update Asset Entity Ċ import Ġex po . modules . updates . db . entity . Update Entity Ċ import Ġjava . util .* Ċ Ċ @ Dao Ċ abstract Ġclass ĠAsset Dao Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* Ġfor Ġprivate Ġuse Ġonly ĊĠĠ Ġ* Ġmust Ġbe Ġmarked Ġpublic Ġfor ĠRoom ĊĠĠ Ġ* Ġso Ġwe Ġuse Ġthe Ġunderscore Ġto Ġdis cour age Ġuse ĊĠĠ Ġ*/ ĊĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠ Ġabstract Ġfun Ġ_ insert Asset ( asset : ĠAsset Entity ): ĠLong ĊĊĠ Ġ@ Insert ( on Conflict Ġ= ĠOn Conflict Strategy . REPLACE ) ĊĠ Ġabstract Ġfun Ġ_ insert Update Asset ( update Asset : ĠUpdate Asset Entity ) ĊĊĠ Ġ@ Query (" UPDATE Ġupdates ĠSET Ġlaunch _ asset _ id Ġ= Ġ: asset Id ĠWHERE Ġid Ġ= Ġ: update Id ; ") ĊĠ Ġabstract Ġfun Ġ_ set Update Launch Asset ( asset Id : ĠLong , Ġupdate Id : ĠUUID ) ĊĊĠ Ġ@ Query (" UPDATE Ġassets ĠSET Ġmarked _ for _ deletion Ġ= Ġ 1 ; ") ĊĠ Ġabstract Ġfun Ġ_ mark All Assets For Deletion () ĊĊĠ Ġ@ Query ( ĊĠĠĠ Ġ" UPDATE Ġassets ĠSET Ġmarked _ for _ deletion Ġ= Ġ 0 ĠWHERE Ġid ĠIN Ġ(" Ġ+ ĊĠĠĠĠĠ Ġ" ĠSELECT Ġasset _ id " Ġ+ ĊĠĠĠĠĠ Ġ" ĠFROM Ġupdates _ assets " Ġ+ ĊĠĠĠĠĠ Ġ" ĠINNER ĠJOIN Ġupdates ĠON Ġupdates _ assets . update _ id Ġ= Ġupdates . id " Ġ+ ĊĠĠĠĠĠ Ġ" ĠWHERE Ġupdates . keep );" ĊĠ Ġ) ĊĠ Ġabstract Ġfun Ġ_ un mark Used Assets From Deletion () ĊĊĠ Ġ@ Query ( ĊĠĠĠ Ġ" UPDATE Ġassets ĠSET Ġmarked _ for _ deletion Ġ= Ġ 0 ĠWHERE Ġrelative _ path ĠIN Ġ(" Ġ+ ĊĠĠĠĠĠ Ġ" ĠSELECT Ġrelative _ path " Ġ+ ĊĠĠĠĠĠ Ġ" ĠFROM Ġassets " Ġ+ ĊĠĠĠĠĠ Ġ" ĠWHERE Ġmarked _ for _ deletion Ġ= Ġ 0 );" ĊĠ Ġ) ĊĠ Ġabstract Ġfun Ġ_ un mark Duplicate Used Assets From Deletion () ĊĊĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġassets ĠWHERE Ġmarked _ for _ deletion Ġ= Ġ 1 ; ") ĊĠ Ġabstract Ġfun Ġ_ load Assets Marked For Deletion (): ĠList < Asset Entity > ĊĊĠ Ġ@ Query (" DELETE ĠFROM Ġassets ĠWHERE Ġmarked _ for _ deletion Ġ= Ġ 1 ; ") ĊĠ Ġabstract Ġfun Ġ_ delete Assets Marked For Deletion () ĊĊĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġassets ĠWHERE Ġ` key ` Ġ= Ġ: key ĠLIMIT Ġ 1 ; ") ĊĠ Ġabstract Ġfun Ġ_ load Asset With Key ( key : ĠString ?): ĠList < Asset Entity > ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġfor Ġpublic Ġuse ĊĠĠ Ġ*/ ĊĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġassets ; ") ĊĠ Ġabstract Ġfun Ġload All Assets (): ĠList < Asset Entity > ĊĊĠ Ġ@ Query ( ĊĠĠĠ Ġ" SELECT Ġassets .* " Ġ+ ĊĠĠĠĠĠ Ġ" ĠFROM Ġassets " Ġ+ ĊĠĠĠĠĠ Ġ" ĠINNER ĠJOIN Ġupdates _ assets ĠON Ġupdates _ assets . asset _ id Ġ= Ġassets . id " Ġ+ ĊĠĠĠĠĠ Ġ" ĠINNER ĠJOIN Ġupdates ĠON Ġupdates _ assets . update _ id Ġ= Ġupdates . id " Ġ+ ĊĠĠĠĠĠ Ġ" ĠWHERE Ġupdates . id Ġ= Ġ: id ;" ĊĠ Ġ) ĊĠ Ġabstract Ġfun Ġload Assets For Update ( id : ĠUUID ): ĠList < Asset Entity > ĊĊĠ Ġ@ Update ĊĠ Ġabstract Ġfun Ġupdate Asset ( asset Entity : ĠAsset Entity ) ĊĊĠ Ġ@ Transaction ĊĠ Ġopen Ġfun Ġinsert Assets ( assets : ĠList < Asset Entity >, Ġupdate : ĠUpdate Entity ) Ġ{ ĊĠĠĠ Ġfor Ġ( asset Ġin Ġassets ) Ġ{ ĊĠĠĠĠĠ Ġval Ġasset Id Ġ= Ġ_ insert Asset ( asset ) ĊĠĠĠĠĠ Ġ_ insert Update Asset ( Update Asset Entity ( update . id , Ġasset Id )) ĊĠĠĠĠĠ Ġif Ġ( asset . is Launch Asset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ set Update Launch Asset ( asset Id , Ġupdate . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġload Asset With Key ( key : ĠString ?): ĠAsset Entity ? Ġ{ ĊĠĠĠ Ġval Ġassets Ġ= Ġ_ load Asset With Key ( key ) ĊĠĠĠ Ġreturn Ġif Ġ( assets . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġassets [ 0 ] ĊĠĠĠ Ġ} Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġfun Ġmerge AndUpdate Asset ( existing Entity : ĠAsset Entity , Ġnew Entity : ĠAsset Entity ) Ġ{ ĊĠĠĠ Ġ// Ġif Ġthe Ġexisting Ġentry Ġcame Ġfrom Ġan Ġembedded Ġmanifest , Ġit Ġmay Ġnot Ġhave Ġa ĠURL Ġin Ġthe Ġdatabase ĊĠĠĠ Ġif Ġ( new Entity . url Ġ!= Ġnull Ġ&& Ġexisting Entity . url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġexisting Entity . url Ġ= Ġnew Entity . url ĊĠĠĠĠĠ Ġupdate Asset ( existing Entity ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġwe Ġneed Ġto Ġkeep Ġtrack Ġof Ġwhether Ġthe Ġcalling Ġclass Ġexpects Ġthis Ġasset Ġto Ġbe Ġthe Ġlaunch Ġasset ĊĠĠĠ Ġexisting Entity . is Launch Asset Ġ= Ġnew Entity . is Launch Asset ĊĠ Ġ} ĊĊĠ Ġ@ Transaction ĊĠ Ġopen Ġfun Ġadd Existing Asset ToUpdate ( ĊĠĠĠ Ġupdate : ĠUpdate Entity , ĊĠĠĠ Ġasset : ĠAsset Entity , ĊĠĠĠ Ġis Launch Asset : ĠBoolean ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġexisting Asset Entry Ġ= Ġload Asset With Key ( asset . key ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġasset Id Ġ= Ġexisting Asset Entry . id ĊĠĠĠ Ġ_ insert Update Asset ( Update Asset Entity ( update . id , Ġasset Id )) ĊĠĠĠ Ġif Ġ( is Launch Asset ) Ġ{ ĊĠĠĠĠĠ Ġ_ set Update Launch Asset ( asset Id , Ġupdate . id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġ@ Transaction ĊĠ Ġopen Ġfun Ġdelete Unused Assets (): ĠList < Asset Entity > Ġ{ ĊĠĠĠ Ġ// Ġthe Ġsimplest Ġway Ġto Ġmark Ġthe Ġassets Ġwe Ġwant Ġto Ġdelete ĊĠĠĠ Ġ// Ġis Ġto Ġmark Ġall Ġassets Ġfor Ġdeletion , Ġthen Ġgo Ġback Ġand Ġun mark ĊĠĠĠ Ġ// Ġthose Ġassets Ġin Ġupdates Ġwe Ġwant Ġto Ġkeep ĊĠĠĠ Ġ// Ġthis Ġis Ġsafe Ġsince Ġthis Ġis Ġa Ġtransaction Ġand Ġwill Ġbe Ġrolled Ġback Ġupon Ġfailure ĊĠĠĠ Ġ_ mark All Assets For Deletion () ĊĠĠĠ Ġ_ un mark Used Assets From Deletion () ĊĠĠĠ Ġ// Ġcheck Ġfor Ġduplicate Ġrows Ġrepresenting Ġa Ġsingle Ġfile Ġon Ġdisk ĊĠĠĠ Ġ_ un mark Duplicate Used Assets From Deletion () ĊĠĠĠ Ġval Ġdeleted Assets Ġ= Ġ_ load Assets Marked For Deletion () ĊĠĠĠ Ġ_ delete Assets Marked For Deletion () ĊĠĠĠ Ġreturn Ġdeleted Assets ĊĠ Ġ} Ċ } Ċ