package Ġcom . ang gray udi . storage . callback Ċ Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġcom . ang gray udi . storage . file . FileSize Ċ import Ġcom . ang gray udi . storage . media . Media File Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Del icate Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 0 2 / 0 1 / 2 2 Ċ Ġ* Ġ@ author ĠAng gray udi ĠH Ċ Ġ*/ Ċ abstract Ġclass ĠZip Compression Callback < T > Ġ@ Opt In ( Del icate Cor outines Api :: class ) Ċ @ Jvm Over loads Ġconstructor ( var Ġui Scope : ĠCor outine Scope Ġ= ĠGlobal Scope ) Ġ{ ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun Ġon Count ing Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġimplementation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġfiles Ġfiles Ġto Ġbe Ġcompressed . ĠCan Ġbe Ġ` List < Document File >` Ġor Ġ` List < Media File >` ĊĠĠĠĠ Ġ* Ġ@ param Ġworker Thread ĠUse Ġ[ Thread . interrupt ] Ġto Ġcancel Ġthe Ġoperation ĊĠĠĠĠ Ġ* Ġ@ return ĠTime Ġinterval Ġto Ġwatch Ġthe Ġprogress Ġin Ġmilliseconds , Ġotherwise Ġ` 0 ` Ġif Ġyou Ġdon 't Ġwant Ġto Ġwatch Ġat Ġall . ĊĠĠĠĠ Ġ* ĠSetting Ġnegative Ġvalue Ġwill Ġcancel Ġthe Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun ĠonStart ( files : ĠList < T >, Ġworker Thread : ĠThread ): ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġ` free Space ` Ġand Ġ` file Size `, Ġthen Ġyou Ġdecide Ġwhether Ġthe Ġprocess Ġwill Ġbe Ġcontinued Ġor Ġnot . ĊĠĠĠĠ Ġ* ĠYou Ġcan Ġgive Ġspace Ġt oler ant Ġhere , Ġe . g . Ġ 1 0 0 MB . ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġnot Ġbe Ġtriggered Ġwhen Ġcompress ing Ġ[ Media File ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfree Space Ġof Ġtarget Ġpath ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġto Ġcontinue Ġprocess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġopen Ġfun Ġon Check Free Space ( free Space : ĠLong , ĠfileSize : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠfileSize Ġ+ Ġ 1 0 0 Ġ* ĠFile Size . MB Ġ< Ġfree Space Ġ// ĠGive Ġt oler ant Ġ 1 0 0 MB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun Ġon Report ( report : ĠReport ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġimplementation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun ĠonDelete Entry Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġimplementation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġcompression Rate Ġsize Ġreduction Ġin Ġpercent , Ġe . g . Ġ 2 3 . 5 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun Ġon Completed ( zip File : ĠDocument File , Ġbytes Compressed : ĠLong , Ġtotal Files Compressed : ĠInt , Ġcompression Rate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġimplementation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġopen Ġfun Ġon Failed ( errorCode : ĠErrorCode , Ġmessage : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġimplementation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġprogress Ġalways Ġ` 0 ` Ġwhen Ġcompress ing Ġ[ Media File ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠReport ( val Ġprogress : ĠFloat , Ġval Ġbytes Compressed : ĠLong , Ġval Ġwrite Speed : ĠInt , Ġval Ġfile Count : ĠInt ) ĊĊĠĠĠ Ġenum Ġclass ĠErrorCode Ġ{ ĊĠĠĠĠĠĠĠ ĠSTORAGE _ PERMISSION _ DEN IED , ĊĠĠĠĠĠĠĠ ĠCAN NOT _ CREATE _ FILE _ IN _ TARGET , ĊĠĠĠĠĠĠĠ ĠMIS SING _ ENTRY _ FILE , ĊĠĠĠĠĠĠĠ ĠD UP LIC ATE _ ENTRY _ FILE , ĊĠĠĠĠĠĠĠ ĠUNKNOWN _ IO _ ERROR , ĊĠĠĠĠĠĠĠ ĠC ANCE LED , ĊĠĠĠĠĠĠĠ ĠNO _ SPACE _ LEFT _ ON _ TARGET _ PATH ĊĠĠĠ Ġ} Ċ }