summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/data/LocalDataList.java
diff options
context:
space:
mode:
authorSascha Haeberling <haeberling@google.com>2013-09-16 11:04:25 -0700
committerSascha Haeberling <haeberling@google.com>2013-09-16 13:15:57 -0700
commitc29156954bcbf0218a78c308c3ba8f25e00aeecc (patch)
tree3f3a2c9a85ad660aab166175a95d058e9aa96b01 /src/com/android/camera/data/LocalDataList.java
parentd095b79d083440e20d683ddb05ff8477159ee38f (diff)
downloadandroid_packages_apps_Snap-c29156954bcbf0218a78c308c3ba8f25e00aeecc.tar.gz
android_packages_apps_Snap-c29156954bcbf0218a78c308c3ba8f25e00aeecc.tar.bz2
android_packages_apps_Snap-c29156954bcbf0218a78c308c3ba8f25e00aeecc.zip
Avoid expensive O(n) main-thread operation when adding Photo Sphere.
Bug: 10747001 Change-Id: I8dcc3c5e7dd12879a927aa82e71bea0c6370ccda
Diffstat (limited to 'src/com/android/camera/data/LocalDataList.java')
-rw-r--r--src/com/android/camera/data/LocalDataList.java101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/com/android/camera/data/LocalDataList.java b/src/com/android/camera/data/LocalDataList.java
new file mode 100644
index 000000000..3ccc4de54
--- /dev/null
+++ b/src/com/android/camera/data/LocalDataList.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2013 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.camera.data;
+
+import android.net.Uri;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+/**
+ * Fast access data structure for an ordered LocalData list.
+ */
+public class LocalDataList {
+ /**
+ * We use this as a way to compare a Uri to LocalData instances inside a
+ * LinkedList. A linked list in indexOf does a other.equals(get(i)).
+ */
+ private static class UriWrapper {
+ private final Uri mUri;
+
+ public UriWrapper(Uri uri) {
+ mUri = uri;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof LocalData)) {
+ return false;
+ }
+ return mUri.equals(((LocalData) o).getContentUri());
+ }
+ }
+
+ private LinkedList<LocalData> mList = new LinkedList<LocalData>();
+ private HashMap<Uri, LocalData> mUriMap = new HashMap<Uri, LocalData>();
+
+ public LocalData get(int index) {
+ return mList.get(index);
+ }
+
+ public LocalData remove(int index) {
+ LocalData removedItem = mList.remove(index);
+ mUriMap.remove(removedItem);
+ return removedItem;
+ }
+
+ public LocalData get(Uri uri) {
+ return mUriMap.get(uri);
+ }
+
+ public void set(int pos, LocalData data) {
+ mList.set(pos, data);
+ mUriMap.put(data.getContentUri(), data);
+ }
+
+ public void add(LocalData data) {
+ mList.add(data);
+ mUriMap.put(data.getContentUri(), data);
+ }
+
+ public void add(int pos, LocalData data) {
+ mList.add(pos, data);
+ mUriMap.put(data.getContentUri(), data);
+ }
+
+ public int size() {
+ return mList.size();
+ }
+
+ public void sort(Comparator<LocalData> comparator) {
+ Collections.sort(mList, comparator);
+ }
+
+ /**
+ * This implementation routes through to LinkedList.indexOf, so performs in
+ * O(n) but has a fast exit path for when the uri is not contained in the
+ * list, and immediately returns -1;
+ */
+ public int indexOf(Uri uri) {
+ if (!mUriMap.containsKey(uri)) {
+ return -1;
+ }
+ return mList.indexOf(new UriWrapper(uri));
+ }
+}