FileDocCategorySizeDatePackage
Camera2PortabilityTest.javaAPI DocAndroid 5.1 API13029Thu Mar 12 22:22:48 GMT 2015com.android.ex.camera2.portability

Camera2PortabilityTest.java

/*
 * Copyright (C) 2014 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.ex.camera2.portability;

import static android.hardware.camera2.CaptureRequest.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import android.content.Context;
import android.graphics.Rect;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.support.test.InjectContext;

import com.android.ex.camera2.portability.CameraCapabilities.FlashMode;
import com.android.ex.camera2.portability.CameraCapabilities.FocusMode;
import com.android.ex.camera2.portability.CameraCapabilities.SceneMode;
import com.android.ex.camera2.portability.CameraCapabilities.Stringifier;
import com.android.ex.camera2.portability.CameraCapabilities.WhiteBalance;
import com.android.ex.camera2.utils.Camera2DeviceTester;
import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;

public class Camera2PortabilityTest extends Camera2DeviceTester {
    /**
     * Ensure that applying {@code Stringifier#.*FromString()} reverses
     * {@link Stringifier#stringify} for {@link FocusMode}, {@link FlashMode},
     * {@link SceneMode}, and {@link WhiteBalance}.
     */
    @Test
    public void cameraCapabilitiesStringifier() {
        Stringifier strfy = new Stringifier();
        for(FocusMode val : FocusMode.values()) {
            assertEquals(val, strfy.focusModeFromString(strfy.stringify(val)));
        }
        for(FlashMode val : FlashMode.values()) {
            assertEquals(val, strfy.flashModeFromString(strfy.stringify(val)));
        }
        for(SceneMode val : SceneMode.values()) {
            assertEquals(val, strfy.sceneModeFromString(strfy.stringify(val)));
        }
        for(WhiteBalance val : WhiteBalance.values()) {
            assertEquals(val, strfy.whiteBalanceFromString(strfy.stringify(val)));
        }
    }

    /**
     * Ensure that {@code Stringifier#.*FromString()} default to the correct
     * {@link FocusMode}, {@link FlashMode}, {@link SceneMode}, and
     * {@link WhiteBalance} when given a {@code null}.
     */
    @Test
    public void cameraCapabilitiesStringifierNull() {
        Stringifier strfy = new Stringifier();
        assertEquals(strfy.focusModeFromString(null), FocusMode.AUTO);
        assertEquals(strfy.flashModeFromString(null), FlashMode.NO_FLASH);
        assertEquals(strfy.sceneModeFromString(null), SceneMode.NO_SCENE_MODE);
        assertEquals(strfy.whiteBalanceFromString(null), WhiteBalance.AUTO);
    }

    /**
     * Ensure that {@code Stringifier#.*FromString()} default to the correct
     * {@link FocusMode}, {@link FlashMode}, {@link SceneMode}, and
     * {@link WhiteBalance} when given an unrecognized string.
     */
    @Test
    public void cameraCapabilitiesStringifierInvalid() {
        Stringifier strfy = new Stringifier();
        assertEquals(strfy.focusModeFromString("crap"), FocusMode.AUTO);
        assertEquals(strfy.flashModeFromString("crap"), FlashMode.NO_FLASH);
        assertEquals(strfy.sceneModeFromString("crap"), SceneMode.NO_SCENE_MODE);
        assertEquals(strfy.whiteBalanceFromString("crap"), WhiteBalance.AUTO);
    }

    private CameraCharacteristics buildFrameworkCharacteristics() throws CameraAccessException {
        CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        String id = manager.getCameraIdList()[0];
        return manager.getCameraCharacteristics(id);
    }

    private void camera2SettingsCheckSingleOption(AndroidCamera2Settings setts,
                                                      Key<?> apiKey, int apiVal) {
        assertEquals(apiVal, setts.getRequestSettings().get(apiKey));
    }

    /**
     * Ensure that {@link AndroidCamera2Settings} correctly translates its
     * {@code FocusMode}, {@code SceneMode}, and {@code WhiteBalance} to the
     * corresponding framework API 2 representations.
     */
    @Test
    public void camera2SettingsSetOptionsAndGetRequestSettings() throws CameraAccessException {
        // We're only testing the focus modes, scene modes and white balances,
        // and won't use the activeArray, previewSize, or photoSize. The
        // constructor requires the former, so pass a degenerate rectangle.
        AndroidCamera2Settings set = new AndroidCamera2Settings(
                mCamera, CameraDevice.TEMPLATE_PREVIEW, /*activeArray*/new Rect(),
                /*previewSize*/null, /*photoSize*/null);

        // Focus modes
        set.setFocusMode(FocusMode.AUTO);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_AUTO);
        set.setFocusMode(FocusMode.CONTINUOUS_PICTURE);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_CONTINUOUS_PICTURE);
        set.setFocusMode(FocusMode.CONTINUOUS_VIDEO);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_CONTINUOUS_VIDEO);
        set.setFocusMode(FocusMode.EXTENDED_DOF);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_EDOF);
        set.setFocusMode(FocusMode.FIXED);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_OFF);
        set.setFocusMode(FocusMode.MACRO);
        camera2SettingsCheckSingleOption(set, CONTROL_AF_MODE, CONTROL_AF_MODE_MACRO);

        // Scene modes
        set.setSceneMode(SceneMode.AUTO);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED);
        set.setSceneMode(SceneMode.ACTION);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_ACTION);
        set.setSceneMode(SceneMode.BARCODE);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_BARCODE);
        set.setSceneMode(SceneMode.BEACH);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_BEACH);
        set.setSceneMode(SceneMode.CANDLELIGHT);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_CANDLELIGHT);
        set.setSceneMode(SceneMode.FIREWORKS);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_FIREWORKS);
        set.setSceneMode(SceneMode.LANDSCAPE);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_LANDSCAPE);
        set.setSceneMode(SceneMode.NIGHT);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_NIGHT);
        set.setSceneMode(SceneMode.PARTY);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_PARTY);
        set.setSceneMode(SceneMode.PORTRAIT);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_PORTRAIT);
        set.setSceneMode(SceneMode.SNOW);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SNOW);
        set.setSceneMode(SceneMode.SPORTS);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SPORTS);
        set.setSceneMode(SceneMode.STEADYPHOTO);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_STEADYPHOTO);
        set.setSceneMode(SceneMode.SUNSET);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_SUNSET);
        set.setSceneMode(SceneMode.THEATRE);
        camera2SettingsCheckSingleOption(set, CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_THEATRE);

        // White balances
        set.setWhiteBalance(WhiteBalance.AUTO);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO);
        set.setWhiteBalance(WhiteBalance.CLOUDY_DAYLIGHT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
        set.setWhiteBalance(WhiteBalance.DAYLIGHT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_DAYLIGHT);
        set.setWhiteBalance(WhiteBalance.FLUORESCENT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_FLUORESCENT);
        set.setWhiteBalance(WhiteBalance.INCANDESCENT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_INCANDESCENT);
        set.setWhiteBalance(WhiteBalance.SHADE);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_SHADE);
        set.setWhiteBalance(WhiteBalance.TWILIGHT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_TWILIGHT);
        set.setWhiteBalance(WhiteBalance.WARM_FLUORESCENT);
        camera2SettingsCheckSingleOption(set, CONTROL_AWB_MODE, CONTROL_AWB_MODE_WARM_FLUORESCENT);
    }

    // TODO: Add a test checking whether stringification matches API 1 representation

    /**
     * Ensure that {@code AndroidCamera2Capabilities#.*FromInt} correctly
     * translates from framework API 2 representations to the equivalent
     * {@code FocusMode}s, {@code SceneMode}s, and {@code WhiteBalance}s.
     */
    @Test
    public void camera2CapabilitiesFocusModeFromInt() throws CameraAccessException {
        CameraCharacteristics chars = buildFrameworkCharacteristics();
        AndroidCamera2Capabilities intstr = new AndroidCamera2Capabilities(chars);

        // Focus modes
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_AUTO), FocusMode.AUTO);
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_CONTINUOUS_PICTURE),
                FocusMode.CONTINUOUS_PICTURE);
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_CONTINUOUS_VIDEO),
                FocusMode.CONTINUOUS_VIDEO);
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_EDOF), FocusMode.EXTENDED_DOF);
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_OFF), FocusMode.FIXED);
        assertEquals(intstr.focusModeFromInt(CONTROL_AF_MODE_MACRO), FocusMode.MACRO);

        // Scene modes
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_DISABLED), SceneMode.AUTO);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_ACTION), SceneMode.ACTION);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_BARCODE), SceneMode.BARCODE);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_BEACH), SceneMode.BEACH);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_CANDLELIGHT), SceneMode.CANDLELIGHT);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_FIREWORKS), SceneMode.FIREWORKS);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_LANDSCAPE), SceneMode.LANDSCAPE);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_NIGHT), SceneMode.NIGHT);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_PARTY), SceneMode.PARTY);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_PORTRAIT), SceneMode.PORTRAIT);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SNOW), SceneMode.SNOW);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SPORTS), SceneMode.SPORTS);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_STEADYPHOTO),
                SceneMode.STEADYPHOTO);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_SUNSET), SceneMode.SUNSET);
        assertEquals(intstr.sceneModeFromInt(CONTROL_SCENE_MODE_THEATRE), SceneMode.THEATRE);

        // White balances
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_AUTO), WhiteBalance.AUTO);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_CLOUDY_DAYLIGHT),
                WhiteBalance.CLOUDY_DAYLIGHT);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_DAYLIGHT), WhiteBalance.DAYLIGHT);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_FLUORESCENT),
                WhiteBalance.FLUORESCENT);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_INCANDESCENT),
                WhiteBalance.INCANDESCENT);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_SHADE), WhiteBalance.SHADE);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_TWILIGHT), WhiteBalance.TWILIGHT);
        assertEquals(intstr.whiteBalanceFromInt(CONTROL_AWB_MODE_WARM_FLUORESCENT),
                WhiteBalance.WARM_FLUORESCENT);
    }
}