package Ġcom . void sam ur ai . lord o ftime Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app .* Ċ import Ġandroid . app . usage . Usage Stats Manager Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . Application Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Image Decoder Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION _ CODES . Q Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget .* Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment Ċ import Ġandroidx . navigation . ui . AppBar Configuration Ċ import Ġandroidx . navigation . ui . navigate Up Ċ import Ġandroidx . navigation . ui . setup ActionBar With Nav Controller Ċ import Ġandroidx . navigation . ui . setup With Nav Controller Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Client Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Options Ċ import Ġcom . google . firebase . analytics . Firebase Analytics Ċ import Ġcom . google . firebase . analytics . k tx . analytics Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . k tx . auth Ċ import Ġcom . google . firebase . database . Firebase Database Ċ import Ġcom . google . firebase . database . k tx . database Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġcom . google . firebase . storage . Storage Reference Ċ import Ġcom . void sam ur ai . lord o ftime . bd .* Ċ import Ġcom . void sam ur ai . lord o ftime . charts _ and _ views . NT uple 4 Ċ import Ġcom . void sam ur ai . lord o ftime . databinding . Activity Main Binding Ċ import Ġcom . void sam ur ai . lord o ftime . fragments . Home Fragment Ċ import Ġcom . void sam ur ai . lord o ftime . fragments . Working Fragment Ċ import Ġcom . void sam ur ai . lord o ftime . fragments . dialogs . Repeat Dialog Ċ import Ġcom . void sam ur ai . lord o ftime . fragments . dialogs . Your Days Dialog Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . util .* ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġrepeat Dialog : ĠRepeat Dialog ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġis Monday First Day = true ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHARE D _ PREFER ENCES : String =" shared Preferences " ĊĠĠĠĠĠĠĠ Ġfun ĠString . format To Float (): Float { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr = toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (', ',' .') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('- ',' .') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( str . startsWith ('. ')) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . substring ( 1 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ Ġstr . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġhome Drawable : ĠDrawable ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfirebase DB : Firebase Database ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġanalytics : ĠFirebase Analytics ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstorage Reference : Storage Reference ĊĠĠĠ Ġfun Ġget Storage Reference (): Storage Reference = storage Reference ĊĠĠĠ Ġprivate Ġval ĠLANGUAGE : String =" Language " ĊĠĠĠ Ġprivate Ġval ĠSHOW _ OUT D ATED : String =" show Out dated " ĊĠĠĠ Ġprivate Ġval ĠSET T INGS _ CHANGE : String =" change Color " ĊĠĠĠ Ġprivate Ġval ĠMODE : String =" Mode " ĊĠĠĠ Ġprivate Ġvar Ġ_ main Fragment Binding : ĠActivity Main Binding ?= null ĊĠĠĠ Ġprivate Ġval Ġmain Fragment Binding Ġget () =_ main Fragment Binding !! ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdrawer Layout : ĠDraw er Layout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Bar Configuration : ĠApp Bar Configuration ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinflater : ĠLayoutInflater ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnav Controller : ĠNav Controller ĊĠĠĠ Ġvar Ġshow Out dated : Boolean Ġ= true ĊĠĠĠ Ġvar Ġnotification Service : Background Time Service = Background Time Service () ĊĠĠĠ Ġvar Ġis Task Started : Boolean = false ĊĠĠĠ Ġvar Ġis From Work Fragment : Boolean = false ĊĠĠĠ Ġvar Ġis From Calendar Fragment : Boolean = false ĊĠĠĠ Ġvar Ġcurrent TaskId : Int ?= null ĊĠĠĠ Ġvar Ġcurrent Task Category : String ?= null ĊĠĠĠ Ġvar Ġlast TaskId : Int ?= null ĊĠĠĠ Ġvar Ġlast Task Pos it io on : Int ?= null ĊĠĠĠ Ġvar Ġlast Button : Image Button ?= null ĊĠĠĠ Ġvar ĠuserId : String ?= null ĊĠĠĠ Ġvar Ġemail Id : String ?= null ĊĠĠĠ Ġvar ĠuserName : String ?= null ĊĠĠĠ Ġvar Ġuser Image : Bitmap ?= null ĊĠĠĠ Ġlateinit Ġvar Ġ Ġcolors : ĠDAO Colors ĊĠĠĠ Ġlateinit Ġvar Ġ Ġtasks : ĠDA OT ask s ĊĠĠĠ Ġlateinit Ġvar Ġ Ġrut ines : ĠDA OR ut ines ĊĠĠĠ Ġlateinit Ġvar Ġ Ġold Tasks : ĠDA OO ld Tasks ĊĠĠĠ Ġlateinit Ġvar Ġsettings : ĠDAO Settings ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : SharedPreferences ĊĠĠĠ Ġfun Ġget SharedPreferences (): SharedPreferences ĊĠĠĠĠĠĠĠ Ġ{ if (! this :: shared Preferences . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences = application . get SharedPreferences ( SHARED _ PREFER ENCES , ĠMODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġshared Preferences ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Mode () = get SharedPreferences (). getInt ( MODE ,- 1 ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Language () = get SharedPreferences (). getString ( LANGUAGE ," DEFAULT ") ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġdb : ĠSQLite Database ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġoh : ĠL OT Database Helper ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġquery Array By Date : ĠMutable LiveData < ArrayList < DataRow With Color >> Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġquery Array By Priority : ĠMutable LiveData < ArrayList < DataRow With Color >> Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġquery Array By Duration : ĠMutable LiveData < ArrayList < DataRow With Color >> Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġworking Time : Mutable LiveData < Int > Ġ= ĠMutable LiveData ( 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġcolors Array : ĠMutable LiveData < Map < String , String >> Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġrut ines Array : ĠMutable LiveData < Map < Int , R ut ines Row >> Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġfun ĠgetCurrent Working Time () = Ġworking Time ĊĠĠĠĠĠĠĠ Ġfun Ġget Query Array By Date () = Ġquery Array By Date ĊĠĠĠĠĠĠĠ Ġfun Ġget Query Array By Priority () = Ġquery Array By Priority ĊĠĠĠĠĠĠĠ Ġfun Ġget Query Array By Duration () = Ġquery Array By Duration ĊĠĠĠĠĠĠĠ Ġfun Ġget Colors () = Ġcolors Array ĊĠĠĠĠĠĠĠ Ġfun Ġget R ut ines () = Ġrut ines Array ĊĠĠĠĠĠĠĠ Ġfun Ġget DB Open Helper (): L OT Database Helper = Ġoh ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġauth : ĠFirebase Auth ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġgoogle SignIn Client : Google SignIn Client ĊĠĠĠĠĠĠĠ Ġvar Ġchange : Triple < Boolean , Boolean , Boolean > Ġ= ĠTrip le ( false , Ġfalse , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhome Fab Position : IntArray = IntArray ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġlogout (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" logged _ in ", false ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetCurrent UserId (): String { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getString (" user _ id "," ") ?: "" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Settings ( sd : Settings Data ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getIs User Changed ()){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . show _ completed ?. let Ġ{ ĠsetIs Showing Completed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . delete _ completed ?. let Ġ{ ĠsetIs Deleting Completed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . show _ out dated ?. let Ġ{ Ġset Out dated ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . main _ chart _ auto ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" MAIN _ CH ART _ AUTO ", Ġit ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . main _ chart _ aim ?. let Ġ{ Ġset Main Chart Range ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . death _ date ?. let Ġ{ set Your Time ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . show _ notifications ?. let { setIs Showing Notifications ( it )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . notifications _ sound ?. let { set Have Notifications Sound ( it )} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmode Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlanguage Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . mode ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Int ( MODE , Ġit ). put Boolean ( SETTINGS _ CHANGE , Ġtrue ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsd . language ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Language ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ USER _ CHANGED ", false ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Changed Ġ&& Ġ(! language Changed )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Out dated ( boolean : ĠBoolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Out dated = boolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean ( SHOW _ OUT D ATED , boolean ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Sort In Work Fragment ( order : Working Fragment . Order , sortBy : Working Fragment . Sort By ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). putString (" ORDER ", order . name ). putString (" SORT BY ", sortBy . name ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Main Chart Range ( range : Int = 2 4 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Int (" MAIN _ CH ART _ RANGE ", range ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Main Chart Range (): Int { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getInt (" MAIN _ CH ART _ RANGE ", 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠsetCurrent TaskId ( id : Int ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Int (" TASK _ ID ", id ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetCurrent TaskId (): Int { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getInt (" TASK _ ID ", - 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Running Service ( isRunning : Boolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ SERVICE _ RUNNING ", isRunning ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Running Service (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ SERVICE _ RUNNING ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Showing Notifications ( is Showing : ĠBoolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ SHOW ING _ NOTIFICATION S ", is Showing ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Showing Notifications (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ SHOW ING _ NOTIFICATION S ", true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Have Usage Permission ( per mitted : ĠBoolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" USAGE _ PERMISSION ", per mitted ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Have Usage Permission (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" USAGE _ PERMISSION ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Have Notifications Sound ( have : ĠBoolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" HAVE _ NOTIFICATION S _ SOUND ", have ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Have Notifications Sound (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" HAVE _ NOTIFICATION S _ SOUND ", true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Task Category ( category : String ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). putString (" TASK _ CATEGORY ", category ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Task Category (): String { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getString (" TASK _ CATEGORY "," ") ?: "" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Running Task ( isRunning : ĠBoolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ RUNNING _ TASK ", isRunning ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Running Task (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ RUNNING _ TASK ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is User Changed (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ USER _ CHANGED ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Time Started ( startTime : ĠLong ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Long (" TIME _ TO _ UPDATE ", startTime ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetTime Started (): Long { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getLong (" TIME _ TO _ UPDATE ", 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Last Time Updated ( startTime : ĠLong ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Long (" START _ TIME ", startTime ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠgetLast Time Updated (): Long { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getLong (" START _ TIME ", Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time . time ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Your Time ( startTime : ĠLong ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Long (" LI FE _ TIME ", startTime ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Your Time (): Long { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getLong (" LI FE _ TIME ", 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Deleting Completed ( is Deleting : Boolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ DE LET ING _ COMPLETED ", is Deleting ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Deleting Completed (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ DE LET ING _ COMPLETED ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Showing Completed ( is Showing : Boolean ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" IS _ SHOW ING _ COMPLETED ", is Showing ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Showing Completed (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" IS _ SHOW ING _ COMPLETED ", true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Main Chart Auto (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate = getIs Main Chart Manual (). not () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . add ( main _ chart _ auto Ġ= Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean (" MAIN _ CH ART _ AUTO ", state ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Is Main Chart Manual (): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getBoolean (" MAIN _ CH ART _ AUTO ", false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Calendar Chart Range ( range : Int ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Int (" CAL END AR _ CH ART _ RANGE ", range ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Calendar Chart Range (): Int { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget SharedPreferences (). getInt (" CAL END AR _ CH ART _ RANGE ", 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Work Sorting (): Pair < String , String >{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorder = get SharedPreferences (). getString (" ORDER "," ASC ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsort = get SharedPreferences (). getString (" SORT BY "," DATE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( order !! , sort !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSets Ġlight Ġstyles ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġstyle ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- 1 Ġdefault Ġmode ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 Ġlight Ġmode ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 Ġdark Ġmode ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Style ( style : Int ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshared Preferences : SharedPreferences = application . get SharedPreferences ( SHARED _ PREFER ENCES , ĠMODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shared Preferences = shared Preferences ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor : SharedPreferences . Editor = shared Preferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . put Int ( MODE , style ). put Boolean ( SETTINGS _ CHANGE , true ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrefresh Home Fragment And DB (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData From DB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( change . first && change . second && change . third ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . nav _ host _ fragment , ĠHome Fragment ()). commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Local Color DB ( data : Map < String , String > ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Data : ĠMap < String , ĠString > Ġ= Ġcolors Array . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Data . containsKey ( row . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Data [ row . key ] Ġ!= Ġrow . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret = oh . edit Color Row ( row . key , Ġrow . key , Ġrow . value , userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ret ! =- 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( true , Ġchange . second , Ġchange . third ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . add Color Row ( row . key , Ġrow . value , userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( true , Ġchange . second , Ġchange . third ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Local R ut ines DB ( data : ArrayList < R ut ines Row > ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Data : ĠMap < Int , ĠR ut ines Row > Ġ= Ġget R ut ines (). value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Data . containsKey ( row . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Data [ row . id ] !!. task _ id Ġ!= Ġrow . task _ id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit R ut ines Row ( row . id , Ġrow . task _ id , Ġrow . days , Ġrow . hours , userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġoh . add R ut ines Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . task _ id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . days , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . hours , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġid Ġgot Ġin Ġlocal Ġdb Ġcloud ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines . delete ( row . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . task _ id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . days , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . hours ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Local Task DB ( data From Firebase : ArrayList < DataRow > ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Data : ĠMutable List < DataRow With Color > Ġ= Ġquery Array By Date . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠData Row . compare ById ( array : ĠMutable List < DataRow With Color >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġarray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . id Ġ== Ġthis . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠData Row . compare By Rest And Id ( array : ĠMutable List < DataRow With Color >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġarray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . id Ġ== Ġthis . id Ġ&& Ġ( el . name Ġ!= Ġthis . name Ġ|| Ġel . category Ġ!= Ġthis . category Ġ|| Ġel . date . time . time Ġ!= Ġthis . date . time . time )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġdata From Firebase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . compare By Rest And Id ( local Data )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . date . time . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . priority , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . current Working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . finished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( change . first , Ġtrue , Ġchange . third ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! row . compare ById ( local Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġ= Ġoh . add Task Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . date . time . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . priority , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . delete ( row . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . date . time . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . priority , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . finished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( change . first , Ġtrue , Ġchange . third ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Local Old Task DB ( data : ArrayList < Old Data > ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġdata . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time Ġ= ĠDate ( it . date _ id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOld Data ( cal . time . time , Ġit . category , Ġit . working Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠArrayList < *> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Data : ĠList < Triple < Long , ĠFloat , ĠString >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Old Data (). map Ġ{ ĠTrip le ( it . first . time . time , Ġit . second , Ġit . third ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠOld Data . compare ID ( array : ĠList < Triple < Long , ĠFloat , ĠString >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Good Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġarray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . first Ġ== Ġthis . date _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Good Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Good ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠOld Data . compare Time With Id ( array : ĠList < Triple < Long , ĠFloat , ĠString >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( el Ġin Ġarray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . first Ġ== Ġthis . date _ id Ġ&& Ġel . second Ġ!= Ġthis . working Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġdata 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġas ĠOld Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . compare Time With Id ( local Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Old stat Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . date _ id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . date _ id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . working Time . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( change . first , Ġchange . second , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! row . compare ID ( local Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . add Old stat Row ( row . date _ id , Ġrow . working Time . toInt (), Ġrow . category , userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Ġ= ĠTrip le ( change . first , Ġchange . second , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Home Fragment And DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġsave Avatar ( uri : ĠUri ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp : ĠBitmap ? Ġ= Ġif ( Build . VERSION . SDK _ INT Ġ>= ĠQ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Decoder . decode Bitmap ( Image Decoder . create Source ( content Resolver , Ġuri )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . get Bitmap ( content Resolver , Ġuri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbmp !!. compress ( Bitmap . Compress Format . JPEG , Ġ 8 0 , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġstream . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Image = bmp ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Fragment Binding . nav View . getHeader View ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < ImageView >( R . id . user _ avatar ). setImage URI ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Reference . put File ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĠToast . makeText ( this , Ġresources . getString ( R . string . avatar _ changed ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĠLog . e (" AV AT AR ", it . cause . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoh . add Avatar ( userId , byteArray ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Avatar (){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptional = oh . get Avatar ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( optional . isPresent ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap : ĠBitmap = optional . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Image = bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Fragment Binding . nav View . getHeader View ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < ImageView >( R . id . user _ avatar ). setImage Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile . create TempFile (" template ", Ġ". jpg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Reference . getFile ( file ). add On Success Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp : Bitmap ? Ġ= ĠBitmap Factory . decode Stream ( FileInputStream ( file ), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbmp !!. compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Image Ġ= Ġbmp ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Fragment Binding . nav View . getHeader View ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findViewById < ImageView >( R . id . user _ avatar ). setImage Bitmap ( bmp ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" IMAGE _ INTERNAL _ SA V ING ", Ġe . cause . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Language ( language : String ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage To Load Ġ= Ġwhen ( language ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" DEFAULT "," DOM Y Å ļ LN IE " -> ĠLocale . getDefault (). language ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PL " -> Ġ" pl " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" EN " ->" en _ EN " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse -> {" en "} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . get SharedPreferences ( SHARED _ PREFER ENCES , ĠMODE _ PRIVATE ). edit (). put Boolean ( SETTINGS _ CHANGE , true ). apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= ĠLocale ( language To Load ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . setDefault ( locale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġresources . configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . set Locale ( locale ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). putString ( LANGUAGE , language ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . update Configuration ( config , Ġresources . display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnew Intent (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NO _ ANIM ATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences = application . get SharedPreferences ( SHARED _ PREFER ENCES , ĠMODE _ PRIVATE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg so Ġ= ĠGoogle SignIn Options ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder ( Google SignIn Options . DEFAULT _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. requestId Token ( getString ( R . string . default t _ web _ client _ id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Email () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle SignIn Client Ġ= ĠGoogle SignIn . getClient ( this , g so ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Ġ= ĠFirebase . analytics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Ġ= ĠFirebase . auth ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId = intent . getString Extra (" user _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Id = intent . getString Extra (" email _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName = intent . getString Extra (" user _ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( userId == null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId = getCurrent UserId () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences ( SHARED _ PREFER ENCES , ĠMODE _ PRIVATE ). edit (). putString (" user _ id ", it ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( userId . isNull Or Blank () || userName . isNull Or Blank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth . currentUser . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġauth . uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. email . let { itt -> Ġemail Id Ġ= itt } ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. displayName . let { Ġit t -> userName Ġ= itt } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase DB = Firebase . database ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolors = DAO Colors ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks = ĠDA OT ask s ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Tasks = ĠDA OO ld Tasks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines = ĠDA OR ut ines ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings = ĠDAO Settings ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Reference = Firebase Storage . getInstance (). reference . child (" profile Images "). child ( userId !! +". jpg ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Out dated = Ġget SharedPreferences (). getBoolean ( SHOW _ OUT D ATED , true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠQ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( get SharedPreferences (). getInt ( MODE ,- 1 Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL OT Database Helper . Set Guide ( resources . getString Array ( R . array . tutorial ). toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoh Ġ= ĠL OT Database Helper ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġoh . readable Database ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow = Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime To add = now - getLast Time Updated () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getIs Running Task ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getCurrent TaskId () ! =- 1 && time To add != 0 L ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Task Started = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent TaskId = getCurrent TaskId () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow = oh . get Task Row ( current TaskId !! , userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Category = get Task Category () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwt =( time To add / 1 0 0 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Time . value = (( now - getTime Started ()) / 1 0 0 0 ). toInt () Ġ// = wt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Last Time Updated ( Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time In Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ?. current Working Time ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Old stats ( wt +( it * 3 6 0 0 ). toInt (), wt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getIs Deleting Completed ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Completed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData From DB () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolors . add Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . add Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Tasks . add Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines . add Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . add Listeners () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Array By Priority . value Ġ= Ġget Sorted By Priority ( getQuery Array By Date (). value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Array By Duration . value Ġ= Ġget Sorted By Duration ( getQuery Array By Date (). value !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ main Fragment Binding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetContentView ( main Fragment Binding . root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Support ActionBar ( findViewById ( R . id . toolbar )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Title Enabled ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller Ġ= Ġfind Nav Controller ( R . id . nav _ host _ fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout Ġ= Ġmain Fragment Binding . drawer Layout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Fragment Binding . nav View . setup With Nav Controller ( nav Controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . set Drawer Lock Mode ( Drawer Layout . LOCK _ MODE _ LOCK ED _ CLOSED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Bar Configuration Ġ= ĠApp Bar Configuration ( nav Controller . graph , Ġdrawer Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup ActionBar With Nav Controller ( nav Controller , Ġdrawer Layout ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Default ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġol dd ate = Calendar . getInstance (). time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getIs Running Task ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġol dd ate Ġ= ĠgetTime Started () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounter = 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( counter % 3 0 0 == 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow = Calendar . getInstance (). time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdif =( now - ol dd ate )/ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Time . post Value ( Ġworking Time . value ?: 0 Ġ+ Ġ( dif - counter ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter = 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġol dd ate = now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Time . post Value ( Ġworking Time . value !!. inc ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater Ġ= ĠLayoutInflater . from ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Avatar () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (( get Your Time ()- Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time In Millis )< 0 L ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy dd = ĠYour Days Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy dd . show ( support FragmentManager ," Mem ento _ M ori ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu : ĠMenu Ġ= Ġmain Fragment Binding . nav View . menu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Item Ġ= Ġmenu . find Item ( R . id . calendar Edit Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Item Ġ= Ġmenu . find Item ( R . id . many Charts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . setOn MenuItem ClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . close Drawer ( Gravity Compat . START ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain Scope (). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnh f Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . nav _ host _ fragment ) Ġas ĠNav Host Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhf = Ġnh f . child FragmentManager . fragments [ 0 ] Ġas ĠHome Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhf . home Fragment Binding . task Ch anger FAB . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Item . setOn MenuItem ClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain Scope (). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnh f Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . nav _ host _ fragment ) Ġas ĠNav Host Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhf = Ġnh f . child FragmentManager . fragments [ 0 ] Ġas ĠHome Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhf . home Fragment Binding . card 2 Click . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( get SharedPreferences (). getBoolean ( SETTINGS _ CHANGE , false )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( R . id . action _ First Fragment _ to _ settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences (). edit (). put Boolean ( SETTINGS _ CHANGE , false ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < LinearLayout >( R . id . settings ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( R . id . action _ First Fragment _ to _ settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( getIs Showing Notifications ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Today Notifications () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Ġnav Controller . current Destination ?. label ==" first _ fragment _ label " || ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . itemId == R . id . category || ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . itemId == R . id . order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolors . remove Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . remove Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Tasks . remove Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines . remove Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . remove Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . user _ email ). text = email Id ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . user _ name ). text = userName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Mem ento M ori () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfill Mem ento M ori () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Time Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Your Time () Ġ!= Ġ 0 L ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Time . time Ġ= ĠDate ( get Your Time ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm Years Ġ= Ġm Time . get ( Calendar . YEAR ) Ġ- Ġnow . get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm Months Ġ= Ġm Time . get ( Calendar . MONTH ) Ġ- Ġnow . get ( Calendar . MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Months Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Months Ġ+= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- m Years ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm Days Ġ= Ġm Time . get ( Calendar . DAY _ OF _ MONTH ) Ġ- Ġnow . get ( Calendar . DAY _ OF _ MONTH ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Days Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Days Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Time . get ( Calendar . DAY _ OF _ MONTH ) Ġ+ Ġnow . get Actual Maximum ( Calendar . DAY _ OF _ MONTH )) Ġ- Ġnow . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . DAY _ OF _ MONTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- m Months ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Months Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Months Ġ+= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- m Years ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . year _ val ). text Ġ= Ġm Years . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . month _ val ). text Ġ= Ġm Months . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . day _ val ). text Ġ= Ġm Days . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Years Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . year _ label ). text Ġ= Ġresources . getText ( R . string . year ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Months Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . month _ label ). text Ġ= Ġresources . getText ( R . string . month ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Months Ġin Ġ 3 .. 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . month _ label ). text Ġ= Ġresources . getText ( R . string . months 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Days Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . day _ label ). text Ġ= Ġresources . getText ( R . string . day ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . year _ val ). text Ġ=" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . month _ val ). text Ġ=" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . day _ val ). text Ġ= Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnav Controller . navigate Up ( app Bar Configuration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsuper . on Support Navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . current Destination ?. label . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . is Drawer Open ( Gravity Compat . START ) Ġ-> Ġdrawer Layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ" Working Fragment " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis From Work Fragment = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ" first _ fragment _ label " Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnh = Ġsupport FragmentManager . find Fragment ById ( R . id . nav _ host _ fragment ) Ġas ĠNav Host Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment = nh . child FragmentManager . primary Navigation Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fragment Ġis ĠHome Fragment ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! fragment . is Button Hidden ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . home Fragment Binding . view . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ==" fragment _ calendar _ edit " ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis From Calendar Fragment = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ author ĠKar ol ĠRob ak ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ**/ ĊĊĊĠĠĠĠĠĠĠ Ġfun ĠgetData From DB (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Query : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠTASK TABLE ._ id , ĠTASK TABLE . category , ĠTASK TABLE . name , ĠTASK TABLE . datetime , TASK TABLE . working _ time , TASK TABLE . priority , ĠTASK TABLE . current _ work _ time , ĠCOLOR . color , ĠTASK TABLE . is _ finished Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FROM ĠTASK TABLE ĠLEFT ĠJOIN ĠCOLOR Ġon ĠTASK TABLE . category = COLOR . category _ id ĠWHERE ĠTASK TABLE . user _ id =? ĠOR ĠTR IM ( TASK TABLE . user _ id ) ĠIS ĠNULL ĠORDER ĠBY ĠTASK TABLE . datetime , ĠTASK TABLE . priority ĠDESC " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery : ĠArrayList < DataRow With Color > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc : ĠCursor Ġ= Ġdb . raw Query ( selection Query , ĠarrayOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarray : ĠMap < String , ĠString > Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time Ġ= ĠDate ( c . getLong ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Out dated && getIs Showing Completed ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Row With Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 7 ) Ġ?: Ġ"# FFFFFF ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Ġ= Ġc . getInt ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( getIs Showing Completed () && (! calendar . before ( Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Row With Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 7 ) Ġ?: Ġ"# FFFFFF ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Ġ= Ġc . getInt ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( c . getInt ( 8 )== 0 &&( c . get Float ( 4 )- c . get Float ( 6 )) > 0 && show Out dated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Row With Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 7 ) Ġ?: Ġ"# FFFFFF ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Ġ= Ġc . getInt ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( c . getInt ( 8 )== 0 &&( c . get Float ( 4 )- c . get Float ( 6 )) > 0 && (! calendar . before ( Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Row With Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . get Float ( 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 7 ) Ġ?: Ġ"# FFFFFF ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Ġ= Ġc . getInt ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( c . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġdb . raw Query (" SELECT Ġ* ĠFROM ĠCOLOR ĠWHERE ĠCOLOR . user _ id =? ĠOR ĠTR IM ( COLOR . user _ id ) ĠIS ĠNULL ", ĠarrayOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Ġ= Ġarray . plus ( Pair ( c . getString ( 0 ), Ġc . getString ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolors Array . value Ġ= Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . forEach Ġ{ Ġdata Row With Color Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dataRow With Color . date . before ( Calendar . getInstance ( TimeZone . getTime Zone (" UTC ")) )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Row With Color . out dated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrut ines Array . value = oh . getUser R ut ines Array ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Array By Date . value Ġ= Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Array By Priority . value Ġ= Ġget Sorted By Priority ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Array By Duration . value Ġ= Ġget Sorted By Duration ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Sorted By Duration ( qa : ĠArrayList < DataRow With Color >): ĠArrayList < DataRow With Color > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq a . sort With ( compare By < DataRow With Color > Ġ{ Ġit . working Time Ġ}. then By Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġna : ĠArrayList < DataRow With Color > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġna . addAll ( qa . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq a . sort With ( compare By < DataRow With Color > Ġ{ Ġit . date . time . time Ġ}. then By Descending Ġ{ Ġit . priority Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġna ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Sorted By Priority ( qu erry Array : ArrayList < DataRow With Color >): ArrayList < DataRow With Color >{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu erry Array . sort With ( compare By Descending < DataRow With Color > Ġ{ Ġit . priority Ġ}. then By Ġ{ Ġit . date . time . time Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ ĠArrayList ( qu erry Array . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġget Old Data (): ArrayList < Triple < Calendar , Float , String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Query Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠO LD STATS . date _ id , ĠO LD STATS . working _ time , ĠO LD STATS . category Ġfrom ĠO LD STATS ĠWHERE ĠO LD STATS . user _ id =? ĠOR ĠTR IM ( OLD STATS . user _ id ) ĠIS ĠNULL Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc : ĠCursor Ġ= Ġdb . raw Query ( selection Query , ĠarrayOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap : ĠMutable Map < Calendar , ĠPair < Float , ĠString >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist : ĠArrayList < Triple < Calendar , ĠFloat , ĠString >> Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time Ġ= ĠDate ( c . getLong ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . HOUR _ OF _ DAY , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put If Absent ( cal , ĠPair ( c . getInt ( 1 ). toFloat () Ġ/ Ġ 3 6 0 0 , Ġc . getString ( 2 ))) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . first Ġ+ Ġc . getInt ( 1 ). toFloat () Ġ/ Ġ 3 6 0 0 , Ġc . getString ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( c . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Triple ( element . key , Ġelement . value . first , Ġelement . value . second )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġsets Ġcurrent Working Time Ġof ĠCurrent Task ĊĠĠĠĠĠĠĠĠ Ġ* Ġadd Ġrow Ġfor Ġold Ġtasks ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠcurrentTime Ġ- Ġsummary Ġtime Ġof Ġ Ġtask Ġto Ġchange Ġin ĠCurrent Task Ġprogress ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtime ToAdd Ġ- Ġtime Ġto Ġadd Ġin ĠOld Tasks Ġtable ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate Old stats ( currentTime : Int , Ġtime ToAdd : Int ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( currentTime != 0 && current TaskId != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġcurrent Ġtask Ġtime ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent TaskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġnull , Ġnull , Ġ 0 , Ġ 0 , ĠcurrentTime ,- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . update ( current TaskId !! , null , null , null , null , null , currentTime ,- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġold stats Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Task Category . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Category = get Task Category () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime ToAdd . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . add Old stat Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time . time , Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Tasks . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateTime Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")). time . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Working Time Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= Ġcurrent Task Category !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠArrayList < N tuple < Calendar , Int , String , String >> ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ ĠArrayList < N tuple < start _ date , Ġworking _ time _ sec , Ġcategory , Ġcolor >> ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Old Data With Colors ( current Day : Boolean ): ArrayList < NT uple 4 < Calendar , ĠInt , ĠString , ĠString >> { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Query Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠO LD STATS . date _ id , ĠO LD STATS . working _ time , ĠO LD STATS . category , ĠCOLOR . color Ġfrom ĠO LD STATS Ġ ĠJOIN ĠCOLOR ĠON ĠO LD STATS . category = COLOR . category _ id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc : ĠCursor Ġ= Ġdb . raw Query ( selection Query , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmap : ĠMutable Map < Calendar , ĠTrip le < Int , ĠString , ĠString >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist : ĠArrayList < NT uple 4 < Calendar , ĠInt , ĠString , ĠString >> Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal C Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone (" UTC ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time Ġ= ĠDate ( c . getLong ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((! current Day ) Ġ|| Ġ( cal . get ( Calendar . YEAR ) Ġ== Ġcal C . get ( Calendar . YEAR ) Ġ&& Ġcal . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . MONTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== Ġcal C . get ( Calendar . MONTH ) Ġ&& Ġcal . get ( Calendar . DAY _ OF _ MONTH ) Ġ== Ġcal C . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . DAY _ OF _ MONTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put If Absent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( c . getInt ( 1 ), Ġc . getString ( 2 ), Ġc . getString ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first Ġ+ Ġc . getInt ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getString ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( c . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap . filter Keys Ġ{ Ġcalendar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ) Ġ== Ġcal C . get ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable Map () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN Tuple 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . value . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . value . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . value . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġdelete Completed (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Query Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠTASK TABLE ._ id , ĠTASK TABLE . working _ time , ĠTASK TABLE . current _ work _ time , ĠR UT IN ES ._ id ĠFROM ĠTASK TABLE ĠLEFT ĠJOIN ĠR UT IN ES ĠON ĠTASK TABLE ._ id = R UT IN ES . task _ id Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc : ĠCursor Ġ= Ġdb . raw Query ( selection Query , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray : ĠArrayList < Int > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( c . getInt ( 1 ) Ġ- Ġc . getInt ( 2 )) Ġ< Ġ 0 Ġ&& Ġ( c . isNull ( 3 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( c . getInt ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( c . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġarray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . delete Task Row ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . delete ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate R ut ines (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Query Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠTASK TABLE ._ id , ĠTASK TABLE . datetime , ĠR UT IN ES ._ id , ĠR UT IN ES . days , R UT IN ES . hours , TASK TABLE . working _ time ĠFROM ĠTASK TABLE ĠJOIN ĠR UT IN ES ĠON ĠTASK TABLE ._ id = R UT IN ES . task _ id Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc : ĠCursor Ġ= Ġdb . raw Query ( selection Query , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Calendar Ġ= ĠCalendar . getInstance (/* TimeZone . getTime Zone (" UTC ") */) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdow Ġ= Ġc Calendar . get ( Calendar . DAY _ OF _ WEEK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent DayOfWeek Ġ= Ġif Ġ( is Monday First Day ) Ġwhen Ġ( d ow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdow Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġdow ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Hour Ġ= Ġc Calendar . get ( Calendar . HOUR _ OF _ DAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Minute Ġ= Ġc Calendar . get ( Calendar . MINUTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdays Array : ĠList < Int > ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhours Array : ĠList < String > ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Calendar Time ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar : ĠCalendar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday Short : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminute : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Week : ĠBoolean ? Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġday Ġ= Ġday Short ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Monday First Day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday Ġ= Ġwhen Ġ( day Short ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġday Short Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= Ġcalendar . clone () Ġas ĠCalendar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . DAY _ OF _ WEEK , Ġday ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Week . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Week !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . add ( Calendar . WEEK _ OF _ YEAR , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . HOUR _ OF _ DAY , Ġhour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MINUTE , Ġminute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time Zone Ġ= ĠTime Zone . getTime Zone (" UTC ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcal . time In Millis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġany Changes Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Cal Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Cal . time In Millis Ġ= Ġc . getLong ( 1 ) Ġ+ Ġ( c . getLong ( 5 ) Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Minutes Ġ= Ġ( c . getInt ( 5 ) Ġ/ Ġ 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Hours Ġ= Ġ( duration Minutes Ġ/ Ġ 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( local Cal . time In Millis /* - local Cal . time Zone . raw Offset */) Ġ< Ġ( c Calendar . time In Millis Ġ+ Ġc Calendar . time Zone . raw Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Array Ġ= Ġc . getString ( 3 ). split (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By Ġ{ ĠDA OR ut ines . get Day Nr ( it , Ġis Monday First Day ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDA OR ut ines . get Day Nr ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Monday First Day ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Monday First Day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Array . sorted () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Array Ġ= Ġc . getString ( 4 ). split (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By Ġ{ Ġit : ĠString Ġ-> Ġit . split (': ')[ 0 ]. toInt () Ġ}. then By Ġ{ Ġit : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . split (': ')[ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays Before Ġ= Ġdays Array . filter Ġ{ Ġit Ġ< Ġcurrent DayOfWeek Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays After Ġ= Ġdays Array . filter Ġ{ Ġit Ġ> Ġcurrent DayOfWeek Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= Ġdays Array . filter Ġ{ Ġit Ġ== Ġcurrent DayOfWeek Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! today . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Array . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġit . split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġtime [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġtime [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Hour Ġ< Ġ( hour Ġ+ Ġduration Hours ) Ġ|| Ġ( current Hour Ġ== Ġ( hour Ġ+ Ġduration Hours ) Ġ&& Ġcurrent Minute Ġ< Ġ( minute Ġ+ Ġduration Minutes ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Calendar Time ( c Calendar , Ġtoday [ 0 ], Ġhour , Ġminute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . getInt ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateTime Ġ= Ġnew Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Changes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((! changed ) Ġ&& Ġ(! days After . isNull OrEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Array . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġit . split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġtime [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġtime [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Calendar Time ( c Calendar , Ġdays After [ 0 ], Ġhour , Ġminute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( c . getInt ( 0 ), Ġnull , Ġnull , Ġnew Date , Ġ 0 , Ġ 0 , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . update ( c . getInt ( 0 ), ĠdateTime Ġ= Ġnew Date , Ġworking Time Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Changes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((! changed ) Ġ&& Ġ(! days Before . isNull OrEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Array [ 0 ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġit . split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġtime [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġtime [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġget Calendar Time ( c Calendar , Ġdays Before [ 0 ], Ġhour , Ġminute , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( c . getInt ( 0 ), Ġnull , Ġnull , Ġnew Date , Ġ 0 , Ġ 0 , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . update ( c . getInt ( 0 ), ĠdateTime Ġ= Ġnew Date , Ġworking Time Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Changes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((! changed ) Ġ&& Ġ(! today . isNull OrEmpty ()) Ġ&& Ġ(! hours Array . isNull OrEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġhours Array [ 0 ]. split (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġtime [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġtime [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġget Calendar Time ( c Calendar , Ġtoday [ 0 ], Ġhour , Ġminute , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoh . edit Task Row ( c . getInt ( 0 ), Ġnull , Ġnull , Ġnew Date , Ġ 0 , Ġ 0 , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . update ( c . getInt ( 0 ), ĠdateTime Ġ= Ġnew Date , Ġworking Time Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Changes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( c . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Changes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetData From DB () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrequest Permission ( permission : String , ĠonSuccess : ()-> Unit , on Failure : ()-> Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , Ġpermission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠPackage Manager . PERMISSION _ DEN IED Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Result Contracts . Request Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġis Granted : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Granted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch ( permission ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrequest Permissions (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Default ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P Ġ&& Ġ(! get SharedPreferences (). getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dont _ show Ġ" Ġ+ ĠManifest . permission . FO REG ROUND _ SERVICE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( Manifest . permission . FO REG ROUND _ SERVICE , Ġ{}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Dialog ( Manifest . permission . FO REG ROUND _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! get SharedPreferences (). getBoolean (" dont _ show Ġ" Ġ+ ĠManifest . permission . INTER NET , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( Manifest . permission . INTER NET , Ġ{}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Task Notification ( time To Alarm : Long , taskId : Int , task Name : String ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Intent Ġ= ĠIntent ( this , ĠTime Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Intent . putExtra (" taskId ", taskId ). putExtra (" task Name ", task Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . application Context , ĠtaskId , Ġmy Intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalarm Manager : Alarm Manager Ġ= Ġget System Service ( ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Exact And Allow While Idle ( Alarm Manager . RTC , Ġtime To Alarm , Ġpending Intent ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġfun Ġdelete Task Notification ( taskId : ĠInt , Ġtask Name : ĠString ){ ĊĠĠĠĠĠĠĠ Ġval Ġmy Intent Ġ= ĠIntent ( this , ĠTime Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġmy Intent . putExtra (" taskId ", taskId ). putExtra (" task Name ", task Name ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . application Context , ĠtaskId , Ġmy Intent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġalarm Manager : Alarm Manager Ġ= Ġget System Service ( ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĊĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( pending Intent ) ĊĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġstart Finished Notification ( taskId : Int , task Name : String ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Intent Ġ= ĠIntent ( this , ĠTime Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Intent . putExtra (" taskId ", taskId ). putExtra (" task Name ", task Name ). putExtra (" finished ", true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . application Context , ĠtaskId , Ġmy Intent , Ġ 0 ) ĠĠĠĠĠĠĠĠĠĠĠ Ġ// multiply Ġmaybe Ġnot Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalarm Manager : Alarm Manager Ġ= Ġget System Service ( ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Exact ( Alarm Manager . RTC , Ġ 1 , Ġpending Intent ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Today Notifications (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata = oh . getService Task Info ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow = Calendar . getInstance (). time In Millis + ĠĠ ĠTime Zone . getDefault (). raw Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( row Ġin Ġdata ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime = row . third - now ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( time > 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Task Notification ( row . third - TimeZone . getDefault (). raw Offset , row . first , row . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdelete Today Notifications (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata = oh . getService Task Info ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow = Calendar . getInstance (). time In Millis + ĠĠ ĠTime Zone . getDefault (). raw Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( row Ġin Ġdata ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime = row . third - now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( time > 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Task Notification ( row . first , Ġrow . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Q ) ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Daily Usage Stats (): ĠArrayList < Pair < String , ĠLong >> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage St as Manager Ġ= Ġget System Service ( USAGE _ STATS _ SERVICE ) Ġas ĠUsage Stats Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġapplication Context . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . HOUR _ OF _ DAY , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Usage State Ġ= Ġusage St as Manager . query Usage Stats ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsage Stats Manager . INTERVAL _ BEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time In Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray List : ĠArrayList < Pair < String , ĠLong >> Ġ= Ġarray ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġquery Usage State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġai : ĠApplication Info ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpm . getApplication Info ( element . packageName , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( ai Ġ!= Ġnull ) Ġpm . getApplication Label ( ai ) Ġelse Ġelement . packageName ) Ġas ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . total Time Visible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno System = Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp info List Ġ= Ġpm . get Installed Packages ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġp info List ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġai : ĠApplication Info ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpm . getApplication Info ( element . packageName , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis System Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis System Ġ= Ġ( element . application Info . flags Ġand ĠApplication Info . FLAG _ SYSTEM Ġ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . application Info . source Dir . startsWith ("/ data / app /") Ġ&& Ġis System ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis System Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! is System ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno System . add (( if Ġ( ai Ġ!= Ġnull ) Ġpm . getApplication Label ( ai ) Ġelse Ġelement . packageName ) Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter edList =( array List . filter Ġ{ Ġit . second Ġ>= Ġ 0 L Ġ} Ġas ĠArrayList < Pair < String , ĠLong >> ). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno System . contains ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠArrayList < Pair < String , ĠLong >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ Ġfilter edList ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġcreate Notification Channel ( taskId : ĠInt , task Name : ĠString ): Notification Channel { ĊĠĠĠ Ġval Ġimportance = Notification Manager . IMPORT ANCE _ HIGH ĊĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( taskId . toString (), task Name , import ance ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġdescription =" L OT ĠTask ĠNotification " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġchannel Ċ Ċ } Ċ private Ġfun Ġdisplay Task Notification ( taskId : ĠInt , task Name : String , title : ĠString , task Description : ĠString , context : ĠContext ){ ĊĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠ Ġcontext , Ġ 0 Ġ/* ĠRequest Ġcode Ġ*/, Ġintent , ĊĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġnotification = Notification Compat . Builder ( context , taskId . toString ()) ĊĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . mip map . ic _ launcher _ round ) ĊĠĠĠĠĠĠĠ Ġ. setContent Title ( title ) ĊĠĠĠĠĠĠĠ Ġ. setContent Text ( task Description ) ĊĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ HIGH ) ĊĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠ Ġval Ġnm = Notification Manager Compat . from ( context ) ĊĠĠĠ Ġnm . create Notification Channel ( create Notification Channel ( taskId , Ġtask Name )) ĊĠĠĠ Ġnm . notify ( taskId , notification . build ()) ĊĊĠĠĠ Ġif ( context . get SharedPreferences ( MainActivity . SHARED _ PREFER ENCES , ĠAppCompatActivity . MODE _ PRIVATE ). getBoolean (" HAVE _ NOTIFICATION S _ SOUND ", true )) ĊĠĠĠĠĠĠĠ ĠMedia Player . create ( context , ĠSettings . System . DEFAULT _ NOTIFICATION _ URI ). start () Ċ Ċ } Ċ Ċ class ĠTime Broadcast Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠtaskId = intent !!. getInt Extra (" taskId ", 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġmode = Ġintent . getBoolean Extra (" finished ", false ) ĊĠĠĠĠĠĠĠ Ġval Ġtask Name = Ġintent . getString Extra (" task Name ") ? :" TASK ĠNAME " ĊĠĠĠĠĠĠĠ Ġif ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Task Notification ( taskId , task Name , context !!. resources . getText ( R . string . task _ completed ). toString (), task Name Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Task Notification ( taskId , task Name , context !!. resources . getText ( R . string . task _ is _ waiting ). toString (), context . resources . getText ( R . string . time _ to _ task ). toString ()+" Ġ"+ task Name Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊĊĊĊĊ