/* * Copyright 2015. Appsi Mobile * * 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 com.appsimobile.appsii.module.appsiagenda; import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.net.Uri; import android.provider.CalendarContract; import android.support.annotation.NonNull; import android.text.format.Time; import com.appsimobile.appsii.PermissionDeniedException; import com.appsimobile.appsii.dagger.AppInjector; import com.appsimobile.appsii.permissions.PermissionUtils; import com.appsimobile.util.ConvertedCursorLoader; import com.appsimobile.util.TimeUtils; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; /** * Created by nick on 22/09/14. */ public class AgendaLoader extends ConvertedCursorLoader<AgendaEventsResult> { private static final String WHERE_CALENDARS_SELECTED = CalendarContract.Calendars.VISIBLE + "=?"; private static final String[] WHERE_CALENDARS_ARGS = { "1" }; /** * The default sort order for this table. */ private static final String DEFAULT_SORT_ORDER = "begin ASC"; int mLastLoadedDay = TimeUtils.getJulianDay(); @Inject PermissionUtils mPermissionUtils; private BroadcastReceiver mDayChangeReceiver; private BroadcastReceiver mPermissionGrantedReceiver; public AgendaLoader(Context context, DatePickerController controller) { super(context); AppInjector.inject(this); Time time = new Time(Time.TIMEZONE_UTC); time.set(1, 0, controller.getMinYear()); long millis = time.normalize(true); int startDay = Time.getJulianDay(millis, 0); time.year = controller.getMaxYear(); millis = time.normalize(true); int endDay = Time.getJulianDay(millis, 0); Uri uri = CalendarContract.Instances.CONTENT_BY_DAY_URI. buildUpon(). appendPath(String.valueOf(startDay)). appendPath(String.valueOf(endDay)).build(); setUri(uri); setProjection(CalendarQuery.projection); setSelection(WHERE_CALENDARS_SELECTED); setSelectionArgs(WHERE_CALENDARS_ARGS); setSortOrder(DEFAULT_SORT_ORDER); } @Override protected void checkPermissions() throws PermissionDeniedException { mPermissionUtils.throwIfNotPermitted(getContext(), Manifest.permission.READ_CALENDAR); } @Override protected AgendaEventsResult convertPermissionDeniedException(PermissionDeniedException e) { return new AgendaEventsResult(e); } @Override protected AgendaEventsResult convertCursor(@NonNull Cursor c) { List<AgendaEvent> result = new ArrayList<>(c.getCount()); c.moveToPosition(-1); if (c.getCount() > 0) { while (c.moveToNext()) { AgendaEvent e = new AgendaEvent(); e.allDay = c.getInt(CalendarQuery.ALL_DAY) == 1; e.calendarName = c.getString(CalendarQuery.CALENDAR_DISPLAY_NAME); e.startDay = c.getInt(CalendarQuery.START_DAY); e.startMillis = c.getLong(CalendarQuery.BEGIN); e.calendarId = c.getLong(CalendarQuery.CALENDAR_ID); e.endDay = c.getInt(CalendarQuery.END_DAY); e.endMillis = c.getLong(CalendarQuery.END); int loadColorFrom = CalendarQuery.DISPLAY_COLOR; e.color = 0xff000000 | c.getInt(loadColorFrom); e.id = c.getLong(CalendarQuery.EVENT_ID); e.title = c.getString(CalendarQuery.TITLE); result.add(e); } } return new AgendaEventsResult(result); } @Override protected void cleanup(AgendaEventsResult old) { } @Override protected void onStartLoading() { super.onStartLoading(); int julianDay = TimeUtils.getJulianDay(); if (mLastLoadedDay != julianDay) { mLastLoadedDay = julianDay; onContentChanged(); } // start monitoring for day changes to make sure the list is reloaded // whenever the date changes. mDayChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { onContentChanged(); } }; IntentFilter filter = new IntentFilter(Intent.ACTION_DATE_CHANGED); getContext().registerReceiver(mDayChangeReceiver, filter); mPermissionGrantedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int req = intent.getIntExtra(PermissionUtils.EXTRA_REQUEST_CODE, 0); if (req == PermissionUtils.REQUEST_CODE_PERMISSION_READ_CALENDAR) { onContentChanged(); } } }; IntentFilter filter2 = new IntentFilter(PermissionUtils.ACTION_PERMISSION_RESULT); getContext().registerReceiver(mPermissionGrantedReceiver, filter2); } @Override protected void onReset() { super.onReset(); // on reset, we need to remove the receiver if (mDayChangeReceiver != null) { getContext().unregisterReceiver(mDayChangeReceiver); } if (mPermissionGrantedReceiver != null) { getContext().unregisterReceiver(mPermissionGrantedReceiver); } } static class CalendarQuery { public static final int DISPLAY_COLOR = 0; public static final int ALL_DAY = 1; public static final int BEGIN = 2; public static final int END = 3; public static final int START_DAY = 4; public static final int END_DAY = 5; public static final int CALENDAR_ID = 6; public static final int TITLE = 7; public static final int EVENT_TIMEZONE = 8; public static final int EVENT_ID = 9; public static final int CALENDAR_DISPLAY_NAME = 10; static final String[] projection = { CalendarContract.Instances.DISPLAY_COLOR, CalendarContract.Instances.ALL_DAY, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END, CalendarContract.Instances.START_DAY, CalendarContract.Instances.END_DAY, CalendarContract.Instances.CALENDAR_ID, CalendarContract.Instances.TITLE, CalendarContract.Instances.EVENT_TIMEZONE, CalendarContract.Instances.EVENT_ID, CalendarContract.Instances.CALENDAR_DISPLAY_NAME, }; } }