package Ġnet . ban ate ch . app . android . s abi _ alarm . alarm čĊč Ċ import Ġandroid . app . Notification Channel č Ċ import Ġandroid . app . Notification Manager č Ċ import Ġandroid . app . Time Picker Dialog č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . util . Log č Ċ import Ġandroid . view . Menu č Ċ import Ġandroid . view . MenuItem č Ċ import Ġandroid . view . View č Ċ import Ġandroid . widget . Time Picker č Ċ import Ġandroidx . appcompat . app . AppCompatActivity č Ċ import Ġandroidx . preference . Preference Manager č Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration č Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager č Ċ import Ġcom . google . android . gms . ads . Ad Request č Ċ import Ġcom . google . android . gms . ads . Ad Size č Ċ import Ġcom . google . android . gms . ads . Ad View č Ċ import Ġcom . google . android . material . sn ackbar . Snackbar č Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* č Ċ import Ġkotlinx . android . synt hetic . main . alarm _ view . view .* č Ċ import Ġkotlinx . coroutines . Coroutine Scope č Ċ import Ġkotlinx . coroutines . Dispatch ers č Ċ import Ġkotlinx . coroutines . launch č Ċ import Ġkotlinx . coroutines . with Context č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . R č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . actions . alarm . Alarm Actions Creator č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . alarm . database . Alarm č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . alarm . database . Alarm Database č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . dispatcher . Dispatcher č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . setting . Setting Activity č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . stores . alarm . Alarm Store č Ċ import Ġorg . green robot . event bus . Subscribe č Ċ import Ġjava . util .* č Ċ import Ġcom . google . android . gms . ads . Mobile Ads č Ċ import Ġnet . ban ate ch . app . android . s abi _ alarm . Build Config čĊčĊč Ċ class ĠAlarm Activity Ġ: ĠAppCompatActivity () Ġ{ čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdispatcher : ĠDispatcher čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaction Creator : ĠAlarm Actions Creator čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalarm Store : ĠAlarm Store čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlist Adapter : ĠAlarm Recycler Adapter čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdb : ĠAlarm Database čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġvar Ġview Manager Ġ= ĠLinearLayoutManager ( this ) čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠAlarm Database . getInstance ( application Context ) čĊĠĠĠĠĠĠĠ Ġval Ġdao Ġ= Ġdb . alarm Dao () čĊĠĠĠĠĠĠĠ Ġif Ġ( Alarm Store . al arms . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlarm Store . restore Al arms ( dao . getAll ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġchannel Id Ġ= ĠgetString ( R . string . channel _ id ) čĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetString ( R . string . channel _ name ) čĊĠĠĠĠĠĠĠ Ġval Ġdescription Text Ġ= ĠgetString ( R . string . channel _ description ) čĊĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ HIGH čĊĠĠĠĠĠĠĠ Ġval Ġalarm Channel Ġ= ĠNotification Channel ( channelId , Ġname , Ġimportance ) čĊĠĠĠĠĠĠĠ Ġalarm Channel . description Ġ= Ġdescription Text čĊĠĠĠĠĠĠĠ Ġalarm Channel . set Sound ( null , Ġnull ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager čĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( alarm Channel ) čĊčĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) čĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) čĊĠĠĠĠĠĠĠ Ġinit Dependencies () čĊĠĠĠĠĠĠĠ Ġsetup View () čĊčĊĠĠĠĠĠĠĠ ĠMobile Ads . initialize ( this ) Ġ{} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġinit Dependencies () Ġ{ čĊĠĠĠĠĠĠĠ Ġdispatcher Ġ= ĠDispatcher čĊĠĠĠĠĠĠĠ Ġaction Creator Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlarm Actions Creator čĊĠĠĠĠĠĠĠ Ġalarm Store Ġ= ĠAlarm Store čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġsetup View () Ġ{ čĊĠĠĠĠĠĠĠ Ġadd _ alarm _ button . setOnClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Hour Ġ= Ġcalendar . get ( Calendar . HOUR _ OF _ DAY ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Minute Ġ= Ġcalendar . get ( Calendar . MINUTE ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Picker Dialog Ġ= ĠTime Picker Dialog ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Picker Dialog . On Time Set Listener Ġ{ Ġ_: ĠTime Picker , Ġpicker Hour : ĠInt , Ġpicker Minute : ĠInt Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Alarm ( picker Hour , Ġpicker Minute ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow Hour , Ġnow Minute , Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker Dialog . show () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġalarm _ list . layout Manager Ġ= Ġview Manager čĊĠĠĠĠĠĠĠ Ġlist Adapter Ġ= ĠAlarm Recycler Adapter ( action Creator ) čĊĠĠĠĠĠĠĠ Ġalarm _ list . adapter Ġ= Ġlist Adapter čĊĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () čĊĠĠĠĠĠĠĠ Ġval Ġdivider Item Decoration Ġ= ĠDiv ider Item Decoration ( this , ĠDiv ider Item Decoration . VERTICAL ) čĊĠĠĠĠĠĠĠ Ġalarm _ list . addItem Decoration ( divider Item Decoration ) čĊĠĠĠĠĠĠĠ Ġalarm _ list . set Has Fixed Size ( true ) čĊĠĠĠĠĠĠĠ Ġlist Adapter . setOn ItemClickListener ( object Ġ: ĠAlarm Recycler Adapter . On ItemClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemClickListener ( view : ĠView , Ġposition : ĠInt , Ġalarm : ĠAlarm ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Creator . switch Detail ( alarm . id , Ġ! alarm . is Show Detail , Ġapplication Context ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalarm Detail Ġ= Ġview . include _ alarm _ detail čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alarm . is Show Detail ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Detail . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alarm _ down _ arrow . visibility Ġ= ĠView . GONE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Detail . visibility Ġ= ĠView . GONE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alarm _ down _ arrow . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠ Ġlist Adapter . setOn Sound StartTime Text ClickListener ( object Ġ: čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlarm Recycler Adapter . On Sound StartTime Text ClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sound StartTime Text ClickListener ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm : ĠAlarm čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠNumber Picker Dialog () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound StartTime Millis Ġ= Ġalarm . sound StartTime čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsum Seconds Ġ= Ġsound StartTime Millis Ġ/ Ġ 1 0 0 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Minutes Ġ= Ġsum Seconds Ġ/ Ġ 6 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Seconds Ġ= Ġsum Seconds Ġ% Ġ 6 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Millis Ġ= Ġsound StartTime Millis Ġ% Ġ 1 0 0 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set Dialog Init ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Minutes , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Seconds , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Millis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . context , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show ( support FragmentManager , Ġ" åĨį çĶŁ éĸĭå§ĭ æĻĤéĸĵ ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . main _ menu , Ġmenu ) čĊĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ settings Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSetting Activity :: class . java ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġupdate UI () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ) čĊĠĠĠĠĠĠĠ Ġval Ġalarm Sort Preference Value Ġ= Ġshared Preferences . getString (" alarm _ sort ", Ġ" 0 ") ?. toInt () Ġ?: Ġ 0 čĊĠĠĠĠĠĠĠ Ġlist Adapter . set Items ( Alarm Store . al arms , Ġalarm Sort Preference Value ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġnotify Destroy () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( Alarm Store . can Undo ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( main _ layout , ĠR . string . delete _ alarm _ sn ackbar _ label , ĠSn ackbar . LENGTH _ LONG ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( R . string . undo _ delete _ alarm _ sn ackbar _ label ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Creator . undo Destroy ( this ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . show () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Resume () čĊĠĠĠĠĠĠĠ Ġdispatcher . register ( this ) čĊĠĠĠĠĠĠĠ Ġdispatcher . register ( alarm Store ) čĊĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( alarm _ ad _ view _ layout . child Count Ġ== Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġad View Ġ= ĠAd View ( this ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġad View . ad Size Ġ= ĠAd Size . BAN NER čĊĠĠĠĠĠĠĠĠĠĠĠ Ġad View . ad Unit Id Ġ= ĠBuild Config . AD MOB _ BAN NER _ ID čĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm _ ad _ view _ layout . addView ( ad View ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġad Request Ġ= ĠAd Request . Builder (). build () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġad View . load Ad ( ad Request ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ ãģĵãĤĮ ãģĮ ãģªãģĦ ãģ¨ ãĤ¢ ãĥ© ãĥ¼ãĥł èµ· åĭķ æĻĤ ãģ« Alarm Stop Activity ãģ§ãģ¯ ãģªãģı Alarm Activity ãģĮ èµ· åĭķ ãģĻãĤĭ čĊĠĠĠĠĠĠĠ Ġif Ġ( Alarm Sound Service . media Player Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Sound Activity Intent Ġ= ĠIntent ( this , ĠAlarm Stop Activity :: class . java ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( stop Sound Activity Intent ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Pause () čĊĠĠĠĠĠĠĠ Ġdispatcher . unregister ( this ) čĊĠĠĠĠĠĠĠ Ġdispatcher . unregister ( alarm Store ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () čĊĠĠĠĠĠĠĠ Ġstop Service ( Intent ( this , ĠAlarm Sound Service :: class . java )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġadd Alarm ( hour : ĠInt , Ġminute : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġaction Creator . create ( hour , Ġminute , Ġapplication Context ) čĊĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Subscribe čĊĠĠĠ Ġfun Ġon Alarm Store Create ( event : ĠAlarm Store . Alarm Store Create Event ) Ġ{ čĊĠĠĠĠĠĠĠ ĠLog . d (" event ", Ġ" alarm Ġcreate Ġevent ") čĊĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Subscribe čĊĠĠĠ Ġfun Ġon Alarm Store Time Change ( event : ĠAlarm Store . Alarm Store Time ChangeEvent ) Ġ{ čĊĠĠĠĠĠĠĠ ĠLog . d (" event ", Ġ" alarm Ġtime Ġchange Ġevent ") čĊĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Subscribe čĊĠĠĠ Ġfun Ġon Alarm Store Change ( event : ĠAlarm Store . Alarm Store ChangeEvent ) Ġ{ čĊĠĠĠĠĠĠĠ ĠLog . d (" event ", Ġ" alarm Ġchange Ġevent ") čĊĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Subscribe čĊĠĠĠ Ġfun Ġon Alarm Store Destroy Event ( event : ĠAlarm Store . Alarm Store Destroy Event ) Ġ{ čĊĠĠĠĠĠĠĠ ĠLog . d (" event ", Ġ" alarm Ġdestroy Ġevent ") čĊĠĠĠĠĠĠĠ Ġupdate UI () čĊĠĠĠĠĠĠĠ Ġnotify Destroy () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Subscribe čĊĠĠĠ Ġfun Ġon Alarm Sound Select Event ( event : ĠAlarm Store . Alarm Sound Select Event ) Ġ{ čĊĠĠĠĠĠĠĠ ĠLog . d (" event ", Ġ" alarm Ġsound Ġselect Ġevent Ġ 1 ") čĊĠĠĠ Ġ} č Ċ } čĊ