Ċ package Ġcom . dan . merge photos Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġkotlin . reflect . K Mutable Property Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . full . create Type Ċ import Ġkotlin . reflect . full . declared Member Properties Ċ Ċ /** Ċ Settings : Ġall Ġpublic Ġvar Ġfields Ġwill Ġbe Ġsaved Ċ Ġ*/ Ċ class ĠSettings ( Ġprivate Ġval Ġactivity : ĠActivity ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSAVE _ FOLDER Ġ= Ġ"/ storage / em ulated / 0 / P ictures / Merge Photos " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠI MG _ SIZE _ SMALL Ġ= Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ NAME Ġ= Ġ" output " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEXT _ JPEG Ġ= Ġ" jpeg " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEXT _ PNG Ġ= Ġ" png " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEXT _ TI FF Ġ= Ġ" tiff " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMER GE _ PAN OR AMA Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMER GE _ LONG _ EX POS URE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMER GE _ HDR Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMER GE _ ALIGN Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLONG _ EX POS URE _ A VER AGE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLONG _ EX POS URE _ NE ARE ST _ TO _ A VER AGE Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠOUTPUT _ TYPE _ JPEG Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠOUTPUT _ TYPE _ PNG Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠOUTPUT _ TYPE _ TI FF Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEP TH _ AUTO Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEP TH _ 8 _ BITS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEP TH _ 1 6 _ BITS Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmerge Mode : ĠInt Ġ= ĠMER GE _ PAN OR AMA ĊĠĠĠ Ġvar Ġpan orama Projection : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġlon gex posure Algorithm : ĠInt Ġ= ĠLONG _ EX POS URE _ A VER AGE ĊĠĠĠ Ġvar Ġoutput Type Ġ= ĠOUTPUT _ TYPE _ PNG ĊĠĠĠ Ġvar Ġj peg Quality Ġ= Ġ 9 5 ĊĠĠĠ Ġvar Ġpng Depth Ġ= ĠDEP TH _ AUTO ĊĠĠĠ Ġvar Ġt iff Depth Ġ= ĠDEP TH _ AUTO ĊĠĠĠ Ġvar Ġengine Depth Ġ= ĠDEP TH _ AUTO ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload Properties () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠforEach Setting Property ( Ġlistener : Ġ( K Mutable Property < *> )-> Unit Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( Ġmember Ġin Ġthis :: class . declared Member Properties Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member . visibility Ġ== ĠK Visibility . PUBLIC Ġ&& Ġmember Ġis ĠK Mutable Property <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Properties () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= Ġactivity . get Preferences ( Context . MODE _ PRIVATE ) ĊĊĠĠĠĠĠĠĠ ĠforEach Setting Property Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( Ġproperty . returnType Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . create Type () Ġ-> Ġproperty . setter . call ( Ġthis , Ġpreferences . getBoolean ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠBoolean Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . create Type () Ġ-> Ġproperty . setter . call ( Ġthis , Ġpreferences . getInt ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠInt Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class . create Type () Ġ-> Ġproperty . setter . call ( Ġthis , Ġpreferences . getLong ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠLong Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class . create Type () Ġ-> Ġproperty . setter . call ( Ġthis , Ġpreferences . get Float ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠFloat Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . create Type () Ġ-> Ġproperty . setter . call ( Ġthis , Ġpreferences . getString ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠString Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Properties () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= Ġactivity . get Preferences ( Context . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġpreferences . edit () ĊĊĠĠĠĠĠĠĠ ĠforEach Setting Property Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( Ġproperty . returnType Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . create Type () Ġ-> Ġeditor . put Boolean ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠBoolean Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . create Type () Ġ-> Ġeditor . put Int ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠInt Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class . create Type () Ġ-> Ġeditor . put Long ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠLong Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class . create Type () Ġ-> Ġeditor . put Float ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠFloat Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . create Type () Ġ-> Ġeditor . putString ( Ġproperty . name , Ġproperty . getter . call ( this ) Ġas ĠString Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoutput Extension () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( output Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOUTPUT _ TYPE _ PNG Ġ-> ĠEXT _ PNG ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOUTPUT _ TYPE _ TI FF Ġ-> ĠEXT _ TI FF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠEXT _ JPEG ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ