diff options
Diffstat (limited to 'src/com/android/calendar/EventLoader.java')
-rw-r--r-- | src/com/android/calendar/EventLoader.java | 286 |
1 files changed, 0 insertions, 286 deletions
diff --git a/src/com/android/calendar/EventLoader.java b/src/com/android/calendar/EventLoader.java deleted file mode 100644 index d34b1c7c..00000000 --- a/src/com/android/calendar/EventLoader.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * 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.android.calendar; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.os.Handler; -import android.os.Process; -import android.provider.CalendarContract; -import android.provider.CalendarContract.EventDays; -import android.util.Log; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicInteger; - -public class EventLoader { - - private Context mContext; - private Handler mHandler = new Handler(); - private AtomicInteger mSequenceNumber = new AtomicInteger(); - - private LinkedBlockingQueue<LoadRequest> mLoaderQueue; - private LoaderThread mLoaderThread; - private ContentResolver mResolver; - - private static interface LoadRequest { - public void processRequest(EventLoader eventLoader); - public void skipRequest(EventLoader eventLoader); - } - - private static class ShutdownRequest implements LoadRequest { - public void processRequest(EventLoader eventLoader) { - } - - public void skipRequest(EventLoader eventLoader) { - } - } - - /** - * - * Code for handling requests to get whether days have an event or not - * and filling in the eventDays array. - * - */ - private static class LoadEventDaysRequest implements LoadRequest { - public int startDay; - public int numDays; - public boolean[] eventDays; - public Runnable uiCallback; - - /** - * The projection used by the EventDays query. - */ - private static final String[] PROJECTION = { - CalendarContract.EventDays.STARTDAY, CalendarContract.EventDays.ENDDAY - }; - - public LoadEventDaysRequest(int startDay, int numDays, boolean[] eventDays, - final Runnable uiCallback) - { - this.startDay = startDay; - this.numDays = numDays; - this.eventDays = eventDays; - this.uiCallback = uiCallback; - } - - @Override - public void processRequest(EventLoader eventLoader) - { - final Handler handler = eventLoader.mHandler; - ContentResolver cr = eventLoader.mResolver; - - // Clear the event days - Arrays.fill(eventDays, false); - - //query which days have events - Cursor cursor = EventDays.query(cr, startDay, numDays, PROJECTION); - try { - int startDayColumnIndex = cursor.getColumnIndexOrThrow(EventDays.STARTDAY); - int endDayColumnIndex = cursor.getColumnIndexOrThrow(EventDays.ENDDAY); - - //Set all the days with events to true - while (cursor.moveToNext()) { - int firstDay = cursor.getInt(startDayColumnIndex); - int lastDay = cursor.getInt(endDayColumnIndex); - //we want the entire range the event occurs, but only within the month - int firstIndex = Math.max(firstDay - startDay, 0); - int lastIndex = Math.min(lastDay - startDay, 30); - - for(int i = firstIndex; i <= lastIndex; i++) { - eventDays[i] = true; - } - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - handler.post(uiCallback); - } - - @Override - public void skipRequest(EventLoader eventLoader) { - } - } - - private static class LoadEventsRequest implements LoadRequest { - - public int id; - public int startDay; - public int numDays; - public ArrayList<Event> events; - public Runnable successCallback; - public Runnable cancelCallback; - - public LoadEventsRequest(int id, int startDay, int numDays, ArrayList<Event> events, - final Runnable successCallback, final Runnable cancelCallback) { - this.id = id; - this.startDay = startDay; - this.numDays = numDays; - this.events = events; - this.successCallback = successCallback; - this.cancelCallback = cancelCallback; - } - - public void processRequest(EventLoader eventLoader) { - Event.loadEvents(eventLoader.mContext, events, startDay, - numDays, id, eventLoader.mSequenceNumber); - - // Check if we are still the most recent request. - if (id == eventLoader.mSequenceNumber.get()) { - eventLoader.mHandler.post(successCallback); - } else { - eventLoader.mHandler.post(cancelCallback); - } - } - - public void skipRequest(EventLoader eventLoader) { - eventLoader.mHandler.post(cancelCallback); - } - } - - private static class LoaderThread extends Thread { - LinkedBlockingQueue<LoadRequest> mQueue; - EventLoader mEventLoader; - - public LoaderThread(LinkedBlockingQueue<LoadRequest> queue, EventLoader eventLoader) { - mQueue = queue; - mEventLoader = eventLoader; - } - - public void shutdown() { - try { - mQueue.put(new ShutdownRequest()); - } catch (InterruptedException ex) { - // The put() method fails with InterruptedException if the - // queue is full. This should never happen because the queue - // has no limit. - Log.e("Cal", "LoaderThread.shutdown() interrupted!"); - } - } - - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - while (true) { - try { - // Wait for the next request - LoadRequest request = mQueue.take(); - - // If there are a bunch of requests already waiting, then - // skip all but the most recent request. - while (!mQueue.isEmpty()) { - // Let the request know that it was skipped - request.skipRequest(mEventLoader); - - // Skip to the next request - request = mQueue.take(); - } - - if (request instanceof ShutdownRequest) { - return; - } - request.processRequest(mEventLoader); - } catch (InterruptedException ex) { - Log.e("Cal", "background LoaderThread interrupted!"); - } - } - } - } - - public EventLoader(Context context) { - mContext = context; - mLoaderQueue = new LinkedBlockingQueue<LoadRequest>(); - mResolver = context.getContentResolver(); - } - - /** - * Call this from the activity's onResume() - */ - public void startBackgroundThread() { - mLoaderThread = new LoaderThread(mLoaderQueue, this); - mLoaderThread.start(); - } - - /** - * Call this from the activity's onPause() - */ - public void stopBackgroundThread() { - mLoaderThread.shutdown(); - } - - /** - * Loads "numDays" days worth of events, starting at start, into events. - * Posts uiCallback to the {@link Handler} for this view, which will run in the UI thread. - * Reuses an existing background thread, if events were already being loaded in the background. - * NOTE: events and uiCallback are not used if an existing background thread gets reused -- - * the ones that were passed in on the call that results in the background thread getting - * created are used, and the most recent call's worth of data is loaded into events and posted - * via the uiCallback. - */ - public void loadEventsInBackground(final int numDays, final ArrayList<Event> events, - int startDay, final Runnable successCallback, final Runnable cancelCallback) { - - // Increment the sequence number for requests. We don't care if the - // sequence numbers wrap around because we test for equality with the - // latest one. - int id = mSequenceNumber.incrementAndGet(); - - // Send the load request to the background thread - LoadEventsRequest request = new LoadEventsRequest(id, startDay, numDays, - events, successCallback, cancelCallback); - - try { - mLoaderQueue.put(request); - } catch (InterruptedException ex) { - // The put() method fails with InterruptedException if the - // queue is full. This should never happen because the queue - // has no limit. - Log.e("Cal", "loadEventsInBackground() interrupted!"); - } - } - - /** - * Sends a request for the days with events to be marked. Loads "numDays" - * worth of days, starting at start, and fills in eventDays to express which - * days have events. - * - * @param startDay First day to check for events - * @param numDays Days following the start day to check - * @param eventDay Whether or not an event exists on that day - * @param uiCallback What to do when done (log data, redraw screen) - */ - void loadEventDaysInBackground(int startDay, int numDays, boolean[] eventDays, - final Runnable uiCallback) - { - // Send load request to the background thread - LoadEventDaysRequest request = new LoadEventDaysRequest(startDay, numDays, - eventDays, uiCallback); - try { - mLoaderQueue.put(request); - } catch (InterruptedException ex) { - // The put() method fails with InterruptedException if the - // queue is full. This should never happen because the queue - // has no limit. - Log.e("Cal", "loadEventDaysInBackground() interrupted!"); - } - } -} |