SnailSource.java revision b29a27f475a2c449abdda8d4e03d30914feed8c6
115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang/* 215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * Copyright (C) 2012 The Android Open Source Project 315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * 415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * you may not use this file except in compliance with the License. 615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * You may obtain a copy of the License at 715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * 815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * 1015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * Unless required by applicable law or agreed to in writing, software 1115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 1215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * See the License for the specific language governing permissions and 1415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang * limitations under the License. 1515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang */ 1615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changpackage com.android.gallery3d.data; 1715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport android.util.SparseArray; 1915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.app.GalleryApp; 2015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.ui.ScreenNail; 2115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 2215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changpublic class SnailSource extends MediaSource { 2315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static final String TAG = "SnailSource"; 2415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static final int SNAIL_ALBUM = 0; 2515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static final int SNAIL_ITEM = 1; 2615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 2715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private GalleryApp mApplication; 2815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private PathMatcher mMatcher; 2915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static int sNextId; 3015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static SparseArray<ScreenNail> sRegistry = new SparseArray<ScreenNail>(); 3115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 3215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang public SnailSource(GalleryApp application) { 3315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super("snail"); 3415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang mApplication = application; 3515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang mMatcher = new PathMatcher(); 3615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang mMatcher.add("/snail/set/*", SNAIL_ALBUM); 3715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang mMatcher.add("/snail/item/*", SNAIL_ITEM); 3815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 3915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 4015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang // The only path we accept is "/snail/set/id" and "/snail/item/id" 4115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 4215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang public MediaObject createMediaObject(Path path) { 4315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang DataManager dataManager = mApplication.getDataManager(); 4415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang switch (mMatcher.match(path)) { 4515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang case SNAIL_ALBUM: 4615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang String itemPath = "/snail/item/" + mMatcher.getVar(0); 4715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang MediaItem item = 4815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang (MediaItem) dataManager.getMediaObject(itemPath); 4915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return new SnailAlbum(path, item); 5015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang case SNAIL_ITEM: { 5115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang int id = mMatcher.getIntVar(0); 5215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return new SnailItem(path, lookupScreenNail(id)); 5315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 5415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 5515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return null; 5615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 5715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 58b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Registers a ScreenNail and returns the id of it. You can obtain the Path 59b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // of the MediaItem associated with the ScreenNail by getItemPath(), and the 60b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Path of the MediaSet containing that MediaItem by getSetPath(). 61b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public static synchronized int registerScreenNail(ScreenNail s) { 6215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang int id = sNextId++; 6315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang sRegistry.put(id, s); 64b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return id; 65b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 66b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 67b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public static Path getSetPath(int id) { 6815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return Path.fromString("/snail/set").getChild(id); 6915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 7015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 71b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public static Path getItemPath(int id) { 72b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return Path.fromString("/snail/item").getChild(id); 73b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 74b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 7515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang public static synchronized void unregisterScreenNail(ScreenNail s) { 7615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang int index = sRegistry.indexOfValue(s); 7715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang sRegistry.removeAt(index); 7815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 7915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 8015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private static synchronized ScreenNail lookupScreenNail(int id) { 8115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return sRegistry.get(id); 8215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 8315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang} 84