TestingCamera.java revision b28605e5d09a08c915183772819cb1c7c53cdb34
148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala/*
248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala *
448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * you may not use this file except in compliance with the License.
648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * You may obtain a copy of the License at
748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala *
848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala *
1048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * See the License for the specific language governing permissions and
1448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * limitations under the License.
1548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala */
1648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
1748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalapackage com.android.testingcamera;
1848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
1948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.app.Activity;
2048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.app.Dialog;
2148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.graphics.Bitmap;
2248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.graphics.BitmapFactory;
2348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.hardware.Camera;
2448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.os.Bundle;
2548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.View;
2648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.SurfaceHolder;
2748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.view.SurfaceView;
2848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.AdapterView;
2948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ArrayAdapter;
3048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.Button;
3148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ImageView;
3248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.LinearLayout.LayoutParams;
3348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.Spinner;
3448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.CompoundButton;
3548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.TextView;
3648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.widget.ToggleButton;
3748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport android.util.Log;
3848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
3948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.io.IOException;
4048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.ArrayList;
4148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.Comparator;
4248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.List;
4348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvalaimport java.util.TreeSet;
4448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
4548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala/**
4648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala * A simple test application for the camera API.
4794d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala *
4894d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala * The goal of this application is to allow all camera API features to be
4994d24977868e0713cf03f7cec4d6de051f411dcaEino-Ville Talvala * excercised, and all information provided by the API to be shown.
5048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala */
51b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvalapublic class TestingCamera extends Activity implements SurfaceHolder.Callback {
5248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
5348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    /** UI elements */
5448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private SurfaceView mPreviewView;
5548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private SurfaceHolder mPreviewHolder;
5648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
5748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Spinner mCameraSpinner;
5848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Spinner mPreviewSizeSpinner;
5948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private ToggleButton mPreviewToggle;
6048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Button  mTakePictureButton;
61b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
62b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala    private TextView mSnapshotText;
63b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala    private ImageView mSnapshotImg;
6448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
6548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    /** Camera state */
6648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private int mCameraId = 0;
6748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera mCamera;
6848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera.Parameters mParams;
6948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private List<Camera.Size> mPreviewSizes;
7048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private int mPreviewSize = 0;
7148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
7248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private static final int CAMERA_UNINITIALIZED = 0;
7348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private static final int CAMERA_OPEN = 1;
7448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private static final int CAMERA_PREVIEW = 2;
7548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private static final int CAMERA_TAKE_PICTURE = 3;
7648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private int mState = CAMERA_UNINITIALIZED;
7748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
7848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    /** Misc variables */
7948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
8048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private static final String TAG = "TestingCamera";
8148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
8248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    // Activity methods
8348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
8448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void onCreate(Bundle savedInstanceState) {
8548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        super.onCreate(savedInstanceState);
8648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
8748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        setContentView(R.layout.main);
8848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
8948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewView = (SurfaceView)findViewById(R.id.preview);
9048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewView.getHolder().addCallback(this);
9148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
9248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCameraSpinner = (Spinner) findViewById(R.id.camera_spinner);
9348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCameraSpinner.setOnItemSelectedListener(mCameraSpinnerListener);
9448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
9548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewSizeSpinner = (Spinner) findViewById(R.id.preview_size_spinner);
9648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewSizeSpinner.setOnItemSelectedListener(mPreviewSizeListener);
9748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
9848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewToggle = (ToggleButton) findViewById(R.id.start_preview);
9948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewToggle.setOnClickListener(mPreviewToggleListener);
10048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
10148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mTakePictureButton = (Button) findViewById(R.id.take_picture);
10248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mTakePictureButton.setOnClickListener(mTakePictureListener);
10348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
10448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        int numCameras = Camera.getNumberOfCameras();
10548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        String[] cameraNames = new String[numCameras];
10648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        for (int i = 0; i < numCameras; i++) {
10748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            cameraNames[i] = "Camera " + i;
10848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
10948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
11048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCameraSpinner.setAdapter(
11148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                new ArrayAdapter<String>(this,
11248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        R.layout.spinner_item, cameraNames));
11348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
11448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
11548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
11648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void onResume() {
11748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        super.onResume();
11848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewHolder = null;
11948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        setUpCamera();
12048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
12148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
12248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
12348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void onPause() {
12448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        super.onPause();
12548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
12648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCamera.release();
12748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mState = CAMERA_UNINITIALIZED;
12848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
12948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
130b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala    protected Dialog onCreateDialog(int id) {
131b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        Dialog dialog = new Dialog(this);
132b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        dialog.setContentView(R.layout.snapshot_dialog);
133b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        dialog.setTitle("Snapshot");
134b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
135b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        mSnapshotText =
136b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                (TextView) dialog.findViewById(R.id.snapshot_text);
137b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        mSnapshotText.setText("Snapshot title");
138b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
139b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        mSnapshotImg =
140b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                (ImageView) dialog.findViewById(R.id.snapshot_image);
141b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
142b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        return dialog;
143b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala    }
144b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
14548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    // SurfaceHolder.Callback methods
14648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
14748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void surfaceChanged(SurfaceHolder holder,
14848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            int format,
14948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            int width,
15048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            int height) {
15148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        if (mPreviewHolder != null) return;
15248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
15348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        Log.d(TAG, "Surface holder available: " + width + " x " + height);
15448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewHolder = holder;
15548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        try {
15648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mCamera.setPreviewDisplay(holder);
15748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        } catch (IOException e) {
15848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.e(TAG, "Unable to set up preview!");
15948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
16048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        resizePreview(mPreviewSizes.get(mPreviewSize).width,
16148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mPreviewSizes.get(mPreviewSize).height);
16248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
16348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
16448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
16548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void surfaceCreated(SurfaceHolder holder) {
16648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
16748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
16848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
16948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    @Override
17048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    public void surfaceDestroyed(SurfaceHolder holder) {
17148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
17248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
17348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
17448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    // UI listeners
17548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
17648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private AdapterView.OnItemSelectedListener mCameraSpinnerListener =
177b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala            new AdapterView.OnItemSelectedListener() {
178b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                public void onItemSelected(AdapterView<?> parent,
17948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        View view, int pos, long id) {
180b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                    if (mCameraId != pos) {
18148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        mCameraId = pos;
18248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        setUpCamera();
183b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                    }
18448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                }
18548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
186b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                public void onNothingSelected(AdapterView parent) {
1874ae1a87883045d820ffd6e1b8a95c13b1919e00aEino-Ville Talvala
18848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                }
189b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala            };
19048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
19148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private AdapterView.OnItemSelectedListener mPreviewSizeListener =
19248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            new AdapterView.OnItemSelectedListener() {
19348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                public void onItemSelected(AdapterView<?> parent,
19448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        View view, int pos, long id) {
19548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    if (pos == mPreviewSize) return;
19648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    Log.d(TAG, "Switching preview sizes");
19748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
19848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    if (mState == CAMERA_PREVIEW) {
19948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        mCamera.stopPreview();
20048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    }
20148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
20248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    mPreviewSize = pos;
20348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    int width = mPreviewSizes.get(mPreviewSize).width;
20448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    int height = mPreviewSizes.get(mPreviewSize).height;
20548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    mParams.setPreviewSize(width, height);
20648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
20748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    mCamera.setParameters(mParams);
20848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    resizePreview(width, height);
20948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
21048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    if (mState == CAMERA_PREVIEW) {
21148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                        mCamera.startPreview();
21248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                    }
21348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                }
21448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
21548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                public void onNothingSelected(AdapterView parent) {
21648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
21748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                }
21848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            };
21948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
22048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private View.OnClickListener mPreviewToggleListener =
22148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            new View.OnClickListener() {
22248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onClick(View v) {
22348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            if (mState == CAMERA_TAKE_PICTURE) {
22448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                Log.e(TAG, "Can't change preview state while taking picture!");
22548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                return;
22648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            }
22748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            if (mPreviewToggle.isChecked()) {
22848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                Log.d(TAG, "Starting preview");
22948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
23048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mCamera.startPreview();
23148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mState = CAMERA_PREVIEW;
23248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
23348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mTakePictureButton.setEnabled(true);
23448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            } else {
23548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                Log.d(TAG, "Stopping preview");
23648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mCamera.stopPreview();
23748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mState = CAMERA_OPEN;
23848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
23948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mTakePictureButton.setEnabled(false);
24048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            }
24148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
24248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
24348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
24448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private View.OnClickListener mTakePictureListener =
24548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            new View.OnClickListener() {
24648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onClick(View v) {
24748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Taking picture");
24848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            if (mState == CAMERA_PREVIEW) {
24948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mState = CAMERA_TAKE_PICTURE;
25048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
25148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mTakePictureButton.setEnabled(false);
25248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mPreviewToggle.setEnabled(false);
25348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mPreviewToggle.setChecked(false);
25448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
25548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mCamera.takePicture(mShutterCb, mRawCb, mPostviewCb, mJpegCb);
25648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            } else {
25748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                Log.e(TAG, "Can't take picture while not running preview!");
25848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            }
25948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
26048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
26148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
26248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera.ShutterCallback mShutterCb = new Camera.ShutterCallback() {
26348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onShutter() {
26448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Shutter cb fired");
26548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
26648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
26748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
26848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera.PictureCallback mRawCb = new Camera.PictureCallback() {
26948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onPictureTaken(byte[] data, Camera camera) {
27048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Raw cb fired");
27148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
27248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
27348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
27448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera.PictureCallback mPostviewCb = new Camera.PictureCallback() {
27548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onPictureTaken(byte[] data, Camera camera) {
27648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Postview cb fired");
27748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
27848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
27948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
28048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    private Camera.PictureCallback mJpegCb = new Camera.PictureCallback() {
28148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        public void onPictureTaken(byte[] data, Camera camera) {
28248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "JPEG cb fired");
283b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala
284b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala            showDialog(1);
28548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
28648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Bitmap img = BitmapFactory.decodeByteArray(data, 0, data.length);
287b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala            mSnapshotImg.setImageBitmap(img);
28848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
28948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mPreviewToggle.setEnabled(true);
29048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
29148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mState = CAMERA_OPEN;
29248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
29348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    };
29448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
29548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    // Internal methods
29648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
29748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    void setUpCamera() {
29848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        Log.d(TAG, "Setting up camera " + mCameraId);
29948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        if (mState >= CAMERA_OPEN) {
30048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Closing old camera");
30148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mCamera.release();
30248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mState = CAMERA_UNINITIALIZED;
30348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
30448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        Log.d(TAG, "Opening camera " + mCameraId);
30548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCamera = Camera.open(mCameraId);
30648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mState = CAMERA_OPEN;
30748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
30848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mParams = mCamera.getParameters();
30948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewSizes = mParams.getSupportedPreviewSizes();
31048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
31148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        String[] availableSizeNames = new String[mPreviewSizes.size()];
312b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala        for (int i = 0; i < mPreviewSizes.size(); i++) {
313b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala            availableSizeNames[i] =
314b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                    Integer.toString(mPreviewSizes.get(i).width) + " x " +
315b28605e5d09a08c915183772819cb1c7c53cdb34Eino-Ville Talvala                    Integer.toString(mPreviewSizes.get(i).height);
31648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
31748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewSizeSpinner.setAdapter(
31848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            new ArrayAdapter<String>(
31948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                this, R.layout.spinner_item, availableSizeNames));
32048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
32148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewSize = 0;
32248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
32348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        int width = mPreviewSizes.get(mPreviewSize).width;
32448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        int height = mPreviewSizes.get(mPreviewSize).height;
32548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mParams.setPreviewSize(width, height);
32648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
32748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mCamera.setParameters(mParams);
32848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
32948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        if (mPreviewHolder != null) {
33048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            try {
33148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                mCamera.setPreviewDisplay(mPreviewHolder);
33248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            } catch(IOException e) {
33348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                Log.e(TAG, "Unable to set up preview!");
33448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            }
33548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
33648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
33748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewToggle.setEnabled(true);
33848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mPreviewToggle.setChecked(false);
33948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        mTakePictureButton.setEnabled(false);
34048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
34148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        resizePreview(width, height);
34248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        if (mPreviewToggle.isChecked()) {
34348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            Log.d(TAG, "Starting preview" );
34448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala             mCamera.startPreview();
34548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mState = CAMERA_PREVIEW;
34648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
34748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
34848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
34948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    void resizePreview(int width, int height) {
35048f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        if (mPreviewHolder != null) {
35148f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            int viewHeight = mPreviewView.getHeight();
35248f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            int viewWidth = (int)(((double)width)/height * viewHeight);
35348f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
35448f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala            mPreviewView.setLayoutParams(
35548f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala                new LayoutParams(viewWidth, viewHeight));
35648f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala        }
35748f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala
35848f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala    }
35948f2556e12eeaa8932947fe6c8083e64bb5eb804Eino-Ville Talvala}