107ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor/* 207ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * Copyright (C) 2012 The Android Open Source Project 307ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * 407ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 507ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * you may not use this file except in compliance with the License. 607ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * You may obtain a copy of the License at 707ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * 807ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * http://www.apache.org/licenses/LICENSE-2.0 907ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * 1007ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * Unless required by applicable law or agreed to in writing, software 1107ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 1207ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * See the License for the specific language governing permissions and 1407ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor * limitations under the License. 1507ddb5c577a10e5aa3b4442426a055f3b95d5202Tom Taylor */ 1651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 1751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorpackage com.android.mms.util; 1851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 1951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport java.util.Set; 2051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 2151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.content.Context; 2251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.net.Uri; 2351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.util.Log; 2451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 2551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.LogTag; 2651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.model.SlideshowModel; 2751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.MmsException; 2851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.pdu.GenericPdu; 2951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.pdu.MultimediaMessagePdu; 3051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.pdu.PduPersister; 3151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.util.PduCache; 3251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.google.android.mms.util.PduCacheEntry; 3351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 3451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor/** 3551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * Primary {@link PduLoaderManager} implementation used by {@link MessagingApplication}. 3651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * <p> 3751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * Public methods should only be used from a single thread (typically the UI 3851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * thread). Callbacks will be invoked on the thread where the PduLoaderManager 3951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * was instantiated. 4051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * <p> 4151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * Uses a thread-pool ExecutorService instead of AsyncTasks since clients may 4251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * request lots of pdus around the same time, and AsyncTask may reject tasks 4351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * in that case and has no way of bounding the number of threads used by those 4451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * tasks. 4551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * <p> 4651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * PduLoaderManager is used to asynchronously load mms pdu's and then build a slideshow model 4751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * from that loaded pdu. Then it will call the passed in callback with the result. This class 4851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * uses the PduCache built into the mms framework. It also manages a local cache of slideshow 4951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * models. The slideshow cache uses SoftReferences to hang onto the slideshow. 5051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * 5151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * Based on BooksImageManager by Virgil King. 5251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor */ 5351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorpublic class PduLoaderManager extends BackgroundLoaderManager { 5451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static final String TAG = "Mms:PduLoaderManager"; 5551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 560ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor private static final boolean DEBUG_DISABLE_CACHE = false; 5751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static final boolean DEBUG_DISABLE_PDUS = false; 5851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static final boolean DEBUG_LONG_WAIT = false; 5951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 6051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static PduCache mPduCache; 6151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final PduPersister mPduPersister; 6251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final SimpleCache<Uri, SlideshowModel> mSlideshowCache; 6351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final Context mContext; 6451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 6551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public PduLoaderManager(final Context context) { 6651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor super(context); 6751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 68721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor mSlideshowCache = new SimpleCache<Uri, SlideshowModel>(8, 16, 0.75f, true); 6951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPduCache = PduCache.getInstance(); 7051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPduPersister = PduPersister.getPduPersister(context); 7151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mContext = context; 7251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 7351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 7451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public ItemLoadedFuture getPdu(Uri uri, boolean requestSlideshow, 7551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final ItemLoadedCallback<PduLoaded> callback) { 7651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (uri == null) { 7751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor throw new NullPointerException(); 7851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 7951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 8051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor PduCacheEntry cacheEntry = null; 8151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor synchronized(mPduCache) { 8251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (!mPduCache.isUpdating(uri)) { 8351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor cacheEntry = mPduCache.get(uri); 8451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 8551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 860ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor final SlideshowModel slideshow = (requestSlideshow && !DEBUG_DISABLE_CACHE) ? 870ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor mSlideshowCache.get(uri) : null; 8851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 8951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final boolean slideshowExists = (!requestSlideshow || slideshow != null); 9051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final boolean pduExists = (cacheEntry != null && cacheEntry.getPdu() != null); 9151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final boolean taskExists = mPendingTaskUris.contains(uri); 9251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final boolean newTaskRequired = (!pduExists || !slideshowExists) && !taskExists; 9351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final boolean callbackRequired = (callback != null); 9451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 9551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (pduExists && slideshowExists) { 9651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (callbackRequired) { 9751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor PduLoaded pduLoaded = new PduLoaded(cacheEntry.getPdu(), slideshow); 9851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor callback.onItemLoaded(pduLoaded, null); 9951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 10051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return new NullItemLoadedFuture(); 10151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 10251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 10351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (callbackRequired) { 10451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor addCallback(uri, callback); 10551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 10651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 10751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (newTaskRequired) { 10851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPendingTaskUris.add(uri); 10951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Runnable task = new PduTask(uri, requestSlideshow); 11051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mExecutor.execute(task); 11151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 11251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return new ItemLoadedFuture() { 1139c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor private boolean mIsDone; 1149c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor 1159c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor public void cancel(Uri uri) { 11651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor cancelCallback(callback); 1179c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor removePdu(uri); // the pdu and/or slideshow might be half loaded. Make sure 1189c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor // we load fresh the next time this uri is requested. 1199c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor } 1209c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor 1219c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor public void setIsDone(boolean done) { 1229c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor mIsDone = done; 12351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 1249c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor 12551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public boolean isDone() { 1269c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor return mIsDone; 12751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 12851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor }; 12951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 13051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 13151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor @Override 13251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void clear() { 13351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor super.clear(); 13451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 1357b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor synchronized(mPduCache) { 1367b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor mPduCache.purgeAll(); 1377b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 13851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mSlideshowCache.clear(); 13951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 14051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 1417b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor public void removePdu(Uri uri) { 1427b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor if (Log.isLoggable(TAG, Log.DEBUG)) { 1437b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor Log.d(TAG, "removePdu: " + uri); 1447b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 1459c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor if (uri != null) { 1469c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor synchronized(mPduCache) { 1479c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor mPduCache.purge(uri); 1489c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor } 1499c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor mSlideshowCache.remove(uri); 1507b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 1517b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 1527b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor 15351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public String getTag() { 15451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return TAG; 15551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 15651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 15751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public class PduTask implements Runnable { 15851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final Uri mUri; 15951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final boolean mRequestSlideshow; 16051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 16151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public PduTask(Uri uri, boolean requestSlideshow) { 16251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (uri == null) { 16351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor throw new NullPointerException(); 16451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 16551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mUri = uri; 16651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mRequestSlideshow = requestSlideshow; 16751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 16851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 16951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor /** {@inheritDoc} */ 17051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void run() { 17151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (DEBUG_DISABLE_PDUS) { 17251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return; 17351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 17451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (DEBUG_LONG_WAIT) { 17551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor try { 17651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Thread.sleep(10000); 17751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } catch (InterruptedException e) { 17851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 17951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 18051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor GenericPdu pdu = null; 18151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor SlideshowModel slideshow = null; 18251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Throwable exception = null; 18351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor try { 18451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor pdu = mPduPersister.load(mUri); 18551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (pdu != null && mRequestSlideshow) { 18651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor slideshow = SlideshowModel.createFromPduBody(mContext, 18751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor ((MultimediaMessagePdu)pdu).getBody()); 18851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 18951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } catch (final MmsException e) { 19051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.e(TAG, "MmsException loading uri: " + mUri, e); 19151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor exception = e; 19251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 19351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final GenericPdu resultPdu = pdu; 19451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final SlideshowModel resultSlideshow = slideshow; 19551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final Throwable resultException = exception; 19651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mCallbackHandler.post(new Runnable() { 19751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void run() { 19851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final Set<ItemLoadedCallback> callbacks = mCallbacks.get(mUri); 19951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (callbacks != null) { 20051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Make a copy so that the callback can unregister itself 20151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor for (final ItemLoadedCallback<PduLoaded> callback : asList(callbacks)) { 20251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (Log.isLoggable(TAG, Log.DEBUG)) { 20351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.d(TAG, "Invoking pdu callback " + callback); 20451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 20551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor PduLoaded pduLoaded = new PduLoaded(resultPdu, resultSlideshow); 20651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor callback.onItemLoaded(pduLoaded, resultException); 20751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 20851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 20951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Add the slideshow to the soft cache if the load succeeded 21051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (resultSlideshow != null) { 21151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mSlideshowCache.put(mUri, resultSlideshow); 21251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 21351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 21451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mCallbacks.remove(mUri); 21551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPendingTaskUris.remove(mUri); 21651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 21751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (Log.isLoggable(LogTag.PDU_CACHE, Log.DEBUG)) { 21851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.d(TAG, "Pdu task for " + mUri + "exiting; " + mPendingTaskUris.size() 21951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor + " remain"); 22051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 22151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 22251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor }); 22351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 22451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 22551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 22651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public static class PduLoaded { 22779bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor public final GenericPdu mPdu; 22879bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor public final SlideshowModel mSlideshow; 22951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 23051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public PduLoaded(GenericPdu pdu, SlideshowModel slideshow) { 23151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPdu = pdu; 23251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mSlideshow = slideshow; 23351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 23451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 23551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor} 236