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