/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠSm ash ĠK s ĠOpen ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġsm ash . ks . com . on esh oot . widgets . customize . camera . module Ċ Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . support . v 4 . util . Sparse Array Compat Ċ import Ġkotlinx . android . parcel . Parcel ize Ċ import Ġjava . lang . Integer . SIZE Ċ Ċ /** Ċ Ġ* ĠImmutable Ġclass Ġfor Ġdescribing Ġpro portional Ġrelationship Ġbetween Ġwidth Ġand Ġheight . Ċ Ġ*/ Ċ @ Parcel ize Ċ class ĠAs pect Ratio Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġx : ĠInt , ĊĠĠĠ Ġval Ġy : ĠInt Ċ ) Ġ: ĠComparable < AspectRatio >, ĠParcel able Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcache Ġby Ġlazy Ġ{ ĠSparse Array Compat < Sparse Array Compat < AspectRatio >>( 1 6 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġan Ġinstance Ġof Ġ[ AspectRatio ] Ġspecified Ġby Ġ` x ` Ġand Ġ` y ` Ġvalues . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġvalues Ġ` x ` Ġand Ġ`` Ġwill Ġbe Ġreduced Ġby Ġtheir Ġgreatest Ġcommon Ġdivider . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġx ĠThe Ġwidth ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġy ĠThe Ġheight ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠAn Ġinstance Ġof Ġ[ AspectRatio ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġof ( x : ĠInt , Ġy : ĠInt ): ĠAs pect Ratio Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġw Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgcd Ġ= Ġgcd ( w , Ġh ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġw Ġ/= Ġgcd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Ġ/= Ġgcd ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarray X Ġ= Ġcache . get ( x ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġarray X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratio Ġ= ĠAs pect Ratio ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray X Ġ= ĠSparse Array Compat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray X . put ( y , Ġratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( x , Ġarray X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġratio Ġ= Ġarray X . get ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= ĠAs pect Ratio ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray X . put ( y , Ġratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠParse Ġan Ġ[ AspectRatio ] Ġfrom Ġa Ġ[ String ] Ġformatted Ġlike Ġ" 4 : 3 ". ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġs ĠThe Ġstring Ġrepresentation Ġof Ġthe Ġaspect Ġratio ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġaspect Ġratio ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġwhen Ġthe Ġformat Ġis Ġincorrect . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( s : ĠString ): ĠAs pect Ratio Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġs . indexOf (': ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ- 1 ) Ġthrow ĠIllegalArgumentException (" Malformed Ġaspect Ġratio : Ġ$ s ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġs . substring ( 0 , Ġposition ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġs . substring ( position Ġ+ Ġ 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġof ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Malformed Ġaspect Ġratio : Ġ$ s ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgcd ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa Tmp Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġb Tmp Ġ= Ġb ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( b Tmp Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġb Tmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Tmp Ġ= Ġa Tmp Ġ% Ġb Tmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Tmp Ġ= Ġc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa Tmp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ== Ġother Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġthis Ġ=== Ġother Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġother Ġis ĠAs pect Ratio Ġ-> Ġother . x Ġ== Ġx Ġ&& Ġother . y Ġ== Ġy ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ x Ġ: Ġ$ y " ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġassuming Ġmost Ġsizes Ġare Ġ< 2 ^ 1 6 , Ġdoing Ġa Ġrotate Ġwill Ġgive Ġus Ġperfect Ġhashing ĊĠĠĠĠĠĠĠ Ġreturn Ġy Ġxor Ġ( x Ġshl ĠSIZE Ġ/ Ġ 2 Ġor Ġx . ush r ( SIZE Ġ/ Ġ 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠAs pect Ratio ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġequals ( other ) Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠ 0 Ġ< Ġto Float () Ġ- Ġother . toFloat () Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġinverse Ġof Ġthis Ġ[ AspectRatio ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinverse () Ġ= Ġof ( y , Ġx ) ĊĊĠĠĠ Ġfun Ġto Float () Ġ= Ġx . toFloat () Ġ/ Ġy ĊĊĠĠĠ Ġfun Ġmatches ( size : ĠSize ) Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgcd Ġ= Ġgcd ( size . width , Ġsize . height ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġsize . width Ġ/ Ġgcd ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġsize . height Ġ/ Ġgcd ĊĊĠĠĠĠĠĠĠ Ġx Ġ== Ġthis . x Ġ&& Ġy Ġ== Ġthis . y ĊĠĠĠ Ġ} Ċ } Ċ