1a3cb716626b477c98ba912698c765eab20f27286Jim Millerpackage com.android.ex.carousel;
2a3cb716626b477c98ba912698c765eab20f27286Jim Miller
3a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.content.Context;
4a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.Bitmap;
5a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.Matrix;
6e8cab95c5f73ddf6843d82793decc3adb4692860Jim Shumaimport android.graphics.Rect;
7a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.os.Handler;
8a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.os.HandlerThread;
9a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.os.Looper;
10a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.os.Message;
11c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shumaimport android.renderscript.Matrix4f;
12a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.renderscript.Mesh;
13a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.util.Log;
14a3cb716626b477c98ba912698c765eab20f27286Jim Miller
15a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport com.android.ex.carousel.CarouselRS.CarouselCallback;
16a3cb716626b477c98ba912698c765eab20f27286Jim Miller
17a3cb716626b477c98ba912698c765eab20f27286Jim Miller/**
18a3cb716626b477c98ba912698c765eab20f27286Jim Miller * CarouselViewHelper wraps all of the threading and event handling of the CarouselView,
19a3cb716626b477c98ba912698c765eab20f27286Jim Miller * providing a simpler interface.  Most users will just need to implement a handful of
20a3cb716626b477c98ba912698c765eab20f27286Jim Miller * methods to get an application working.
21a3cb716626b477c98ba912698c765eab20f27286Jim Miller *
22a3cb716626b477c98ba912698c765eab20f27286Jim Miller */
23a3cb716626b477c98ba912698c765eab20f27286Jim Millerpublic class CarouselViewHelper implements CarouselCallback {
24a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final String TAG = "CarouselViewHelper";
25a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int SET_TEXTURE_N = 1;
26a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int SET_DETAIL_TEXTURE_N = 2;
27a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int SET_GEOMETRY_N = 3;
28c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma    private static final int SET_MATRIX_N = 4;
29a3cb716626b477c98ba912698c765eab20f27286Jim Miller
30a3cb716626b477c98ba912698c765eab20f27286Jim Miller    // This is an ordered list of base message ids to allow removal of a single item from the
31a3cb716626b477c98ba912698c765eab20f27286Jim Miller    // list for a particular card. The implementation currently supports up to a million cards.
32a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int REQUEST_TEXTURE_N = 1000000;
33a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int REQUEST_DETAIL_TEXTURE_N = 2000000;
34a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int REQUEST_GEOMETRY_N = 3000000;
35a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private static final int REQUEST_END = 4000000;
36a3cb716626b477c98ba912698c765eab20f27286Jim Miller
37a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private HandlerThread mHandlerThread;
38a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private Context mContext;
39a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private CarouselView mCarouselView;
402ba04e061b52c488a154739379501dc833e39f79Jim Miller    private boolean DBG = false;
41a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private long HOLDOFF_DELAY = 100;
42a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private Handler mAsyncHandler; // Background thread handler for reading textures, geometry, etc.
43a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private Handler mSyncHandler; // Synchronous handler for interacting with UI elements.
44a3cb716626b477c98ba912698c765eab20f27286Jim Miller
450eb8cac611ca6d82dced0995d2ead3886c647170Jack Palevich    public static class TextureParameters {
46c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma        public TextureParameters() { matrix = new Matrix4f(); }
47c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma        public TextureParameters(Matrix4f _matrix) { matrix = _matrix; }
48c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma        public Matrix4f matrix;
49a3cb716626b477c98ba912698c765eab20f27286Jim Miller    };
50a3cb716626b477c98ba912698c765eab20f27286Jim Miller
510eb8cac611ca6d82dced0995d2ead3886c647170Jack Palevich    public static class DetailTextureParameters {
52b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public DetailTextureParameters(float textureOffsetX, float textureOffsetY) {
53b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.textureOffsetX = textureOffsetX;
54b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.textureOffsetY = textureOffsetY;
55b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.lineOffsetX = 0.0f;
56b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.lineOffsetY = 0.0f;
57a3cb716626b477c98ba912698c765eab20f27286Jim Miller        }
58b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public DetailTextureParameters(
59b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                float textureOffsetX, float textureOffsetY,
60b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                float lineOffsetX, float lineOffsetY) {
61b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.textureOffsetX = textureOffsetX;
62b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.textureOffsetY = textureOffsetY;
63b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.lineOffsetX = lineOffsetX;
64b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            this.lineOffsetY = lineOffsetY;
65b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        }
66b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public float textureOffsetX;
67b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public float textureOffsetY;
68b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public float lineOffsetX;
69b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller        public float lineOffsetY;
70a3cb716626b477c98ba912698c765eab20f27286Jim Miller    };
71a3cb716626b477c98ba912698c765eab20f27286Jim Miller
72a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void setCarouselView(CarouselView carouselView) {
73a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mCarouselView = carouselView;
74a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mCarouselView.setCallback(this);
75a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
76a3cb716626b477c98ba912698c765eab20f27286Jim Miller
77a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public CarouselViewHelper(Context context, CarouselView carouselView) {
78a3cb716626b477c98ba912698c765eab20f27286Jim Miller        this(context);
79a3cb716626b477c98ba912698c765eab20f27286Jim Miller        setCarouselView(carouselView);
80a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
81a3cb716626b477c98ba912698c765eab20f27286Jim Miller
82a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public CarouselViewHelper(Context context) {
83a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mContext = context;
84a3cb716626b477c98ba912698c765eab20f27286Jim Miller
85a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHandlerThread = new HandlerThread(TAG + ".handler");
86a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHandlerThread.start();
87a3cb716626b477c98ba912698c765eab20f27286Jim Miller
88a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler = new AsyncHandler(mHandlerThread.getLooper());
89a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mSyncHandler = new SyncHandler(); // runs in calling thread
90a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
91a3cb716626b477c98ba912698c765eab20f27286Jim Miller
92a3cb716626b477c98ba912698c765eab20f27286Jim Miller    class AsyncHandler extends Handler {
93a3cb716626b477c98ba912698c765eab20f27286Jim Miller        AsyncHandler(Looper looper) {
94a3cb716626b477c98ba912698c765eab20f27286Jim Miller            super(looper);
95a3cb716626b477c98ba912698c765eab20f27286Jim Miller        }
96a3cb716626b477c98ba912698c765eab20f27286Jim Miller
97a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
98a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public void handleMessage(Message msg) {
99a3cb716626b477c98ba912698c765eab20f27286Jim Miller            int id = msg.arg1;
100a3cb716626b477c98ba912698c765eab20f27286Jim Miller            if (id >= mCarouselView.getCardCount()) {
101a3cb716626b477c98ba912698c765eab20f27286Jim Miller                Log.e(TAG, "Index out of range for get, card:" + id);
102a3cb716626b477c98ba912698c765eab20f27286Jim Miller                return;
103a3cb716626b477c98ba912698c765eab20f27286Jim Miller            }
104a3cb716626b477c98ba912698c765eab20f27286Jim Miller            if (msg.what < REQUEST_TEXTURE_N || msg.what > REQUEST_END) {
105a3cb716626b477c98ba912698c765eab20f27286Jim Miller                Log.e(TAG, "Unknown message: " + id);
106a3cb716626b477c98ba912698c765eab20f27286Jim Miller                return;
107a3cb716626b477c98ba912698c765eab20f27286Jim Miller            }
108a3cb716626b477c98ba912698c765eab20f27286Jim Miller            if (msg.what < REQUEST_DETAIL_TEXTURE_N) {
109a3cb716626b477c98ba912698c765eab20f27286Jim Miller                // REQUEST_TEXTURE_N
110a3cb716626b477c98ba912698c765eab20f27286Jim Miller                final Bitmap bitmap = getTexture(id);
111a3cb716626b477c98ba912698c765eab20f27286Jim Miller                if (bitmap != null) {
112a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    mSyncHandler.obtainMessage(SET_TEXTURE_N, id, 0, bitmap).sendToTarget();
113a3cb716626b477c98ba912698c765eab20f27286Jim Miller                }
114c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma
115c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                TextureParameters params = getTextureParameters(id);
116c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                if (params != null) {
117c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                    mSyncHandler.obtainMessage(SET_MATRIX_N, id, 0,
118c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                            params.matrix.getArray()).sendToTarget();
119c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                }
120a3cb716626b477c98ba912698c765eab20f27286Jim Miller            } else if (msg.what < REQUEST_GEOMETRY_N) {
121a3cb716626b477c98ba912698c765eab20f27286Jim Miller                // REQUEST_DETAIL_TEXTURE_N
122a3cb716626b477c98ba912698c765eab20f27286Jim Miller                final Bitmap bitmap = getDetailTexture(id);
123a3cb716626b477c98ba912698c765eab20f27286Jim Miller                if (bitmap != null) {
124a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    mSyncHandler.obtainMessage(SET_DETAIL_TEXTURE_N, id, 0, bitmap).sendToTarget();
125a3cb716626b477c98ba912698c765eab20f27286Jim Miller                }
126a3cb716626b477c98ba912698c765eab20f27286Jim Miller            } else if (msg.what < REQUEST_END) {
127a3cb716626b477c98ba912698c765eab20f27286Jim Miller                // REQUEST_GEOMETRY_N
128a3cb716626b477c98ba912698c765eab20f27286Jim Miller                Mesh mesh = getGeometry(id);
129a3cb716626b477c98ba912698c765eab20f27286Jim Miller                if (mesh != null) {
130a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    mSyncHandler.obtainMessage(SET_GEOMETRY_N, id, 0, mesh).sendToTarget();
131a3cb716626b477c98ba912698c765eab20f27286Jim Miller                }
132a3cb716626b477c98ba912698c765eab20f27286Jim Miller            }
133a3cb716626b477c98ba912698c765eab20f27286Jim Miller        }
134a3cb716626b477c98ba912698c765eab20f27286Jim Miller    };
135a3cb716626b477c98ba912698c765eab20f27286Jim Miller
136a3cb716626b477c98ba912698c765eab20f27286Jim Miller    class SyncHandler extends Handler {
137a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
138a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public void handleMessage(Message msg) {
139a3cb716626b477c98ba912698c765eab20f27286Jim Miller            int id = msg.arg1;
140a3cb716626b477c98ba912698c765eab20f27286Jim Miller            if (id >= mCarouselView.getCardCount()) {
141a3cb716626b477c98ba912698c765eab20f27286Jim Miller                Log.e(TAG, "Index out of range for set, card:" + id);
142a3cb716626b477c98ba912698c765eab20f27286Jim Miller                return;
143a3cb716626b477c98ba912698c765eab20f27286Jim Miller            }
144a3cb716626b477c98ba912698c765eab20f27286Jim Miller
145a3cb716626b477c98ba912698c765eab20f27286Jim Miller            switch (msg.what) {
146a3cb716626b477c98ba912698c765eab20f27286Jim Miller                case SET_TEXTURE_N:
147a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    mCarouselView.setTextureForItem(id, (Bitmap) msg.obj);
148a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    break;
149a3cb716626b477c98ba912698c765eab20f27286Jim Miller
150a3cb716626b477c98ba912698c765eab20f27286Jim Miller                case SET_DETAIL_TEXTURE_N:
151a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    DetailTextureParameters params = getDetailTextureParameters(id);
152b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    float x = params != null ? params.textureOffsetX : 0.0f;
153b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    float y = params != null ? params.textureOffsetY : 0.0f;
154b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    float lx = params != null ? params.lineOffsetX : 0.0f;
155b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    float ly = params != null ? params.lineOffsetY : 0.0f;
156b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    mCarouselView.setDetailTextureForItem(id, x, y, lx, ly, (Bitmap) msg.obj);
157a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    break;
158a3cb716626b477c98ba912698c765eab20f27286Jim Miller
159a3cb716626b477c98ba912698c765eab20f27286Jim Miller                case SET_GEOMETRY_N:
160a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    mCarouselView.setGeometryForItem(id, (Mesh) msg.obj);
161a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    break;
162c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma
163c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                case SET_MATRIX_N:
164c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                    mCarouselView.setMatrixForItem(id, (float[]) msg.obj);
165c2baf88a763ae0e3694c8a10c13f203db9aec363Jim Shuma                    break;
166a3cb716626b477c98ba912698c765eab20f27286Jim Miller            }
167a3cb716626b477c98ba912698c765eab20f27286Jim Miller        }
168a3cb716626b477c98ba912698c765eab20f27286Jim Miller    };
169a3cb716626b477c98ba912698c765eab20f27286Jim Miller
170a3cb716626b477c98ba912698c765eab20f27286Jim Miller    /**
171a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * Implement this method if you want to load a texture for
172a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * the given card.  Most subclasses will implement this. Note: this will generally
173a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * <b>not</b> be called in the UI thread, so proper locking should be ensured.
174a3cb716626b477c98ba912698c765eab20f27286Jim Miller     *
175a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @param id of the texture to load
176a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @return a valid bitmap
177a3cb716626b477c98ba912698c765eab20f27286Jim Miller     */
178a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public Bitmap getTexture(int id) {
179a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return null;
180a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
181a3cb716626b477c98ba912698c765eab20f27286Jim Miller
182a3cb716626b477c98ba912698c765eab20f27286Jim Miller    /**
183a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * Implement this method if you want to load a detail texture for
184a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * the given card.  Most subclasses will implement this. Note: this will generally
185a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * <b>not</b> be called in the UI thread, so proper locking should be ensured.
186a3cb716626b477c98ba912698c765eab20f27286Jim Miller     *
187a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @param id
188a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @return
189a3cb716626b477c98ba912698c765eab20f27286Jim Miller     */
190a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public Bitmap getDetailTexture(int id) {
191a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return null;
192a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
193a3cb716626b477c98ba912698c765eab20f27286Jim Miller
194a3cb716626b477c98ba912698c765eab20f27286Jim Miller    /**
195a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * Implement this method if you want to load geometry for the given card.  Most subclasses
196a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * will implement this. Note: this will generally <b>not</b> be called in the UI thread,
197a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * so proper locking should be ensured.
198a3cb716626b477c98ba912698c765eab20f27286Jim Miller     *
199a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @param id
200a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @return
201a3cb716626b477c98ba912698c765eab20f27286Jim Miller     */
202eb71cf6812bdb53bda75ac37a185f78f43ddfcefJim Shuma    public Mesh getGeometry(int id) {
203a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return null;
204a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
205a3cb716626b477c98ba912698c765eab20f27286Jim Miller
206a3cb716626b477c98ba912698c765eab20f27286Jim Miller    /**
207a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * Implement this method if you want custom texture parameters for
208a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * the given id. Note: this will generally
209a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * <b>not</b> be called in the UI thread, so proper locking should be ensured.
210a3cb716626b477c98ba912698c765eab20f27286Jim Miller     *
211a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @param id
212a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @return texture parameters
213a3cb716626b477c98ba912698c765eab20f27286Jim Miller     */
214a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public TextureParameters getTextureParameters(int id) {
215a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return null;
216a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
217a3cb716626b477c98ba912698c765eab20f27286Jim Miller
218a3cb716626b477c98ba912698c765eab20f27286Jim Miller    /**
219a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * Implement this method if you want custom detail texture parameters for
220a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * the given id. Note: this will generally
221a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * <b>not</b> be called in the UI thread, so proper locking should be ensured.
222a3cb716626b477c98ba912698c765eab20f27286Jim Miller     *
223a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @param id the id of the texture being requested
224a3cb716626b477c98ba912698c765eab20f27286Jim Miller     * @return detail texture parameters
225a3cb716626b477c98ba912698c765eab20f27286Jim Miller     */
226a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public DetailTextureParameters getDetailTextureParameters(int id) {
227a3cb716626b477c98ba912698c765eab20f27286Jim Miller        return null;
228a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
229a3cb716626b477c98ba912698c765eab20f27286Jim Miller
230a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onRequestTexture(int id) {
231a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onRequestTexture(" + id + ")" );
232a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_TEXTURE_N + id);
233a3cb716626b477c98ba912698c765eab20f27286Jim Miller        Message message = mAsyncHandler.obtainMessage(REQUEST_TEXTURE_N + id, id, 0);
234a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.sendMessageDelayed(message, HOLDOFF_DELAY);
235a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
236a3cb716626b477c98ba912698c765eab20f27286Jim Miller
237a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onInvalidateTexture(final int id) {
238a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onInvalidateTexture(" + id + ")");
239a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_TEXTURE_N + id);
240a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
241a3cb716626b477c98ba912698c765eab20f27286Jim Miller
242a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onRequestGeometry(int id) {
243a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onRequestGeometry(" + id + ")");
244a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_GEOMETRY_N + id);
245a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.sendMessage(mAsyncHandler.obtainMessage(REQUEST_GEOMETRY_N + id, id, 0));
246a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
247a3cb716626b477c98ba912698c765eab20f27286Jim Miller
248a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onInvalidateGeometry(int id) {
249a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onInvalidateGeometry(" + id + ")");
250a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_GEOMETRY_N + id);
251a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
252a3cb716626b477c98ba912698c765eab20f27286Jim Miller
253a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onRequestDetailTexture(int id) {
254a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onRequestDetailTexture(" + id + ")" );
255a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_DETAIL_TEXTURE_N + id);
256a3cb716626b477c98ba912698c765eab20f27286Jim Miller        Message message = mAsyncHandler.obtainMessage(REQUEST_DETAIL_TEXTURE_N + id, id, 0);
257a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.sendMessageDelayed(message, HOLDOFF_DELAY);
258a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
259a3cb716626b477c98ba912698c765eab20f27286Jim Miller
260a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onInvalidateDetailTexture(int id) {
261a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onInvalidateDetailTexture(" + id + ")");
262a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mAsyncHandler.removeMessages(REQUEST_DETAIL_TEXTURE_N + id);
263a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
264a3cb716626b477c98ba912698c765eab20f27286Jim Miller
265a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onCardSelected(int n) {
266a3cb716626b477c98ba912698c765eab20f27286Jim Miller        if (DBG) Log.v(TAG, "onCardSelected(" + n + ")");
267a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
268a3cb716626b477c98ba912698c765eab20f27286Jim Miller
2698fd40311898a9ec759a76f021642f43e617e38c4Jim Shuma    public void onDetailSelected(int n, int x, int y) {
2708fd40311898a9ec759a76f021642f43e617e38c4Jim Shuma        if (DBG) Log.v(TAG, "onDetailSelected(" + n + ", " + x + ", " + y + ")");
2718fd40311898a9ec759a76f021642f43e617e38c4Jim Shuma    }
2728fd40311898a9ec759a76f021642f43e617e38c4Jim Shuma
273e8cab95c5f73ddf6843d82793decc3adb4692860Jim Shuma    public void onCardLongPress(int n, int touchPosition[], Rect detailCoordinates) {
274e8cab95c5f73ddf6843d82793decc3adb4692860Jim Shuma        if (DBG) Log.v(TAG, "onCardLongPress(" + n + ", (" + touchPosition + "), (" +
275e8cab95c5f73ddf6843d82793decc3adb4692860Jim Shuma                detailCoordinates +") )");
276594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    }
277594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
278a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onAnimationStarted() {
2797cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma
280a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
281a3cb716626b477c98ba912698c765eab20f27286Jim Miller
2827cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma    public void onAnimationFinished(float carouselRotationAngle) {
2837cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma
284a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
285a3cb716626b477c98ba912698c765eab20f27286Jim Miller
286a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onResume() {
28727b81f375cfa65f4f689c64bd2c48e3a56c1e11bJason Sams        mCarouselView.resume();
288a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
289a3cb716626b477c98ba912698c765eab20f27286Jim Miller
290a3cb716626b477c98ba912698c765eab20f27286Jim Miller    public void onPause() {
29127b81f375cfa65f4f689c64bd2c48e3a56c1e11bJason Sams        mCarouselView.pause();
292a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
293baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich
2949fa7a1887bd54f8833a772f8418b8f94c811ccf6Jack Palevich    public void onDestroy() {
2959fa7a1887bd54f8833a772f8418b8f94c811ccf6Jack Palevich        mHandlerThread.quit();
2969fa7a1887bd54f8833a772f8418b8f94c811ccf6Jack Palevich    }
2979fa7a1887bd54f8833a772f8418b8f94c811ccf6Jack Palevich
298baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich    protected Handler getAsyncHandler() {
299baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich        return mAsyncHandler;
300baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich    }
301baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich
302baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich    protected CarouselView getCarouselView() {
303baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich        return mCarouselView;
304baa6653bc1165a787c44ed8781c8d258a8e4e798Jack Palevich    }
305a3cb716626b477c98ba912698c765eab20f27286Jim Miller}
306