/*
* Copyright 2011 Jon A. Webb
*
* 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 root.gast.playground.image.livecaptureplus;
import java.util.List;
import jjil.android.Preview;
import root.gast.image.ManageCameraActivity;
import root.gast.playground.R;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class LiveCapturePlusActivity extends ManageCameraActivity
implements Preview.PreviewSizeChangedCallback
{
private Button mButtonFlash, mButtonFocus, mButtonSwitch,
mButtonWhiteBalance, mButtonZoom;
private List<String> mlszFocusModes, mlszFlashModes, mlszWhiteBalanceModes;
private int mnFlashMode, mnFocusMode, mnWhiteBalanceMode;
private Preview mPreview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// check for failure to find a camera
if (mNumberOfCameras == 0)
{
// nothing can be done; tell the user then exit
Toast toast = Toast.makeText(getApplicationContext(),
R.string.no_cameras, Toast.LENGTH_LONG);
toast.show();
finish();
}
// set up UI
setContentView(R.layout.image_livecaptureplus);
mPreview = (Preview) findViewById(R.id.preview1);
mPreview.setPreviewSizeChangedCallback(this);
mButtonFlash = (Button) findViewById(R.id.buttonFlash);
mButtonFlash.setOnClickListener(mButtonClickListener);
mButtonFocus = (Button) findViewById(R.id.buttonFocus);
mButtonFocus.setOnClickListener(mButtonClickListener);
mButtonSwitch = (Button) findViewById(R.id.buttonSwitchCamera);
mButtonSwitch.setOnClickListener(mButtonClickListener);
mButtonWhiteBalance = (Button) findViewById(R.id.buttonWhiteBalance);
mButtonWhiteBalance.setOnClickListener(mButtonClickListener);
mButtonZoom = (Button) findViewById(R.id.buttonZoom);
mButtonZoom.setOnClickListener(mButtonClickListener);
}
@Override
protected void onResume()
{
super.onResume();
// set UI for current camera
switchCameraUI();
}
@Override
protected void onPause()
{
super.onPause();
// clear current camera from UI
mPreview.setCamera(null);
}
/**
* switchCamera initializes the UI labels for the currently selected camera
*/
private void switchCameraUI()
{
mPreview.switchCamera(mCamera);
mButtonSwitch
.setText(getText(R.string.camera) + " " + mDefaultCameraId);
Camera.Parameters cameraParameters = mCamera.getParameters();
mlszFlashModes = cameraParameters.getSupportedFlashModes();
mlszFocusModes = cameraParameters.getSupportedFocusModes();
mlszWhiteBalanceModes = cameraParameters.getSupportedWhiteBalance();
mButtonFlash.setEnabled(mlszFlashModes != null
&& mlszFlashModes.size() > 0);
mButtonZoom.setEnabled(cameraParameters.isZoomSupported()
&& cameraParameters.getMaxZoom() > 0);
mnFlashMode = 0;
mnFocusMode = 0;
mnWhiteBalanceMode = 0;
setCameraLabels(cameraParameters);
}
/**
* set the button labels based on the current camera parameters
*
* @param cameraParameters
* : the curren camera parameters object
*/
void setCameraLabels(Camera.Parameters cameraParameters)
{
if (mlszFlashModes != null)
{
mButtonFlash.setText(getText(R.string.flash) + " "
+ cameraParameters.getFlashMode());
} else
{
mButtonFlash.setText(getText(R.string.flash));
mButtonZoom.setEnabled(false);
}
if (mlszFocusModes != null)
{
mButtonFocus.setText(getText(R.string.focus) + " "
+ cameraParameters.getFocusMode());
} else
{
mButtonFocus.setText(getText(R.string.focus));
mButtonFocus.setEnabled(false);
}
if (mlszWhiteBalanceModes != null)
{
mButtonWhiteBalance.setText(getText(R.string.whiteBalance) + " "
+ cameraParameters.getWhiteBalance());
} else
{
mButtonWhiteBalance.setText(getText(R.string.whiteBalance));
mButtonWhiteBalance.setEnabled(false);
}
mButtonZoom.setText(getText(R.string.zoom) + " "
+ cameraParameters.getZoom());
}
/**
* mButtonClickListener responds to all button click events
*/
private OnClickListener mButtonClickListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
Camera.Parameters cameraParameters = mCamera.getParameters();
if (v == mButtonFlash)
{
mnFlashMode = (mnFlashMode + 1) % mlszFlashModes.size();
cameraParameters.setFocusMode(mlszFlashModes.get(mnFlashMode));
} else if (v == mButtonFocus)
{
mnFocusMode = (mnFocusMode + 1) % mlszFocusModes.size();
cameraParameters.setFocusMode(mlszFocusModes.get(mnFocusMode));
} else if (v == mButtonSwitch)
{
mCamera.stopPreview();
advanceCamera();
switchCameraUI();
// mCamera.startPreview();
// reset camera parameters
cameraParameters = mCamera.getParameters();
} else if (v == mButtonWhiteBalance)
{
mnWhiteBalanceMode = (mnWhiteBalanceMode + 1)
% mlszWhiteBalanceModes.size();
cameraParameters.setFocusMode(mlszWhiteBalanceModes
.get(mnWhiteBalanceMode));
} else if (v == mButtonZoom)
{
cameraParameters.setZoom((cameraParameters.getZoom() + 1)
% cameraParameters.getMaxZoom() + 1);
}
// stop camera preview because changing some parameters caused a
// RuntimeException if it is running
mCamera.stopPreview();
try
{
mCamera.setParameters(cameraParameters);
} catch (RuntimeException rx)
{
String szError = getApplicationContext().getString(R.string.set_parameters_failed) +
rx.toString();
Toast t = Toast.makeText(getApplicationContext(), szError, Toast.LENGTH_SHORT);
t.show();
// the camera parameter change failed. Reset current value
cameraParameters = mCamera.getParameters();
}
mCamera.startPreview();
setCameraLabels(cameraParameters);
}
};
@Override
public void previewSizeChanged()
{
Camera.Parameters cameraParameters = mCamera.getParameters();
mButtonZoom.setEnabled(cameraParameters.isZoomSupported()
&& cameraParameters.getMaxZoom() > 0);
}
}