/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġ- ĠDaniel ĠGu ger Ċ Ġ* Ċ Ġ* Ġ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 Ġat . gu ger . datetime picker dialog Ċ Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . DatePicker Ċ import Ġandroid . widget . Time Picker Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . view pager . widget . Pager Adapter Ċ import Ġandroidx . view pager . widget . ViewPager Ċ import Ġat . gu ger . datetime picker dialog . util . hour Ċ import Ġat . gu ger . datetime picker dialog . util . minute Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . tabs . Tab Layout Ċ import Ġorg . th reet en . bp . LocalDate Ċ import Ġorg . th reet en . bp . LocalDateTime Ċ import Ġorg . th reet en . bp . Local Time Ċ import Ġorg . th reet en . bp . Zone Id Ċ Ċ /** Ċ Ġ* ĠDialog Ġfeat uring Ġa Ġ[ DatePicker ] Ġand Ġa Ġ[ Time Picker ]. Ċ Ġ* Ċ Ġ* Ġ@ author ĠDaniel ĠGu ger Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ*/ Ċ class ĠDateTime Picker Dialog ( private Ġval Ġactivity : ĠAppCompatActivity , Ġinit : ĠDateTime Picker Dialog . () Ġ-> ĠUnit ) Ġ: ĠDialog Interface . OnClickListener , ĠView . OnClickListener Ġ{ ĊĊĠĠĠ Ġ// region ĠVariables ĊĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( activity ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialog : ĠAlertDialog ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroot View : ĠViewGroup ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdate Picker : ĠDate Picker ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtime Picker : ĠTime Picker ĊĊĠĠĠ Ġprivate Ġvar Ġlistener : Ġ(( dateTime : ĠLocalDateTime ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠProperties ĊĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġvar Ġdate Text Res : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġvar Ġtime Text Res : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġvar Ġfuture DateTime Error Text : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġwhether Ġthe Ġentered Ġdatetime Ġmust Ġbe Ġlater Ġthen Ġ[ LocalDateTime . now ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrequire Future DateTime : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġmin DateTime : ĠLocalDateTime ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġcurrent DateTime : ĠLocalDateTime ? Ġ= Ġnull ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠMethods ĊĊĠĠĠ Ġfun Ġtitle (@ String Res Ġid : ĠInt ) Ġ= Ġbuilder . setTitle ( id ) ĊĠĠĠ Ġfun Ġtitle ( text : ĠString ) Ġ= Ġbuilder . setTitle ( text ) ĊĊĠĠĠ Ġfun Ġpositive Button (@ String Res Ġid : ĠInt ) Ġ= Ġbuilder . set Positive Button ( id , Ġnull ) ĊĠĠĠ Ġfun Ġpositive Button ( text : ĠString ) Ġ= Ġbuilder . set Positive Button ( text , Ġnull ) ĊĊĠĠĠ Ġfun Ġnegative Button (@ String Res Ġid : ĠInt ) Ġ= Ġbuilder . set Negative Button ( id , Ġthis ) ĊĠĠĠ Ġfun Ġnegative Button ( text : ĠString ) Ġ= Ġbuilder . set Negative Button ( text , Ġthis ) ĊĊĠĠĠ Ġfun Ġcallback ( listener : Ġ( dateTime : ĠLocalDateTime ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . setView ( R . layout . dialog _ datetime picker ) ĊĊĠĠĠĠĠĠĠ Ġdialog Ġ= Ġbuilder . create () ĊĊĠĠĠĠĠĠĠ Ġdialog . setOn Show Listener Ġ{ Ġdialog Interface Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= Ġdialog Interface Ġas ĠAlertDialog ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot View Ġ= Ġalert Dialog . findViewById ( R . id . m DateTime Picker Root ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Pager Ġ= Ġalert Dialog . findViewById < ViewPager >( R . id . m DateTime Picker Pager ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtabs Ġ= Ġalert Dialog . findViewById < Tab Layout >( R . id . m DateTime Picker Tabs ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . adapter Ġ= ĠDateTime Picker Pager Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtabs . setup With ViewPager ( view Pager ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Picker Ġ= Ġalert Dialog . findViewById ( R . id . m DateTime Picker DatePicker ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker Ġ= Ġalert Dialog . findViewById ( R . id . m DateTime Picker Time Picker ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Picker . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin DateTime ?. let Ġ{ ĠdateTime Ġ-> Ġmin Date Ġ= ĠdateTime . at Zone ( Zone Id . system Default ()). to Instant (). to Epoch Milli () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent DateTime ?. let Ġ{ ĠdateTime Ġ-> Ġupdate Date ( dateTime . year , ĠdateTime . month Value . dec (), ĠdateTime . day OfMonth ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs 2 4 Hour View ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent DateTime ?. let Ġ{ ĠdateTime Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour ( dateTime . hour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminute ( dateTime . minute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . get Button ( AlertDialog . BUTTON _ POSITIVE ). setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate DateTime (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġwith ( date Picker ) Ġ{ ĠLocalDate . of ( year , Ġmonth . inc (), Ġday OfMonth ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġwith ( time Picker ) Ġ{ ĠLocal Time . of ( hour (), Ġminute ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! require Future DateTime Ġ|| Ġdate Ġ== ĠdateTime . to LocalDate () Ġ&& Ġtime . is After ( dateTime . to Local Time ()) Ġ|| Ġdate . is After ( dateTime . to LocalDate ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠCallback ĊĊĠĠĠ Ġ// ĠWork around Ġfor Ġbeing Ġable Ġto Ġcontrol Ġthe Ġclosing Ġtime Ġof Ġthe Ġdialog . ĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( validate DateTime ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. invoke ( LocalDateTime . of ( date Picker . year , Ġdate Picker . month , Ġdate Picker . day OfMonth , Ġtime Picker . hour (), Ġtime Picker . minute ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( root View , Ġfuture DateTime Error Text Ġ?: ĠR . string . d tp d _ Input Must Be Future DateTime , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( dialog : ĠDialog Interface ?, Ġwhich : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . BUTTON _ NEGATIVE Ġ-> Ġdialog !!. dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġinner Ġclass ĠDateTime Picker Pager Adapter Ġ: ĠP ager Adapter () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstantiate Item ( container : ĠViewGroup , Ġposition : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( container . context ). inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ 0 ) ĠR . layout . layout _ datepicker Ġelse ĠR . layout . layout _ time picker , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . addView ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdestroy Item ( container : ĠViewGroup , Ġposition : ĠInt , Ġ` object `: ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . destroy Item ( container , Ġposition , Ġ` object `) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Page Title ( position : ĠInt ): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactivity . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġdate Text Res Ġ?: ĠR . string . d tp d _ Date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtime Text Res Ġ?: ĠR . string . d tp d _ Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis View From Object ( view : ĠView , Ġ` object `: ĠAny ): ĠBoolean Ġ= Ġview Ġ=== Ġ` object ` Ġas ĠView ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Count (): ĠInt Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ }