diff options
Diffstat (limited to 'src/com/android/gallery3d/data/DataManager.java')
-rw-r--r-- | src/com/android/gallery3d/data/DataManager.java | 371 |
1 files changed, 0 insertions, 371 deletions
diff --git a/src/com/android/gallery3d/data/DataManager.java b/src/com/android/gallery3d/data/DataManager.java deleted file mode 100644 index 38865e9f1..000000000 --- a/src/com/android/gallery3d/data/DataManager.java +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.gallery3d.data; - -import android.content.Context; -import android.database.ContentObserver; -import android.net.Uri; -import android.os.Handler; - -import com.android.gallery3d.app.GalleryApp; -import com.android.gallery3d.app.StitchingChangeListener; -import com.android.gallery3d.common.Utils; -import com.android.gallery3d.data.MediaObject.PanoramaSupportCallback; -import com.android.gallery3d.data.MediaSet.ItemConsumer; -import com.android.gallery3d.data.MediaSource.PathId; -import com.android.gallery3d.picasasource.PicasaSource; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import java.util.WeakHashMap; - -// DataManager manages all media sets and media items in the system. -// -// Each MediaSet and MediaItem has a unique 64 bits id. The most significant -// 32 bits represents its parent, and the least significant 32 bits represents -// the self id. For MediaSet the self id is is globally unique, but for -// MediaItem it's unique only relative to its parent. -// -// To make sure the id is the same when the MediaSet is re-created, a child key -// is provided to obtainSetId() to make sure the same self id will be used as -// when the parent and key are the same. A sequence of child keys is called a -// path. And it's used to identify a specific media set even if the process is -// killed and re-created, so child keys should be stable identifiers. - -public class DataManager implements StitchingChangeListener { - public static final int INCLUDE_IMAGE = 1; - public static final int INCLUDE_VIDEO = 2; - public static final int INCLUDE_ALL = INCLUDE_IMAGE | INCLUDE_VIDEO; - public static final int INCLUDE_LOCAL_ONLY = 4; - public static final int INCLUDE_LOCAL_IMAGE_ONLY = - INCLUDE_LOCAL_ONLY | INCLUDE_IMAGE; - public static final int INCLUDE_LOCAL_VIDEO_ONLY = - INCLUDE_LOCAL_ONLY | INCLUDE_VIDEO; - public static final int INCLUDE_LOCAL_ALL_ONLY = - INCLUDE_LOCAL_ONLY | INCLUDE_IMAGE | INCLUDE_VIDEO; - - // Any one who would like to access data should require this lock - // to prevent concurrency issue. - public static final Object LOCK = new Object(); - - public static DataManager from(Context context) { - GalleryApp app = (GalleryApp) context.getApplicationContext(); - return app.getDataManager(); - } - - private static final String TAG = "DataManager"; - - // This is the path for the media set seen by the user at top level. - private static final String TOP_SET_PATH = "/combo/{/local/all,/picasa/all}"; - - private static final String TOP_IMAGE_SET_PATH = "/combo/{/local/image,/picasa/image}"; - - private static final String TOP_VIDEO_SET_PATH = - "/combo/{/local/video,/picasa/video}"; - - private static final String TOP_LOCAL_SET_PATH = "/local/all"; - - private static final String TOP_LOCAL_IMAGE_SET_PATH = "/local/image"; - - private static final String TOP_LOCAL_VIDEO_SET_PATH = "/local/video"; - - public static final Comparator<MediaItem> sDateTakenComparator = - new DateTakenComparator(); - - private static class DateTakenComparator implements Comparator<MediaItem> { - @Override - public int compare(MediaItem item1, MediaItem item2) { - return -Utils.compare(item1.getDateInMs(), item2.getDateInMs()); - } - } - - private final Handler mDefaultMainHandler; - - private GalleryApp mApplication; - private int mActiveCount = 0; - - private HashMap<Uri, NotifyBroker> mNotifierMap = - new HashMap<Uri, NotifyBroker>(); - - - private HashMap<String, MediaSource> mSourceMap = - new LinkedHashMap<String, MediaSource>(); - - public DataManager(GalleryApp application) { - mApplication = application; - mDefaultMainHandler = new Handler(application.getMainLooper()); - } - - public synchronized void initializeSourceMap() { - if (!mSourceMap.isEmpty()) return; - - // the order matters, the UriSource must come last - addSource(new LocalSource(mApplication)); - addSource(new PicasaSource(mApplication)); - addSource(new ComboSource(mApplication)); - addSource(new ClusterSource(mApplication)); - addSource(new FilterSource(mApplication)); - addSource(new SecureSource(mApplication)); - addSource(new UriSource(mApplication)); - addSource(new SnailSource(mApplication)); - - if (mActiveCount > 0) { - for (MediaSource source : mSourceMap.values()) { - source.resume(); - } - } - } - - public String getTopSetPath(int typeBits) { - - switch (typeBits) { - case INCLUDE_IMAGE: return TOP_IMAGE_SET_PATH; - case INCLUDE_VIDEO: return TOP_VIDEO_SET_PATH; - case INCLUDE_ALL: return TOP_SET_PATH; - case INCLUDE_LOCAL_IMAGE_ONLY: return TOP_LOCAL_IMAGE_SET_PATH; - case INCLUDE_LOCAL_VIDEO_ONLY: return TOP_LOCAL_VIDEO_SET_PATH; - case INCLUDE_LOCAL_ALL_ONLY: return TOP_LOCAL_SET_PATH; - default: throw new IllegalArgumentException(); - } - } - - // open for debug - void addSource(MediaSource source) { - if (source == null) return; - mSourceMap.put(source.getPrefix(), source); - } - - // A common usage of this method is: - // synchronized (DataManager.LOCK) { - // MediaObject object = peekMediaObject(path); - // if (object == null) { - // object = createMediaObject(...); - // } - // } - public MediaObject peekMediaObject(Path path) { - return path.getObject(); - } - - public MediaObject getMediaObject(Path path) { - synchronized (LOCK) { - MediaObject obj = path.getObject(); - if (obj != null) return obj; - - MediaSource source = mSourceMap.get(path.getPrefix()); - if (source == null) { - Log.w(TAG, "cannot find media source for path: " + path); - return null; - } - - try { - MediaObject object = source.createMediaObject(path); - if (object == null) { - Log.w(TAG, "cannot create media object: " + path); - } - return object; - } catch (Throwable t) { - Log.w(TAG, "exception in creating media object: " + path, t); - return null; - } - } - } - - public MediaObject getMediaObject(String s) { - return getMediaObject(Path.fromString(s)); - } - - public MediaSet getMediaSet(Path path) { - return (MediaSet) getMediaObject(path); - } - - public MediaSet getMediaSet(String s) { - return (MediaSet) getMediaObject(s); - } - - public MediaSet[] getMediaSetsFromString(String segment) { - String[] seq = Path.splitSequence(segment); - int n = seq.length; - MediaSet[] sets = new MediaSet[n]; - for (int i = 0; i < n; i++) { - sets[i] = getMediaSet(seq[i]); - } - return sets; - } - - // Maps a list of Paths to MediaItems, and invoke consumer.consume() - // for each MediaItem (may not be in the same order as the input list). - // An index number is also passed to consumer.consume() to identify - // the original position in the input list of the corresponding Path (plus - // startIndex). - public void mapMediaItems(ArrayList<Path> list, ItemConsumer consumer, - int startIndex) { - HashMap<String, ArrayList<PathId>> map = - new HashMap<String, ArrayList<PathId>>(); - - // Group the path by the prefix. - int n = list.size(); - for (int i = 0; i < n; i++) { - Path path = list.get(i); - String prefix = path.getPrefix(); - ArrayList<PathId> group = map.get(prefix); - if (group == null) { - group = new ArrayList<PathId>(); - map.put(prefix, group); - } - group.add(new PathId(path, i + startIndex)); - } - - // For each group, ask the corresponding media source to map it. - for (Entry<String, ArrayList<PathId>> entry : map.entrySet()) { - String prefix = entry.getKey(); - MediaSource source = mSourceMap.get(prefix); - source.mapMediaItems(entry.getValue(), consumer); - } - } - - // The following methods forward the request to the proper object. - public int getSupportedOperations(Path path) { - return getMediaObject(path).getSupportedOperations(); - } - - public void getPanoramaSupport(Path path, PanoramaSupportCallback callback) { - getMediaObject(path).getPanoramaSupport(callback); - } - - public void delete(Path path) { - getMediaObject(path).delete(); - } - - public void rotate(Path path, int degrees) { - getMediaObject(path).rotate(degrees); - } - - public Uri getContentUri(Path path) { - return getMediaObject(path).getContentUri(); - } - - public int getMediaType(Path path) { - return getMediaObject(path).getMediaType(); - } - - public Path findPathByUri(Uri uri, String type) { - if (uri == null) return null; - for (MediaSource source : mSourceMap.values()) { - Path path = source.findPathByUri(uri, type); - if (path != null) return path; - } - return null; - } - - public Path getDefaultSetOf(Path item) { - MediaSource source = mSourceMap.get(item.getPrefix()); - return source == null ? null : source.getDefaultSetOf(item); - } - - // Returns number of bytes used by cached pictures currently downloaded. - public long getTotalUsedCacheSize() { - long sum = 0; - for (MediaSource source : mSourceMap.values()) { - sum += source.getTotalUsedCacheSize(); - } - return sum; - } - - // Returns number of bytes used by cached pictures if all pending - // downloads and removals are completed. - public long getTotalTargetCacheSize() { - long sum = 0; - for (MediaSource source : mSourceMap.values()) { - sum += source.getTotalTargetCacheSize(); - } - return sum; - } - - public void registerChangeNotifier(Uri uri, ChangeNotifier notifier) { - NotifyBroker broker = null; - synchronized (mNotifierMap) { - broker = mNotifierMap.get(uri); - if (broker == null) { - broker = new NotifyBroker(mDefaultMainHandler); - mApplication.getContentResolver() - .registerContentObserver(uri, true, broker); - mNotifierMap.put(uri, broker); - } - } - broker.registerNotifier(notifier); - } - - public void resume() { - if (++mActiveCount == 1) { - for (MediaSource source : mSourceMap.values()) { - source.resume(); - } - } - } - - public void pause() { - if (--mActiveCount == 0) { - for (MediaSource source : mSourceMap.values()) { - source.pause(); - } - } - } - - private static class NotifyBroker extends ContentObserver { - private WeakHashMap<ChangeNotifier, Object> mNotifiers = - new WeakHashMap<ChangeNotifier, Object>(); - - public NotifyBroker(Handler handler) { - super(handler); - } - - public synchronized void registerNotifier(ChangeNotifier notifier) { - mNotifiers.put(notifier, null); - } - - @Override - public synchronized void onChange(boolean selfChange) { - for(ChangeNotifier notifier : mNotifiers.keySet()) { - notifier.onChange(selfChange); - } - } - } - - @Override - public void onStitchingQueued(Uri uri) { - // Do nothing. - } - - @Override - public void onStitchingResult(Uri uri) { - Path path = findPathByUri(uri, null); - if (path != null) { - MediaObject mediaObject = getMediaObject(path); - if (mediaObject != null) { - mediaObject.clearCachedPanoramaSupport(); - } - } - } - - @Override - public void onStitchingProgress(Uri uri, int progress) { - // Do nothing. - } -} |