190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers/* 290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Copyright (C) 2014 The Android Open Source Project 390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * 490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Licensed under the Apache License, Version 2.0 (the "License"); 590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * you may not use this file except in compliance with the License. 690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * You may obtain a copy of the License at 790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * 890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * http://www.apache.org/licenses/LICENSE-2.0 990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * 1090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Unless required by applicable law or agreed to in writing, software 1190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * distributed under the License is distributed on an "AS IS" BASIS, 1290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * See the License for the specific language governing permissions and 1490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * limitations under the License. 1590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers */ 1690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 1790c7ad5159145227349b389074d2d9437a1243a4Andy Huiberspackage com.android.camera.settings; 1890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 1990c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport android.content.Context; 2090c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport android.content.SharedPreferences; 2190c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport android.hardware.Camera; 2290c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport android.os.Build; 2390c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport android.preference.PreferenceManager; 2490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 255a344964cb003525727c31d295ca3a592c245606Sol Boucherimport com.android.ex.camera2.portability.Size; 2690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 2790c7ad5159145227349b389074d2d9437a1243a4Andy Huibersimport java.util.List; 2890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 2990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers/** 3090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Facilitates caching of camera supported picture sizes, which is slow 3190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * to query. Will update cache if Build ID changes. 3290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers */ 3390c7ad5159145227349b389074d2d9437a1243a4Andy Huiberspublic class CameraPictureSizesCacher { 3490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers public static final String PICTURE_SIZES_BUILD_KEY = "CachedSupportedPictureSizes_Build_Camera"; 3590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers public static final String PICTURE_SIZES_SIZES_KEY = "CachedSupportedPictureSizes_Sizes_Camera"; 3690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 3790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers /** 3890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Opportunistically update the picture sizes cache, if needed. 3990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * 4090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * @param cameraId cameraID we have sizes for. 4190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * @param sizes List of valid sizes. 4290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers */ 4390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers public static void updateSizesForCamera(Context context, int cameraId, List<Size> sizes) { 4490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String key_build = PICTURE_SIZES_BUILD_KEY + cameraId; 4590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context); 4690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String thisCameraCachedBuild = defaultPrefs.getString(key_build, null); 4790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers // Write to cache. 4890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers if (thisCameraCachedBuild == null) { 4990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String key_sizes = PICTURE_SIZES_SIZES_KEY + cameraId; 5090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers SharedPreferences.Editor editor = defaultPrefs.edit(); 5190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.putString(key_build, Build.DISPLAY); 5290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.putString(key_sizes, Size.listToString(sizes)); 5390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.apply(); 5490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 5590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 5690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers 5790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers /** 5890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Return list of Sizes for provided cameraId. Check first to see if we 5990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * have it in the cache for the current android.os.Build. 6090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * Note: This method calls Camera.open(), so the camera must be closed 6190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * before calling or null will be returned if sizes were not previously 6290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * cached. 6390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * 6490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * @param cameraId cameraID we would like sizes for. 6590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers * @return List of valid sizes, or null if the Camera can not be opened. 6690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers */ 6790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers public static List<Size> getSizesForCamera(int cameraId, Context context) { 6890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String key_build = PICTURE_SIZES_BUILD_KEY + cameraId; 6990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String key_sizes = PICTURE_SIZES_SIZES_KEY + cameraId; 7090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context); 7190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers // Return cached value for cameraId and current build, if available. 7290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String thisCameraCachedBuild = defaultPrefs.getString(key_build, null); 7390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers if (thisCameraCachedBuild != null && thisCameraCachedBuild.equals(Build.DISPLAY)) { 7490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers String thisCameraCachedSizeList = defaultPrefs.getString(key_sizes, null); 7590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers if (thisCameraCachedSizeList != null) { 7690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers return Size.stringToList(thisCameraCachedSizeList); 7790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 7890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 7990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers // No cached value, so need to query Camera API. 8090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers Camera thisCamera; 8190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers try { 8290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers thisCamera = Camera.open(cameraId); 8390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } catch (RuntimeException e) { 8490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers // Camera open will fail if already open. 8590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers return null; 8690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 8790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers if (thisCamera != null) { 8890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers List<Size> sizes = Size.buildListFromCameraSizes(thisCamera.getParameters() 8990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers .getSupportedPictureSizes()); 9090c7ad5159145227349b389074d2d9437a1243a4Andy Huibers thisCamera.release(); 9190c7ad5159145227349b389074d2d9437a1243a4Andy Huibers SharedPreferences.Editor editor = defaultPrefs.edit(); 9290c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.putString(key_build, Build.DISPLAY); 9390c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.putString(key_sizes, Size.listToString(sizes)); 9490c7ad5159145227349b389074d2d9437a1243a4Andy Huibers editor.apply(); 9590c7ad5159145227349b389074d2d9437a1243a4Andy Huibers return sizes; 9690c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 9790c7ad5159145227349b389074d2d9437a1243a4Andy Huibers return null; 9890c7ad5159145227349b389074d2d9437a1243a4Andy Huibers } 9990c7ad5159145227349b389074d2d9437a1243a4Andy Huibers} 100