package Ġcom . y ves ch ion g . personal record book . ui . add person detail Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . DatePicker Dialog Ċ import Ġandroid . app . Time Picker Dialog Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . DatePicker Ċ import Ġandroid . widget . Time Picker Ċ import Ġcom . y ves ch ion g . data . storage . Internal Storage Manager Ċ import Ġcom . y ves ch ion g . personal record book . R Ċ import Ġcom . y ves ch ion g . personal record book . common . Constants Ċ import Ġcom . y ves ch ion g . personal record book . common . base . Base Fragment Ċ import Ġcom . y ves ch ion g . personal record book . common . extensions . c ropped Ċ import Ġcom . y ves ch ion g . personal record book . common . extensions . show Adding Record Progress Dialog Ċ import Ġcom . y ves ch ion g . personal record book . common . extensions . toast Ċ import Ġcom . y ves ch ion g . personal record book . common . metadata . Image Metadata Ċ import Ġcom . y ves ch ion g . personal record book . databinding . Fragment Add Person Detail Binding Ċ import Ġcom . y ves ch ion g . personal record book . entities . Person Ċ import Ġcom . y ves ch ion g . personal record book . ui . signature . Signature Activity Ċ import Ġdagger . android . support . Android Support Injection Ċ import Ġio . reactivex . Single Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠAdd Person Detail Fragment Ġ: ĠBase Fragment < Fragment Add Person Detail Binding >() Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġinternal Storage Manager : ĠInternal Storage Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠAdd Person Detail ViewModel Factory ĊĊĠĠĠ Ġlateinit Ġvar ĠviewModel : ĠAdd Person Detail ViewModel ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsignature Filename : ĠString ĊĊĠĠĠ Ġvar Ġperson : ĠPerson ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠAdd Person Detail Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAdd Person Detail Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlayout Id : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠR . layout . fragment _ add _ person _ detail ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠAndroid Support Injection . inject ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this , ĠviewModel Factory ). get ( Add Person Detail ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġbinding . vm Ġ= ĠviewModel ĊĊĠĠĠĠĠĠĠ Ġsignature Filename Ġ= Ġarguments ?. getString ( Constants . EXTRA _ SIGNATURE _ FILE _ NAME ) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Storage Manager . get Unique Filename () ĊĊĠĠĠĠĠĠĠ Ġperson Ġ= Ġarguments ?. get Parcelable ( Constants . EXTRA _ PERSON ) ĊĠĠĠĠĠĠĠ Ġperson ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . person Id Ġ= Ġit . id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . clicked StartDate . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow DatePicker ( viewModel . start DateTime stamp ) Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start DateTime stamp Ġ= Ġdate . time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . clicked StartTime . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Time Picker ( viewModel . startTime Timestamp ) Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . startTime Timestamp Ġ= Ġdate . time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . clicked EndDate . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow DatePicker ( viewModel . end DateTime stamp ) Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . end DateTime stamp Ġ= Ġdate . time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . clicked EndTime . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Time Picker ( viewModel . endTime Timestamp ) Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . endTime Timestamp Ġ= Ġdate . time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . clicked Signature . simple Subscribe Ġ{ Ġshow Signature Activity () Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandle Add Record () ĊĊĠĠĠĠĠĠĠ ĠviewModel . signature Path . observe ( this , ĠObserver < String > Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . signature Path Ġ= Ġpath ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . metadata Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Metadata ( internal Storage Manager . getLast Modified Timestamp ( path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Signature Error () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . REQUEST _ CODE _ SIGNATURE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. getString Extra ( Constants . EXTRA _ SIGNATURE _ FILE _ PATH )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . signature Path . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Storage Manager . get Absolute FilePath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . MODE _ CACHE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . TYPE _ SIGNATURE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Add Record () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . clicked Add Record . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġshow Adding Record Progress Dialog () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Signature Path : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson ?. let Ġ{ Ġperson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Signature Filename Ġ= Ġinternal Storage Manager . get Unique Filename () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrim Ġthe Ġbitmap Ġand Ġsave Ġthe Ġsignature Ġto Ġinternal Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ropped Bitmap Ġ= Ġinternal Storage Manager . load Signature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . MODE _ CACHE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Filename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). c ropped () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsaved Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped Bitmap ?. let Ġ{ Ġbitmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Ġ= Ġ! internal Storage Manager . save Signature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . MODE _ INTERNAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Signature Filename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeleted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( saved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthe Ġfile Ġfrom Ġthe Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted Ġ= Ġinternal Storage Manager . delete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Storage Manager . getImage Absolute FilePath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . MODE _ CACHE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Filename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deleted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġrelative Ġpath Ġreference Ġto Ġthe Ġnew Ġinternal Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Signature Path Ġ= Ġinternal Storage Manager . getImage Relative FilePath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Storage Manager . MODE _ INTERNAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Signature Filename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġrelative Ġsignature Ġfile Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Signature Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. simple Subscribe Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . result . simple Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. toast ( Throwable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAt Ġthis Ġpoint , Ġthe Ġperson Ġdetail Ġand Ġthe Ġlive Ġdata Ġdo Ġnot Ġhave Ġsynced ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfile Ġpaths , Ġbut Ġwe Ġdon 't Ġcare Ġsince Ġthe Ġactivity Ġwill Ġbe Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Signature FilePath ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . add Person Detail () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow DatePicker ( timestamp : ĠLong , Ġcallback : Ġ( Calendar ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġdate . time In Millis Ġ= Ġtimestamp ĊĊĠĠĠĠĠĠĠ ĠDate Picker Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !! , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate Picker Dialog . On Date Set Listener Ġ{ Ġ_: ĠDate Picker , Ġyear : ĠInt , Ġmonth : ĠInt , Ġday OfMonth : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . set ( year , Ġmonth , Ġday OfMonth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġdate . get ( Calendar . YEAR ), Ġdate . get ( Calendar . MONTH ), Ġdate . get ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Time Picker ( timestamp : ĠLong , Ġcallback : Ġ( Calendar ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġdate . time In Millis Ġ= Ġtimestamp ĊĊĠĠĠĠĠĠĠ ĠTime Picker Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !! , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Picker Dialog . On Time Set Listener Ġ{ Ġ_: ĠTime Picker , Ġhour OfDay : ĠInt , Ġminute : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . set ( Calendar . HOUR _ OF _ DAY , Ġhour OfDay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . set ( Calendar . MINUTE , Ġminute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate . get ( Calendar . HOUR _ OF _ DAY ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate . get ( Calendar . MINUTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Signature Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠSignature Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Constants . EXTRA _ PERSON , Ġperson ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Constants . EXTRA _ SIGNATURE _ FILE _ NAME , Ġsignature Filename ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠConstants . REQUEST _ CODE _ SIGNATURE ) ĊĠĠĠ Ġ} Ċ } Ċ