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