package Ġcom . private gallery . ak sc orp . private gallery android . Utilities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Comparator Ċ import Ġjava . util . Random Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠA ks Cor p Ġon Ġ 3 0 . 0 3 . 2 0 1 8 . Ċ Ġ* Ġak sc orp 2 0 1 4 @ gmail . com Ċ Ġ* Ġweb Ġsite Ġa ks en ov - vl ad im ir . herokuapp . com Ċ Ġ*/ Ċ Ċ fun Ġ< T > ĠMutable LiveData < Mutable List < T >> . add ( obj : ĠT ) Ġ{ ĊĠĠĠ Ġthis . value ?. add ( obj ) ĊĠĠĠ Ġthis . post Value ( value ) Ċ } Ċ Ċ class ĠUtilities () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Files From Folder ( path : ĠString ): ĠMutable List < File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist File : ĠList < File > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist File Ġ= Ġfile . list Files (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . sort ( list File , ĠSort Folder ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠSort Folder Ġ: ĠComparator < File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( f 1 : ĠFile , Ġf 2 : ĠFile ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( f 1 . isDirectory Ġ== Ġf 2 . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( f 1 . isDirectory Ġ&& Ġ! f 2 . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmove File ( context : ĠContext , Ġinput Path : ĠUri , Ġoutput Path : ĠString , ĠfileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġoutput Ġdirectory Ġif Ġit Ġdoesn 't Ġexist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( output Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( input Path ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ("$ output Path /$ fileName "). use Ġ{ Ġout Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(( read ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= ĠinputStream !!. read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Stream . write ( buffer , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Stream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġthe Ġoriginal Ġfile ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf delete Ġ= ĠFile ( get Real Path From URI ( context , Ġinput Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f delete . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f delete . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println (" file ĠDeleted Ġ:" Ġ+ Ġinput Path . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println (" file Ġnot ĠDeleted Ġ:" Ġ+ Ġinput Path . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag ", Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( fn fe 1 : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġfn fe 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag ", Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite Bitmap ( output Path : ĠString , Ġbitmap : ĠBitmap , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġoutput Ġdirectory Ġif Ġit Ġdoesn 't Ġexist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( output Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( output Path Ġ+ Ġname ). use ({ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout ) Ġ// Ġbmp Ġis Ġyour ĠBitmap Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Real Path From URI ( context : ĠContext , Ġcontent URI : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( content URI , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcontent URI . path Ġ?: Ġthrow ĠFileNotFoundException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġcursor . getColumnIndex ( Media Store . Images . Image Columns . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcursor . getString ( idx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetRandom String ( length : ĠInt , Ġmax Symbol Num : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstring Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Ġ+= Ġ( random . nextInt () Ġ% Ġmax Symbol Num ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstring ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnotify When Measured ( view : ĠView , Ġlistener : ĠView Tree Observer . On Global Layout Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv to Ġ= Ġview . view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv to . add On Global Layout Listener ( object Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Obsolete Sdk Int ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Global Layout () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeed Ġto Ġget Ġa Ġfresh ĠView Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfresh V to Ġ= Ġview . view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDeprecated Ġbecause Ġit Ġwas Ġinconsistent ly Ġnamed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfresh V to . remove Global On Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfresh V to . remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġ- Ġactivity Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpx Ġ- Ġpixel Ġvalue Ġfor Ġconversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpixels To Sp ( context : ĠContext , Ġpx : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscaled Density Ġ= Ġcontext . resources . display Metrics . scaled Density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpx Ġ/ Ġscaled Density ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġ- Ġactivity Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġsp Value Ġ- Ġsp Ġvalue Ġfor Ġconversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġsp To Pixel ( context : ĠContext , Ġsp Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Scale Ġ= Ġcontext . resources . display Metrics . scaled Density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( sp Value Ġ* Ġfont Scale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġ- Ġactivity Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpx Value Ġ- Ġpixel Ġvalue Ġfor Ġconversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpixel To Dp ( context : ĠContext , Ġpx Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( px Value Ġ/ Ġscale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġ- Ġactivity Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdip Value Ġ- Ġdp Ġvalue Ġfor Ġconversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdp To Pixel ( context : ĠContext , Ġdip Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( dip Value Ġ* Ġscale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġobject ĠHash Utils Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsha 5 1 2 ( input : ĠString ) Ġ= Ġhash String (" SHA - 5 1 2 ", Ġinput ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġsha 2 5 6 ( input : ĠString ) Ġ= Ġhash String (" SHA - 2 5 6 ", Ġinput ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġsha 1 ( input : ĠString ) Ġ= Ġhash String (" SHA - 1 ", Ġinput ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSupported Ġalgorithms Ġon ĠAndroid : ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠAlgorithm ĉ Supported ĠAPI ĠLevel s ĊĠĠĠĠĠĠĠĠ Ġ* ĠMD 5 ĠĠĠĠĠĠĠĠĠĠ 1 + ĊĠĠĠĠĠĠĠĠ Ġ* ĠSHA - 1 ĉĠĠĠĠ 1 + ĊĠĠĠĠĠĠĠĠ Ġ* ĠSHA - 2 2 4 ĉĠĠĠĠ 1 - 8 , 2 2 + ĊĠĠĠĠĠĠĠĠ Ġ* ĠSHA - 2 5 6 ĉĠĠĠĠ 1 + ĊĠĠĠĠĠĠĠĠ Ġ* ĠSHA - 3 8 4 ĉĠĠĠĠ 1 + ĊĠĠĠĠĠĠĠĠ Ġ* ĠSHA - 5 1 2 ĉĠĠĠĠ 1 + ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhash String ( type : ĠString , Ġinput : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠHEX _ CHARS Ġ= Ġ" 0 1 2 3 4 5 6 7 8 9 ABCDEF " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠMessage Digest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. digest ( input . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder ( bytes . size Ġ* Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġit . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( HEX _ CHARS [ i Ġshr Ġ 4 Ġand Ġ 0 x 0 f ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( HEX _ CHARS [ i Ġand Ġ 0 x 0 f ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate In Sample Size ( real Width : ĠInt , Ġreal Height : ĠInt , Ġreq Width : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġin Sample Size Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( real Height Ġ> Ġreq Height Ġ|| Ġreal Width Ġ> Ġreq Width ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Height : ĠInt Ġ= Ġreal Height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Width : ĠInt Ġ= Ġreal Width Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( half Height Ġ/ Ġin Sample Size Ġ>= Ġreq Height Ġ&& Ġhalf Width Ġ/ Ġin Sample Size Ġ>= Ġreq Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Sample Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġin Sample Size ĊĠĠĠ Ġ} Ċ }