1c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling/* 2c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Copyright (C) 2013 The Android Open Source Project 3c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 4c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 5c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * you may not use this file except in compliance with the License. 6c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * You may obtain a copy of the License at 7c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 8c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 9c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * 10c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Unless required by applicable law or agreed to in writing, software 11c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 12c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * See the License for the specific language governing permissions and 14c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * limitations under the License. 15c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling */ 16c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 17c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingpackage com.android.camera.data; 18c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 19c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport android.net.Uri; 20c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 21c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport java.util.Collections; 22c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport java.util.Comparator; 23c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport java.util.HashMap; 24c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingimport java.util.LinkedList; 25c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 26c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling/** 27c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * Fast access data structure for an ordered LocalData list. 28c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling */ 29c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberlingpublic class LocalDataList { 30c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling /** 31c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * We use this as a way to compare a Uri to LocalData instances inside a 32c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * LinkedList. A linked list in indexOf does a other.equals(get(i)). 33c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling */ 34c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private static class UriWrapper { 35c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private final Uri mUri; 36c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 37c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public UriWrapper(Uri uri) { 38c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mUri = uri; 39c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 40c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 41c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling @Override 42c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public boolean equals(Object o) { 43c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling if (!(o instanceof LocalData)) { 44c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return false; 45c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 46c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return mUri.equals(((LocalData) o).getContentUri()); 47c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 48c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 49c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 50c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private LinkedList<LocalData> mList = new LinkedList<LocalData>(); 51c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling private HashMap<Uri, LocalData> mUriMap = new HashMap<Uri, LocalData>(); 52c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 53c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public LocalData get(int index) { 54c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return mList.get(index); 55c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 56c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 57c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public LocalData remove(int index) { 58c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling LocalData removedItem = mList.remove(index); 59c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mUriMap.remove(removedItem); 60c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return removedItem; 61c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 62c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 63c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public LocalData get(Uri uri) { 64c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return mUriMap.get(uri); 65c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 66c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 67c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public void set(int pos, LocalData data) { 68c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mList.set(pos, data); 69c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mUriMap.put(data.getContentUri(), data); 70c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 71c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 72c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public void add(LocalData data) { 73c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mList.add(data); 74c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mUriMap.put(data.getContentUri(), data); 75c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 76c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 77c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public void add(int pos, LocalData data) { 78c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mList.add(pos, data); 79c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling mUriMap.put(data.getContentUri(), data); 80c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 81c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 82c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public int size() { 83c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return mList.size(); 84c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 85c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 86c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public void sort(Comparator<LocalData> comparator) { 87c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling Collections.sort(mList, comparator); 88c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 89c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling 90c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling /** 91c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * This implementation routes through to LinkedList.indexOf, so performs in 92c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * O(n) but has a fast exit path for when the uri is not contained in the 93c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling * list, and immediately returns -1; 94c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling */ 95c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling public int indexOf(Uri uri) { 96c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling if (!mUriMap.containsKey(uri)) { 97c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return -1; 98c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 99c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling return mList.indexOf(new UriWrapper(uri)); 100c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling } 101c29156954bcbf0218a78c308c3ba8f25e00aeeccSascha Haeberling} 102