14b4dbd225685502f4249c2bf25bf74f7ce526645George Mount/*
24b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * Copyright (C) 2012 The Android Open Source Project
34b4dbd225685502f4249c2bf25bf74f7ce526645George Mount *
44b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * Licensed under the Apache License, Version 2.0 (the "License");
54b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * you may not use this file except in compliance with the License.
64b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * You may obtain a copy of the License at
74b4dbd225685502f4249c2bf25bf74f7ce526645George Mount *
84b4dbd225685502f4249c2bf25bf74f7ce526645George Mount *      http://www.apache.org/licenses/LICENSE-2.0
94b4dbd225685502f4249c2bf25bf74f7ce526645George Mount *
104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * Unless required by applicable law or agreed to in writing, software
114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * distributed under the License is distributed on an "AS IS" BASIS,
124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * See the License for the specific language governing permissions and
144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * limitations under the License.
154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount */
164b4dbd225685502f4249c2bf25bf74f7ce526645George Mountpackage com.android.gallery3d.app;
174b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
184b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject;
194b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback;
204b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.PanoramaMetadataJob;
214b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.util.Future;
224b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.util.FutureListener;
23231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mountimport com.android.gallery3d.util.LightCycleHelper;
244b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.util.LightCycleHelper.PanoramaMetadata;
254b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
264b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport java.util.ArrayList;
274b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
284b4dbd225685502f4249c2bf25bf74f7ce526645George Mount/**
294b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * This class breaks out the off-thread panorama support checks so that the
304b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * complexity can be shared between UriImage and LocalImage, which need to
314b4dbd225685502f4249c2bf25bf74f7ce526645George Mount * support panoramas.
324b4dbd225685502f4249c2bf25bf74f7ce526645George Mount */
334b4dbd225685502f4249c2bf25bf74f7ce526645George Mountpublic class PanoramaMetadataSupport implements FutureListener<PanoramaMetadata> {
344b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private Object mLock = new Object();
354b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private Future<PanoramaMetadata> mGetPanoMetadataTask;
364b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private PanoramaMetadata mPanoramaMetadata;
374b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private ArrayList<PanoramaSupportCallback> mCallbacksWaiting;
384b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private MediaObject mMediaObject;
394b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
404b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public PanoramaMetadataSupport(MediaObject mediaObject) {
414b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        mMediaObject = mediaObject;
424b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
434b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
444b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public void getPanoramaSupport(GalleryApp app, PanoramaSupportCallback callback) {
454b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        synchronized (mLock) {
464b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mPanoramaMetadata != null) {
474b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                callback.panoramaInfoAvailable(mMediaObject, mPanoramaMetadata.mUsePanoramaViewer,
484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        mPanoramaMetadata.mIsPanorama360);
494b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            } else {
504b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                if (mCallbacksWaiting == null) {
514b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    mCallbacksWaiting = new ArrayList<PanoramaSupportCallback>();
524b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    mGetPanoMetadataTask = app.getThreadPool().submit(
534b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            new PanoramaMetadataJob(app.getAndroidContext(),
544b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                                    mMediaObject.getContentUri()), this);
554b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
564b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                }
574b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mCallbacksWaiting.add(callback);
584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
604b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
614b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public void clearCachedValues() {
634b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        synchronized (mLock) {
644b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mPanoramaMetadata != null) {
654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mPanoramaMetadata = null;
664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            } else if (mGetPanoMetadataTask != null) {
674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mGetPanoMetadataTask.cancel();
684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                for (PanoramaSupportCallback cb : mCallbacksWaiting) {
694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    cb.panoramaInfoAvailable(mMediaObject, false, false);
704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                }
714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mGetPanoMetadataTask = null;
724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mCallbacksWaiting = null;
734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    @Override
784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public void onFutureDone(Future<PanoramaMetadata> future) {
794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        synchronized (mLock) {
804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mPanoramaMetadata = future.get();
81231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount            if (mPanoramaMetadata == null) {
82231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount                // Error getting panorama data from file. Treat as not panorama.
83231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount                mPanoramaMetadata = LightCycleHelper.NOT_PANORAMA;
84231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount            }
854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            for (PanoramaSupportCallback cb : mCallbacksWaiting) {
86231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount                cb.panoramaInfoAvailable(mMediaObject, mPanoramaMetadata.mUsePanoramaViewer,
874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        mPanoramaMetadata.mIsPanorama360);
884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mGetPanoMetadataTask = null;
904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mCallbacksWaiting = null;
914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
92231fe15ddb1cb4788b1b02ce5512587e45e3b249George Mount    }
934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount}
94