90 likes | 252 Views
Slides prepared by Ben Pitts. November 2013. Linear Calendar. Ben Pitts Semester Project Android App Development Computer Science Dept , ODU. Linear Calendar Overview. Far Weekly Hourly. Making an interactive timeline Clock or calendar
E N D
Slides prepared by Ben Pitts November 2013 Linear Calendar Ben Pitts Semester Project Android App Development Computer Science Dept, ODU
Linear Calendar Overview Far Weekly Hourly Making an interactive timeline • Clock or calendar • Zoom-sensitive context • Far: Events collapse into series • Weekly: Events fall vertically beneath days • Hourly: Events shown on their marks • Uses device’s calendars • Existing SyncAdapters handle synchronization to Google Calendar or Exchange servers
Motivation / Problem Description Orange line: Time distance = 1 day Visual distance = 7 days Red line: Time distance = 7 days Visual distance = 1 day Traditional calendars • Inconsistent distance between points Difficult to judge distance at a glance • Fixed window position • Monthly view wastes display space on past events • Prevents viewing future events • Fixed window size • Alternate views (Yearly, weekly, daily, hourly agenda) require entirely new calendar formats • Details require drill-down views Timeline calendar • Always consistent distances Distance is intuitive at a glance • Variable window position • Simply scroll to preferred view extents • View as much past/future as needed • Variable window size • Zoom in and out at will • Detail varies by zoom • Presentation remains consistent Time distance = visual distance 1:1 correlation between days and pixels
Linear Calendar Overview Far view context • Years, months displayed • ‘Anchor’ dates: Birthdays, Anniversaries, Holidays, Major events • Conflated event series visible • Series collapsed, Event instances hidden Weeks, days • Event instances shown • Event titles visible • Events vertical beneath days Near view context: clock/agenda • Hours visible • Minutes, seconds shown dependent on scale • Events horizontal beneath the ruler at their start/end times
Components • Model/Data layer • android.provider.CalendarContract .Calendars – Multiple calendars supported .Events – Events loaded from all calendars • Custom View • onTouchEvent • Multi-touch finger tracking • Smooth panning/scaling support • onDraw • Time ruler drawn dependent on zoom level • Years, months, weeks, days, hours • Events rendered beneath ruler • Event detail varies on zoom • Events use color set to calendar
Usage Scenario • View current date/time in context of surrounding time • At a glance see event distribution • View calendar events • Get a visual feel for where events fall in time, not just by seeing the date • Explore timeline • Add/Update events
Lessons Learned • Gregorian calendar is dumb • Variable and arbitrary everything… if only we used metric time • Leap years, leap seconds, leap from balcony • Daylight Saving Time (DST) is dumb • DST nightmares • Two 1:30AMs on DST day • Programmers usually just hope users don’t try to do important things around DST changes • How do you consistently show events in the context of DST? • Time zones are dumb • Variable per country, per region, per date/time, subject to change anytime • What about someone who travels a lot? How do they need to see timezone changes? This is what time zones actually believe
More Lessons Learned • SYSTEM_UI_FLAG_HIDE_NAVIGATION steals first touch event • Google Calendar/Tasks API • Google APIs complicated to use • REST protocol needs lots of async calls and parsing • Java client library needs dozens of support libs, not optimized for Android • Android Calendar API • Only since Android 4.0+ (Nov 2011) • Sparse documentation, no sample code • Example of event recurrence per rfc2445 (iCalendar) • P15DT5H0M20S = 15 days, 5 hours and 20 seconds • FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1 = recur on the 30th of every month; or the last day of the month if the 30th doesn't exist • API only gives access to DB tables, correct RFC2445 implementation left as exercise to reader • Calendars, Events, Instances, Attendees, Reminders • Instances table holds individual instances of recurring Events • Event_id pointer to parent Event • Begin/End times in MS since epoch (UTC) • Start_day, end_day in Julian day (local timezone) • Start_minute, end_minute in minutes since midnight (what about DST?) • Events table holds details for events • Calendar_id pointer to parent Calendar • Title/Description/Event_location text • DTStart/DTEnd times in UTC milliseconds since epoch, variable timezone for both
Future Work Core functionality stuff (i.e. what’s missing) • Better navigation • Snap back to now, save/restore views • Event interaction (Create, Update, Delete) • UI stuff • Event recurrence (RFC2445) • Correct Daylight Savings • Instance conflation • Changes to instances get saved as new Events, need to declutter event viewing • Proper data layer • Async data loading, caching More functionality • Dynamic event layout beneath ruler • Extend organization into existing Event properties • Keep the DB in the cloud, but add functionality like… • Google Tasks integration • Link tasks with Events • Calendar customization • Custom weeks/weekends • Manage events between multiple calendars More future stuff… • Multiple timelines for TimeZone changes • Remove epoch dependency • Event planning/requisites • Loose annotations • Support S-Pen • Virtual whiteboard • Display of additional data tracks • Pictures • SMS/Emails/IMs • Twits, Faceboxes, Instagrammas, YoubTubesetc • RSS feeds, news • External time scale data • Weather, day/night, tides, moon phases • Bank account balance • Diary data: Tracking workouts, weight loss, anxiety/depression, smoking • Integration with Web Google Calendar interface • iOS support (aahahahhhahahhahahha)