From 7d9a8ffd08fa950eb14f8224f6090fe46ab4aa9f Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Tue, 18 Mar 2014 18:14:41 -0700 Subject: [PATCH] camera: Fix setParameters for Preview FPS single/range values Bug: 12609188 Change-Id: I82ea6f5de2183dd046d4bf5683600c97f37ab4db --- core/java/android/hardware/Camera.java | 30 ++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 6e2a099c10001..35c86e7f3501f 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -45,6 +45,7 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; /** @@ -2149,10 +2150,20 @@ public class Camera { private static final String PIXEL_FORMAT_JPEG = "jpeg"; private static final String PIXEL_FORMAT_BAYER_RGGB = "bayer-rggb"; - private HashMap mMap; + /** + * Order matters: Keys that are {@link #set(String, String) set} later + * will take precedence over keys that are set earlier (if the two keys + * conflict with each other). + * + *

One example is {@link #setPreviewFpsRange(int, int)} , since it + * conflicts with {@link #setPreviewFrameRate(int)} whichever key is set later + * is the one that will take precedence. + *

+ */ + private final LinkedHashMap mMap; private Parameters() { - mMap = new HashMap(64); + mMap = new LinkedHashMap(/*initialCapacity*/64); } /** @@ -2232,7 +2243,7 @@ public class Camera { return; } - mMap.put(key, value); + put(key, value); } /** @@ -2242,7 +2253,18 @@ public class Camera { * @param value the int value of the parameter */ public void set(String key, int value) { - mMap.put(key, Integer.toString(value)); + put(key, Integer.toString(value)); + } + + private void put(String key, String value) { + /* + * Remove the key if it already exists. + * + * This way setting a new value for an already existing key will always move + * that key to be ordered the latest in the map. + */ + mMap.remove(key); + mMap.put(key, value); } private void set(String key, List areas) {