/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠR alph ĠBer gm ann Ċ Ġ* Ċ Ġ* Ġ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 Ġeu . the 4 th floor . ms ync . sync Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . accounts . Account Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġeu . the 4 th floor . ms ync . Build Config Ċ import Ġeu . the 4 th floor . ms ync . MS ync App . Companion . CHANNEL _ ID Ċ import Ġeu . the 4 th floor . ms ync . R Ċ import Ġeu . the 4 th floor . ms ync . api . Me et up Api Ċ import Ġeu . the 4 th floor . ms ync . api . Secure Api Ċ import Ġeu . the 4 th floor . ms ync . api . models . Event Ċ import Ġeu . the 4 th floor . ms ync . api . models . Rsvp Ċ import Ġeu . the 4 th floor . ms ync . ui . Check Login Status Activity Ċ import Ġeu . the 4 th floor . ms ync . ui . Notification Permissions Activity Ċ import Ġeu . the 4 th floor . ms ync . utils . add Event Ċ import Ġeu . the 4 th floor . ms ync . utils . apply Ċ import Ġeu . the 4 th floor . ms ync . utils . check Self Permission Ċ import Ġeu . the 4 th floor . ms ync . utils . delete Events NotIn Ċ import Ġeu . the 4 th floor . ms ync . utils . get Account Ċ import Ġeu . the 4 th floor . ms ync . utils . get Calendar ID Ċ import Ġeu . the 4 th floor . ms ync . utils . get RefreshToken Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . ank o . default SharedPreferences Ċ import Ġorg . jetbrains . ank o . do From Sdk Ċ import Ġorg . jetbrains . ank o . notification Manager Ċ import Ġru . g ild or . coroutines . ret rofit . Result Ċ import Ġru . g ild or . coroutines . ret rofit . await Result Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ private Ġval ĠFI ELDS Ġ= Ġ" self , plain _ text _ description , link " Ċ private Ġval ĠONLY Ġ= Ġ" id , name , time , utc _ offset , duration , updated , venue , group , link , self , plain _ text _ description " Ċ Ċ private Ġfun ĠContext . save Events ( account : ĠAccount , Ġcalendar Id : ĠLong , Ġevents : ĠList < Event >) Ġ{ ĊĊĠĠĠ Ġval Ġsync _ yes Ġ= Ġdefault SharedPreferences . getBoolean (" pref _ key _ sync _ event _ yes ", Ġtrue ) ĊĠĠĠ Ġval Ġsync _ wait list Ġ= Ġdefault SharedPreferences . getBoolean (" pref _ key _ sync _ event _ wait list ", Ġtrue ) ĊĠĠĠ Ġval Ġsync _ un answer ed Ġ= Ġdefault SharedPreferences . getBoolean (" pref _ key _ sync _ event _ un answer ed ", Ġfalse ) ĊĠĠĠ Ġval Ġsync _ no Ġ= Ġdefault SharedPreferences . getBoolean (" pref _ key _ sync _ event _ no ", Ġfalse ) ĊĠĠĠ Ġval Ġids Ġ= Ġmutable ListOf < Long >() ĊĊĠĠĠ Ġevents . forEach Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . self . r svp ?. response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR svp . yes , ĠR svp . yes _ pending _ payment Ġ-> Ġif Ġ( sync _ yes ) Ġadd Event ( account , Ġcalendar Id , Ġevent ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR svp . no ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġif Ġ( sync _ no ) Ġadd Event ( account , Ġcalendar Id , Ġevent ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR svp . wait list ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġif Ġ( sync _ wait list ) Ġadd Event ( account , Ġcalendar Id , Ġevent ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġif Ġ( sync _ un answer ed ) Ġadd Event ( account , Ġcalendar Id , Ġevent ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġids . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġdelete Events NotIn ( ids ) Ċ } Ċ Ċ private Ġfun ĠContext . show Login Notification () Ġ{ ĊĠĠĠ Ġval Ġc : ĠContext Ġ= Ġthis ĊĠĠĠ Ġnotification Manager ĊĠĠĠĠĠĠĠ Ġ. notify ( 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Title ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Text ( getString ( R . string . please _ log _ in )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Intent ( Pending Intent . getActivity ( c , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ ĠIntent ( c , ĠCheck Login Status Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Auto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build ()) Ċ } Ċ Ċ private Ġfun ĠContext . show Permissions Notification () Ġ{ ĊĠĠĠ Ġval Ġc : ĠContext Ġ= Ġthis ĊĠĠĠ Ġnotification Manager ĊĠĠĠĠĠĠĠ Ġ. notify ( 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Title ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Text ( getString ( R . string . please _ approve _ permissions )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Intent ( Pending Intent . getActivity ( c , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ ĠIntent ( c , ĠNotification Permissions Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Auto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build ()) Ċ } Ċ Ċ fun ĠContext . sync ( secure Api : ĠSecure Api , Ġmeet up Api : ĠMe et up Api , Ġfinish : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġval Ġaccount Ġ= Ġget Account () ĊĠĠĠ Ġval Ġcalendar Id Ġ= Ġget Calendar ID () ĊĠĠĠ Ġval Ġrefresh Token Ġ= Ġget RefreshToken () ĊĠĠĠ Ġif Ġ( account Ġ== Ġnull Ġ|| Ġcalendar Id Ġ== Ġnull Ġ|| Ġrefresh Token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Login Notification () ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdo From Sdk ( Build . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ( Manifest . permission . READ _ CAL END AR , ĠManifest . permission . WRITE _ CAL END AR ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Permissions Notification () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdefault SharedPreferences . apply (" pref _ key _ last _ sync " Ġto ĠgetString ( R . string . sync ing _ now )) ĊĊĠĠĠ Ġfun Ġdone () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat . get DateTime Instance (). format ( Date ()) ĊĠĠĠĠĠĠĠ Ġdefault SharedPreferences . apply (" pref _ key _ last _ sync " Ġto ĠgetString ( R . string . last _ sync ed , Ġsdf )) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġload Token ( secure Api , Ġrefresh Token ) Ġ{ ĠaccessToken Ġ-> ĊĠĠĠĠĠĠĠ Ġload Calendar ( meet up Api , ĠaccessToken ) Ġ{ Ġevents Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Ġ{ Ġsave Events ( account , Ġcalendar Id , Ġevents ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ Ġdone () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġload Token ( secure Api : ĠSecure Api , Ġrefresh Token : ĠString , Ġhandler : Ġ( accessToken : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠTim ber . i (" refresh Token : Ġ% s ", Ġrefresh Token ) ĊĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsecure Api . access ( map Of (" client _ id " Ġto ĠBuild Config . ME ET UP _ O AUTH _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ secret " Ġto ĠBuild Config . ME ET UP _ O AUTH _ SECRET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token " Ġto Ġrefresh Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" grant _ type " Ġto Ġ" refresh _ token ")). await Result () ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Ok ĠĠĠĠĠĠĠ Ġ-> Ġhandler ( result . value . access _ token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error ĠĠĠĠ Ġ-> ĠTim ber . e ( result . exception , Ġ" failed Ġto Ġload Ġ' secure Api . access ' Ġ- Ġcode : Ġ${ result . exception . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Exception Ġ-> ĠTim ber . e ( result . exception , Ġ" Something Ġbroken ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġload Calendar ( meet up Api : ĠMe et up Api , ĠaccessToken : ĠString , Ġhandler : Ġ( events : ĠList < Event >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠTim ber . i (" accessToken : Ġ% s ", ĠaccessToken ) ĊĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmeet up Api . calendar (" Bearer Ġ$ accessToken ", ĠFI ELDS , ĠONLY ). await Result () ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Ok ĠĠĠĠĠĠĠ Ġ-> Ġhandler ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error ĠĠĠĠ Ġ-> ĠTim ber . e ( result . exception , Ġ" failed Ġto Ġload Ġ' meet up Api . calendar ' Ġ- Ġcode : Ġ${ result . exception . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Exception Ġ-> ĠTim ber . e ( result . exception , Ġ" Something Ġbroken ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ