blob: 0eff1accb7aebb6a322500043d11fe2e848b3109 [file] [log] [blame]
Jeff Sharkey3f177592009-05-18 15:23:12 -07001package com.android.contacts;
2
3import android.content.AsyncQueryHandler;
4import android.content.Context;
Evan Millar5f4af702009-08-11 11:12:00 -07005import android.content.EntityIterator;
Jeff Sharkey3f177592009-05-18 15:23:12 -07006import android.database.Cursor;
7
8import java.lang.ref.WeakReference;
9
10/**
11 * Slightly more abstract {@link android.content.AsyncQueryHandler} that helps
12 * keep a {@link WeakReference} back to a callback interface. Will properly
13 * close the completed query if the listener ceases to exist.
14 * <p>
15 * Using this pattern will help keep you from leaking a {@link Context}.
16 */
17public class NotifyingAsyncQueryHandler extends AsyncQueryHandler {
Evan Millar5f4af702009-08-11 11:12:00 -070018 private WeakReference<AsyncQueryListener> mListener;
Jeff Sharkey3f177592009-05-18 15:23:12 -070019
20 /**
Evan Millar5f4af702009-08-11 11:12:00 -070021 * Interface to listen for completed query operations.
Jeff Sharkey3f177592009-05-18 15:23:12 -070022 */
Evan Millar5f4af702009-08-11 11:12:00 -070023 public interface AsyncQueryListener {
24 void onQueryComplete(int token, Object cookie, Cursor cursor);
25 void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator);
Jeff Sharkey3f177592009-05-18 15:23:12 -070026 }
27
Evan Millar5f4af702009-08-11 11:12:00 -070028 public NotifyingAsyncQueryHandler(Context context, AsyncQueryListener listener) {
Jeff Sharkey3f177592009-05-18 15:23:12 -070029 super(context.getContentResolver());
Evan Millar5f4af702009-08-11 11:12:00 -070030 setQueryListener(listener);
31 }
32
33 /**
34 * Assign the given {@link AsyncQueryListener} to receive query events from
35 * asynchronous calls. Will replace any existing listener.
36 */
37 public void setQueryListener(AsyncQueryListener listener) {
38 mListener = new WeakReference<AsyncQueryListener>(listener);
Jeff Sharkey3f177592009-05-18 15:23:12 -070039 }
40
41 /** {@inheritDoc} */
42 @Override
43 protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
Evan Millar5f4af702009-08-11 11:12:00 -070044 final AsyncQueryListener listener = mListener.get();
Jeff Sharkey3f177592009-05-18 15:23:12 -070045 if (listener != null) {
46 listener.onQueryComplete(token, cookie, cursor);
Evan Millar5f4af702009-08-11 11:12:00 -070047 } else if (cursor != null) {
Jeff Sharkey3f177592009-05-18 15:23:12 -070048 cursor.close();
49 }
50 }
Evan Millar5f4af702009-08-11 11:12:00 -070051
52 /** {@inheritDoc} */
53 @Override
54 protected void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
55 final AsyncQueryListener listener = mListener.get();
56 if (listener != null) {
57 listener.onQueryEntitiesComplete(token, cookie, iterator);
58 } else if (iterator != null) {
59 iterator.close();
60 }
61 }
Jeff Sharkey3f177592009-05-18 15:23:12 -070062}