androidandroid-studiogoogle-calendar-apiandroid-googleapiclient

How can I take the Google Calendar free slots list for the current date using Android Studio?


I take the Event list from the Android developer tutorial like this:

  private List<String> getDataFromApi() throws IOException {
        // List the next 10 events from the primary calendar.
        DateTime now = new DateTime(System.currentTimeMillis());
        List<String> eventStrings = new ArrayList<String>();
        List<String> tests = new ArrayList<String>();

        Events events = mService.events().list("primary")
                .setMaxResults(10)
                .setTimeMin(now)
                .setOrderBy("startTime")
                .setSingleEvents(true)
                .execute();


        List<Event> items = events.getItems();

        for (Event event : items) {
            DateTime start = event.getStart().getDateTime();

            if (start == null) {
                // All-day events don't have start times, so just use
                // the start date.
                start = event.getStart().getDate();
            }
            eventStrings.add(
                    String.format("%s (%s) test", event.getSummary(), start));
        }

        return eventStrings;
    }

And also, the following post has a similar question:

Google Calendar API: get list of free slots on specified day.

But I am stuck on how to convert that answer to Android Studio (Java).

Please guide me on how to do this - thank you.


Solution

  • Considering DateTime is org.joda.time.DateTime from Joda library, it would roughly translate to this -

    N.B: DateTime comparisons would depend on your used class, so most likely you will need to change those. Don't blindly copy-paste

    class MyEvent implements  Comparable<MyEvent>{
            public DateTime startDate; // org.joda.time.DateTime
            public DateTime endDate; // org.joda.time.DateTime
    
            public MyEvent(DateTime startDate, DateTime endDate) {
                this.startDate = startDate;
                this.endDate = endDate;
            }
            /**
             *
             * @param  anotherEvent
             * @return 0 for same time, 1 : this>anotherEvent, -1 : this<anotherEvent
             */
            @Override
            public int compareTo(@NonNull MyEvent anotherEvent) {
                // implement 0/1/-1 based on your DateTime object
    
                return 0;
            }
        }
    
    
        private void calender(){
    
            // List the next 10 events from the primary calendar.
            DateTime startDate = new DateTime(System.currentTimeMillis()); // org.joda.time.DateTime
            DateTime endDate  = startDate.plusHours(24); //endData 24 hours from start date
    
            DateTime rootStart = startDate;
            DateTime rootEnd = endDate;
            List<String> eventStrings = new ArrayList<String>();
            List<String> tests = new ArrayList<String>();
    
            Events events = mService.events().list("primary")
                    .setMaxResults(10)
                    .setTimeMax(endDate)
                    .setTimeMin(startDate)
                    .setOrderBy("startTime")
                    .setSingleEvents(true)
                    .execute();
    
    
            List<Event> items = events.getItems();
    
            int interval = 2 ; // how big single slot should be (in this case 2 hrs)
            ArrayList<MyEvent> freeSlots = new ArrayList<MyEvent>();
            for (int index =0;index<items.size();index++) {
                Event event = items.get(index);
                DateTime eventStart = event.getStart().getDateTime(); // TODO: create org.joda.time.DateTime obj using the return value of getDateTime()
                DateTime eventEnd = event.getEnd().getDateTime(); // TODO: create org.joda.time.DateTime obj using the return value of getDateTime()
    
                if (index == 0 && startDate.isBefore(eventStart) ) { 
                    freeSlots.add( new MyEvent(startDate,eventStart) );
                }
                else if (index == 0) {
                    startDate = event.getEnd().getDateTime(); // TODO: create org.joda.time.DateTime obj using the return value of getDateTime()
                }
                else if (events.get(index - 1).getEnd().getDateTime() /* // TODO: create org.joda.time.DateTime obj using the return value of getDateTime() */.isBefore(eventStart)==-1) {
                    freeSlots.add(new MyEvent(items.get(index - 1).getEnd().getDateTime() /* // TODO: create org.joda.time.DateTime obj using the return value of getDateTime() */,eventStart));
                }
    
                if (items.size() == (index + 1) && event.getEnd().getDateTime().isBefore(endDate)) {
                    freeSlots.add(new MyEvent(eventEnd, endDate));
                }
            }
            if (items.size() == 0) {
                freeSlots.add(new MyEvent(startDate,endDate));
            }
    
            ArrayList<MyEvent> hourSlots = new ArrayList<MyEvent>();
            MyEvent temp = null;
            for(int index =0;index<freeSlots.size();index++){
                MyEvent free = (MyEvent) freeSlots.get(index);
    
                int freeHours = free.endDate.getHourOfDay()- free.startDate.getHourOfDay();
                DateTime freeStart = free.startDate, freeEnd = free.endDate;
                while(freeStart.getHourOfDay()+freeHours+interval>=0) { // 11 + 4 + 2 >= 0
                    if(freeHours>=interval) {
                        temp.startDate = free.startDate;
                        temp.endDate= temp.endDate.hourOfDay().setCopy(temp.endDate.getHourOfDay()+freeHours);
                        temp.startDate = free.startDate;
                        temp.startDate = temp.startDate.hourOfDay().setCopy(temp.startDate.getHourOfDay()+freeHours-interval);
                        if(temp.startDate.getHourOfDay() >= rootStart.getHourOfDay() && temp.endDate.getHourOfDay() <= rootEnd.getHourOfDay()) {
                            hourSlots.add(new MyEvent(temp.startDate,temp.endDate));
                            temp = null;
                        }
                    }
                    freeHours--;
                }
            }
        }
    

    In your build.gradle add -

    implementation 'joda-time:joda-time:2.10'