2 * Copyright (C) 2014 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.camera.settings;
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.hardware.Camera;
22 import android.os.Build;
23 import android.preference.PreferenceManager;
25 import com.android.ex.camera2.portability.Size;
27 import java.util.List;
30 * Facilitates caching of camera supported picture sizes, which is slow
31 * to query. Will update cache if Build ID changes.
33 public class CameraPictureSizesCacher {
34 public static final String PICTURE_SIZES_BUILD_KEY = "CachedSupportedPictureSizes_Build_Camera";
35 public static final String PICTURE_SIZES_SIZES_KEY = "CachedSupportedPictureSizes_Sizes_Camera";
38 * Opportunistically update the picture sizes cache, if needed.
40 * @param cameraId cameraID we have sizes for.
41 * @param sizes List of valid sizes.
43 public static void updateSizesForCamera(Context context, int cameraId, List<Size> sizes) {
44 String key_build = PICTURE_SIZES_BUILD_KEY + cameraId;
45 SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context);
46 String thisCameraCachedBuild = defaultPrefs.getString(key_build, null);
48 if (thisCameraCachedBuild == null) {
49 String key_sizes = PICTURE_SIZES_SIZES_KEY + cameraId;
50 SharedPreferences.Editor editor = defaultPrefs.edit();
51 editor.putString(key_build, Build.DISPLAY);
52 editor.putString(key_sizes, Size.listToString(sizes));
58 * Return list of Sizes for provided cameraId. Check first to see if we
59 * have it in the cache for the current android.os.Build.
60 * Note: This method calls Camera.open(), so the camera must be closed
61 * before calling or null will be returned if sizes were not previously
64 * @param cameraId cameraID we would like sizes for.
65 * @return List of valid sizes, or null if the Camera can not be opened.
67 public static List<Size> getSizesForCamera(int cameraId, Context context) {
68 String key_build = PICTURE_SIZES_BUILD_KEY + cameraId;
69 String key_sizes = PICTURE_SIZES_SIZES_KEY + cameraId;
70 SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context);
71 // Return cached value for cameraId and current build, if available.
72 String thisCameraCachedBuild = defaultPrefs.getString(key_build, null);
73 if (thisCameraCachedBuild != null && thisCameraCachedBuild.equals(Build.DISPLAY)) {
74 String thisCameraCachedSizeList = defaultPrefs.getString(key_sizes, null);
75 if (thisCameraCachedSizeList != null) {
76 return Size.stringToList(thisCameraCachedSizeList);
79 // No cached value, so need to query Camera API.
82 thisCamera = Camera.open(cameraId);
83 } catch (RuntimeException e) {
84 // Camera open will fail if already open.
87 if (thisCamera != null) {
88 List<Size> sizes = Size.buildListFromCameraSizes(thisCamera.getParameters()
89 .getSupportedPictureSizes());
91 SharedPreferences.Editor editor = defaultPrefs.edit();
92 editor.putString(key_build, Build.DISPLAY);
93 editor.putString(key_sizes, Size.listToString(sizes));