package Ġnet . planner . planet Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Calendar Contract Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList ĊĊ Ċ class ĠGoogle Cal ender Com municator Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Google Cal ender Com municator " ĊĠĠĠ Ġprivate Ġval ĠONE _ MONTH _ M ILL IS Ġ= ĠTimeUnit . DAYS . to Millis ( 3 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġcal ender Ids Ġ= Ġmutable Set Of < Long >() ĊĠĠĠ Ġprivate Ġvar Ġmain Calendar ID Ġ= Ġ 1 L Ġ// ĠCalendar Ġto Ġinsert Ġnew Ġevents Ġinto Ġby Ġdefault . ĠSelected Ġas Ġa Ġcalendar Ġwith Ġthe Ġending Ġg mail . com Ġor Ġ Ġdefault Ġ 1 ĊĊĊĠĠĠ Ġ// ĠProjection Ġarray . ĠCreating Ġindices Ġfor Ġthis Ġarray Ġinstead Ġof Ġdoing ĊĠĠĠ Ġ// Ġdynamic Ġlook ups Ġimproves Ġperformance . ĊĠĠĠ Ġprivate Ġval ĠCAL END AR _ PRO JECTION : ĠArray < String > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Cal endars ._ ID , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Cal endars . CAL END AR _ DISPLAY _ NAME , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Cal endars . OWNER _ ACCOUNT , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Cal endars . IS _ PRIMARY ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval ĠEVENT _ INSTANCE _ PRO JECTION : ĠArray < String > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Instances . EVENT _ ID , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Instances . BEGIN , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Instances . END ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġprivate Ġval ĠEVENT _ PRO JECTION : ĠArray < String > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events ._ ID , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . TITLE , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . DESCRIPTION , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . ALL _ DAY , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . AVAIL ABILITY , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . EVENT _ LOCATION , ĊĠĠĠĠĠĠĠ ĠCalendar Contract . Events . DISPLAY _ COLOR ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPER MISSION _ REQUEST _ CODE Ġ= Ġ 9 9 ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġindices Ġfor ĠCal ender Ġprojection Ġarray ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO JECTION _ ID _ INDEX : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO JECTION _ DISPLAY _ NAME _ INDEX : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO JECTION _ OWNER _ ACCOUNT _ INDEX : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO JECTION _ IS _ MAIN _ ACCOUNT _ INDEX : ĠInt Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġindices Ġfor ĠEvent ĠInstances Ġprojection Ġarray ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ INSTANCE _ ID _ INDEX : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ INSTANCE _ BEGIN _ INDEX : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ INSTANCE _ END _ INDEX : ĠInt Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġindices Ġfor ĠEvent Ġprojection Ġarray ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ ID _ INDEX : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ TITLE _ INDEX : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ DESCRIPTION _ INDEX : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ ALL _ DAY _ INDEX : ĠInt Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ AVAIL ABILITY _ INDEX : ĠInt Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ EVENT _ LOCATION _ INDEX : ĠInt Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ DISPLAY _ COLOR _ INDEX : ĠInt Ġ= Ġ 6 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġfind Account Cal endars ( content Resolver : ĠContent Resolver ): Ġ ĠMutable Collection < Long > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġquery Ġto Ġget Ġall Ġcal endars Ġin Ġdevice ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri Ġ= ĠCalendar Contract . Cal endars . CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġval Ġcur : ĠCursor ? Ġ= Ġcontent Resolver . query ( uri , ĠCAL END AR _ PRO JECTION , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcal ender ĠId 's ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cur ?. moveTo Next () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal ender ID : ĠLong Ġ= Ġcur . getLong ( PRO JECTION _ ID _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName : ĠString Ġ= Ġcur . getString ( PRO JECTION _ DISPLAY _ NAME _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Name : ĠString Ġ= Ġcur . getString ( PRO JECTION _ OWNER _ ACCOUNT _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Ġ: ĠInt Ġ= Ġcur . getInt ( PRO JECTION _ IS _ MAIN _ ACCOUNT _ INDEX ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( displayName . contains (" gmail ") Ġ&& Ġprimary Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" find Account Cal endars : ĠPrimary Ġand ĠG mail !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Calendar ID Ġ= Ġcal ender ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal ender Ids . add ( cal ender ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" find Account Cal endars : ĠFound Ġcal ender Ġwith Ġname Ġ$ displayName Ġand Ġid Ġ$ cal ender ID Ġof Ġowner Ġ$ owner Name Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcur ?. close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcal ender Ids ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġinsert Event ( content Resolver : ĠContent Resolver ?, Ġinserted Event : ĠPl anner Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal ender Id Ġ: ĠLong Ġ= Ġmain Calendar ID , Ġtimezone : ĠString ? Ġ= Ġnull ) Ġ: ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Millis Ġ= Ġinserted Event . startTime ĊĠĠĠĠĠĠĠ Ġval Ġend Millis Ġ= Ġinserted Event . endTime ĊĠĠĠĠĠĠĠ Ġval Ġevent Title Ġ= Ġinserted Event . title ĊĠĠĠĠĠĠĠ Ġval Ġevent Description Ġ= Ġinserted Event . description ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . DT START , Ġstart Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . DT END , Ġend Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . TITLE , Ġevent Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . DESCRIPTION , Ġevent Description ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . CAL END AR _ ID , Ġcal ender Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Calendar Contract . Events . EVENT _ TIME ZONE , Ġtimezone Ġ?: ĠTime Zone . getDefault (). displayName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri ? Ġ= Ġcontent Resolver ?. insert ( Calendar Contract . Events . CONTENT _ URI , Ġvalues ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġevent ĠID Ġthat Ġis Ġthe Ġlast Ġelement Ġin Ġthe ĠUri ĊĠĠĠĠĠĠĠ Ġval Ġevent ID : ĠLong Ġ= Ġuri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . last Path Segment ?. to Long () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġevent ID ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġinsert Trial Event ( content Resolver : ĠContent Resolver ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġstart Millis Ġ= ĠSystem . currentTimeMillis () Ċ // ĠĠĠĠĠĠĠ Ġval Ġend Millis Ġ= Ġstart Millis Ċ // ĠĠĠĠĠĠĠ Ġval Ġevent Title Ġ= Ġ" try ing Ġlibrary " Ċ // ĠĠĠĠĠĠĠ Ġval Ġcalendar Id Ġ= Ġ 3 L Ċ // ĠĠĠĠĠĠĠ Ġval Ġtime Zone Ġ= ĠTime Zone . getDefault (). displayName Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Time Ġzone Ġis Ġ$ time Zone Ġ") Ċ // ĠĠĠĠĠĠĠ Ġinsert Event ( content Resolver , Ġstart Millis , Ġend Millis , Ġevent Title , Ġcalendar Id , Ġtime Zone ) Ċ // ĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġprivate Ġfun Ġget Calendar Events ( content Resolver : ĠContent Resolver , Ġcal ender Id : ĠLong , Ġstart Millis : ĠLong , Ġend Millis : ĠLong ) Ġ: ĠMutable Collection < Planner Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGetting Ġevents Ġprocess : ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠGet Ġthe Ġevent Ġinformation Ġfrom Ġthe ĠEvents Ġtable . ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠFor Ġeach Ġevent , Ġcheck Ġif Ġit 's Ġan Ġall Ġday Ġevent . ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠFor Ġeach Ġevent , Ġadd Ġall Ġthe Ġinstances Ġfrom Ġthe ĠInstances Ġtable . ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . ĠFor Ġeach Ġinstance , Ġconvert Ġtime Ġto Ġcurrent Ġtimezone Ġif Ġneeded . ĊĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġmutable ListOf < Planner Event >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġquery Ġto Ġget Ġall Ġevent Ġinstances Ġin Ġthe Ġcalendar ĊĠĠĠĠĠĠĠ Ġval Ġinstances Selection : ĠString Ġ= Ġ"${ Calendar Contract . Instances . CAL END AR _ ID } Ġ= Ġ? " ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠUri . Builder Ġ= ĠCalendar Contract . Instances . CONTENT _ URI . build Up on () ĊĠĠĠĠĠĠĠ ĠContent U ris . append Id ( builder , Ġstart Millis ) ĊĠĠĠĠĠĠĠ ĠContent U ris . append Id ( builder , Ġend Millis ) ĊĊĠĠĠĠĠĠĠ Ġval Ġselection Args : ĠArray < String > Ġ= ĠarrayOf ( cal ender Id . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġinstances Cur : ĠCursor ? Ġ= Ġcontent Resolver . query ( builder . build (), ĠEVENT _ INSTANCE _ PRO JECTION , Ġinstances Selection , Ġselection Args , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( instances Cur ?. moveTo Next () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġinstance Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent ID : ĠLong Ġ= Ġinstances Cur . getLong ( PRO JECTION _ EVENT _ INSTANCE _ ID _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Start : ĠString Ġ= Ġinstances Cur . getString ( PRO JECTION _ EVENT _ INSTANCE _ BEGIN _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent End : ĠString Ġ= Ġinstances Cur . getString ( PRO JECTION _ EVENT _ INSTANCE _ END _ INDEX ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġ- ĠThe ĠCalendar Ġobject Ġis Ġcreated Ġwith Ġdefault ĠLocale Ġand ĠTime zone . ĠIt Ġexpects Ġtime Ġin Ġmilliseconds Ġin ĠUTC Ġfrom Ġthe Ġepoch Ġand Ġconverts Ġit Ġto Ġthe Ġdefault Ġtimezone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartDate Ġ= ĠCalendar . getInstance (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime In Millis Ġ= Ġevent Start . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendDate Ġ= ĠCalendar . getInstance (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime In Millis Ġ= Ġevent End . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠSimpleDateFormat (" MM / dd / yyyy ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Calendar Events : Ġfound Ġevent Ġwith Ġid Ġ$ event ID , Ġstarts Ġ${ formatter . format ( startDate . time )} Ġends Ġ${ formatter . format ( endDate . time )} Ġfrom Ġcalendar Ġ$ cal ender Id Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġdetails Ġof Ġthis Ġevent Ġfrom Ġthe ĠEvents Ġtable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Uri : ĠUri Ġ= ĠCalendar Contract . Events . CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Selection : ĠString Ġ= Ġ"${ Calendar Contract . Events ._ ID } Ġ= Ġ? " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Selection Args : ĠArray < String > Ġ= ĠarrayOf ( event ID . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Cur : ĠCursor ? Ġ= Ġcontent Resolver . query ( events Uri , ĠEVENT _ PRO JECTION , Ġevents Selection , Ġevent Selection Args , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( events Cur ?. moveTo Next () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġ= Ġevents Cur . getLong ( PRO JECTION _ EVENT _ ID _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle : ĠString Ġ= Ġevents Cur . getString ( PRO JECTION _ EVENT _ TITLE _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString Ġ= Ġevents Cur . getString ( PRO JECTION _ DESCRIPTION _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Day : ĠInt Ġ= Ġevents Cur . getInt ( PRO JECTION _ ALL _ DAY _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailability : ĠInt Ġ= Ġevents Cur . getInt ( PRO JECTION _ AVAIL ABILITY _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation : ĠString Ġ= Ġevents Cur . getString ( PRO JECTION _ EVENT _ LOCATION _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor : ĠInt Ġ= Ġevents Cur . getInt ( PRO JECTION _ DISPLAY _ COLOR _ INDEX ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Calendar Events : Ġfound Ġevent Ġwith Ġid Ġ$ id , Ġtitle d Ġ${ title } Ġwith Ġdescription : Ġ${ description } Ġis Ġall Ġday ? Ġ$ all Day Ġcan Ġbe Ġscheduled Ġover ? Ġ$ availability , Ġin Ġlocation Ġ$ location Ġ Ġwith Ġcolor : Ġ$ color Ġfrom Ġcalendar : Ġ$ cal ender Id Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠPl anner Event ( title , Ġ ĠstartDate . time In Millis , ĠendDate . time In Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . setLocation ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . tagName Ġ= Ġcolor . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . exclusive For Its Time Slot Ġ= ĠCalendar Contract . Events . AVAIL ABILITY _ BUSY Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . set EventId ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . set All Day ( all Day Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . setDescription ( description ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents Cur ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstances Cur ?. close () ĊĠĠĠĠĠĠĠ Ġreturn Ġevents ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠgetUser Events ( caller : Activity , Ġstart Millis : ĠLong ? Ġ= Ġnull , Ġend Millis : ĠLong ? Ġ= Ġnull ) Ġ: ĠMutable Collection < Planner Event >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! have Calendar ReadWrite Permissions ( caller )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Calendar ReadWrite Permission ( caller ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Needed Ġpermissions Ġ- Ġreturning ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġcaller . content Resolver ĊĠĠĠĠĠĠĠ Ġfind Account Cal endars ( content Resolver ) ĊĊĠĠĠĠĠĠĠ Ġval Ġall Events Ġ= Ġmutable ListOf < Planner Event >() ĊĠĠĠĠĠĠĠ Ġval Ġstrong Start Millis Ġ= Ġstart Millis Ġ?: ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġstrong End Millis Ġ= Ġend Millis Ġ?: Ġstrong Start Millis Ġ+ ĠONE _ MONTH _ M ILL IS ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cal ender Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġcal ender Ids Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġget Calendar Events ( content Resolver , Ġid , Ġstrong Start Millis , Ġstrong End Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Events . addAll ( events ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" getUser Events : ĠNo Ġcalendar ĠI ds ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġall Events ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrequest Calendar ReadWrite Permission ( caller : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpermission List : ĠMutable List < String > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( caller , ĠManifest . permission . WRITE _ CAL END AR ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission List . add ( Manifest . permission . WRITE _ CAL END AR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( caller , ĠManifest . permission . READ _ CAL END AR ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission List . add ( Manifest . permission . READ _ CAL END AR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permission List . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Array Ġ= ĠarrayOf Null s < String >( permission List . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpermission List . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Array [ i ] Ġ= Ġpermission List [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġhave Calendar ReadWrite Permissions ( caller : ĠActivity ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġpermission Check Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaller , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ CAL END AR ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permission Check Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Check Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ CAL END AR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Check Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ Ċ }