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