/*
|
* Copyright (C) 2010 ZXing authors
|
*
|
* 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.videogo.scan.camera;
|
|
import android.content.Context;
|
import android.content.SharedPreferences;
|
import android.graphics.Point;
|
import android.hardware.Camera;
|
import android.preference.PreferenceManager;
|
import android.view.Display;
|
import android.view.WindowManager;
|
|
import com.videogo.scan.main.PreferencesActivity;
|
import com.videogo.util.LogUtil;
|
|
import java.util.Collection;
|
|
final class CameraConfigurationManager {
|
|
private static final String TAG = "CameraConfiguration";
|
|
private static final int MIN_PREVIEW_PIXELS = 320 * 240; // small screen
|
|
private static final int MAX_PREVIEW_PIXELS = 800 * 1280; // large/HD screen
|
|
private final Context context;
|
|
private Point screenResolution = null;
|
|
private Point cameraResolution = null;
|
|
CameraConfigurationManager(Context context) {
|
this.context = context;
|
}
|
|
void initFromCameraParameters(Camera camera) {
|
Camera.Parameters parameters = camera.getParameters();
|
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
|
Display display = manager.getDefaultDisplay();
|
int width = display.getWidth();
|
int height = display.getHeight();
|
// We're landscape-only, and have apparently seen issues with display thinking it's portrait
|
// when waking from sleep. If it's not landscape, assume it's mistaken and reverse them:
|
if (width < height) {
|
LogUtil.d(TAG, "Display reports portrait orientation; assuming this is incorrect");
|
int temp = width;
|
width = height;
|
height = temp;
|
}
|
|
screenResolution = new Point(width, height);
|
LogUtil.d(TAG, "Screen resolution: " + screenResolution);
|
cameraResolution = findBestPreviewSizeValue(parameters, screenResolution, false);
|
LogUtil.d(TAG, "Camera resolution: " + cameraResolution);
|
}
|
|
void setDesiredCameraParameters(Camera camera) {
|
Camera.Parameters parameters = camera.getParameters();
|
|
if (parameters == null) {
|
LogUtil.w(TAG, "Device error: no camera parameters are available. Proceeding without configuration.");
|
return;
|
}
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
|
initializeTorch(parameters, prefs);
|
String focusMode = findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO,
|
Camera.Parameters.FOCUS_MODE_MACRO);
|
if (focusMode != null) {
|
parameters.setFocusMode(focusMode);
|
}
|
|
parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
|
camera.setParameters(parameters);
|
camera.setDisplayOrientation(90);
|
}
|
|
Point getCameraResolution() {
|
return cameraResolution;
|
}
|
|
Point getScreenResolution() {
|
return screenResolution;
|
}
|
|
private static void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs) {
|
boolean currentSetting = prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false);
|
doSetTorch(parameters, currentSetting);
|
}
|
|
private static void doSetTorch(Camera.Parameters parameters, boolean newSetting) {
|
String flashMode;
|
if (newSetting) {
|
flashMode = findSettableValue(parameters.getSupportedFlashModes(), Camera.Parameters.FLASH_MODE_TORCH,
|
Camera.Parameters.FLASH_MODE_ON);
|
} else {
|
flashMode = findSettableValue(parameters.getSupportedFlashModes(), Camera.Parameters.FLASH_MODE_OFF);
|
}
|
if (flashMode != null) {
|
parameters.setFlashMode(flashMode);
|
}
|
}
|
|
private static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution, boolean portrait) {
|
Point bestSize = null;
|
int diff = Integer.MAX_VALUE;
|
for (Camera.Size supportedPreviewSize : parameters.getSupportedPreviewSizes()) {
|
int pixels = supportedPreviewSize.height * supportedPreviewSize.width;
|
if (pixels < MIN_PREVIEW_PIXELS || pixels > MAX_PREVIEW_PIXELS) {
|
continue;
|
}
|
int supportedWidth = portrait ? supportedPreviewSize.height : supportedPreviewSize.width;
|
int supportedHeight = portrait ? supportedPreviewSize.width : supportedPreviewSize.height;
|
int newDiff = Math.abs(screenResolution.x * supportedHeight - supportedWidth * screenResolution.y);
|
if (newDiff == 0) {
|
bestSize = new Point(supportedWidth, supportedHeight);
|
break;
|
}
|
if (newDiff < diff) {
|
bestSize = new Point(supportedWidth, supportedHeight);
|
diff = newDiff;
|
}
|
}
|
if (bestSize == null) {
|
Camera.Size defaultSize = parameters.getPreviewSize();
|
bestSize = new Point(defaultSize.width, defaultSize.height);
|
}
|
return bestSize;
|
}
|
|
private static String findSettableValue(Collection<String> supportedValues, String... desiredValues) {
|
LogUtil.d(TAG, "Supported values: " + supportedValues);
|
String result = null;
|
if (supportedValues != null) {
|
for (String desiredValue : desiredValues) {
|
if (supportedValues.contains(desiredValue)) {
|
result = desiredValue;
|
break;
|
}
|
}
|
}
|
LogUtil.d(TAG, "Settable value: " + result);
|
return result;
|
}
|
|
}
|