VideoChatTestActivity.java revision 430aa048a20aa42f089d213d8b4b6c67ab1b43fe
1d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd/*
2d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Copyright (C) 2010 The Android Open Source Project
3d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd *
4d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * you may not use this file except in compliance with the License.
6d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * You may obtain a copy of the License at
7d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd *
8d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd *
10d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * See the License for the specific language governing permissions and
14d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * limitations under the License.
15d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */
16d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
17d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpackage com.example.android.videochatcameratest;
18d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
19d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.app.Activity;
20d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.graphics.ImageFormat;
21d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera;
22d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera.Size;
23d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.AsyncTask;
24d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.Bundle;
25d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.util.Log;
265ef376788944f9deb937798e96a20fd93058815bMike Doddimport android.view.Surface;
27430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.view.TextureView;
28d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View;
29d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View.OnClickListener;
30d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.Button;
31d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.CheckBox;
32430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.widget.FrameLayout;
33d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.TextView;
34d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
35d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport java.io.IOException;
36202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Doddimport java.lang.UnsupportedOperationException;
371c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.ArrayList;
381c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.List;
39d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
40d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd/**
41d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * This class provides a basic demonstration of how to write an Android
42d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * activity. Inside of its window, it places a single view: an EditText that
43d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd * displays and edits some internal text.
44d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd */
45d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpublic class VideoChatTestActivity extends Activity {
46d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
47d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    static final private int NUM_CAMERA_PREVIEW_BUFFERS = 2;
48430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    static final boolean sRunningOnHoneycomb;
49d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    static final private String TAG = "VideoChatTest";
50202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    TextView mTextStatusHistory;
51430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    static {
52430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        sRunningOnHoneycomb =
53430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB;
54430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    }
55430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
56d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    public VideoChatTestActivity() {
57d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
58d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
59d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /** Called with the activity is first created. */
60d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    @Override
61d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    public void onCreate(Bundle savedInstanceState) {
62d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        super.onCreate(savedInstanceState);
63d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
64d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        // Inflate our UI from its XML layout description.
65d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        setContentView(R.layout.videochatcameratest_activity);
66d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
67430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        FrameLayout fl = (FrameLayout)findViewById(R.id.previewFrame);
68430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
69430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        if (sRunningOnHoneycomb) {
70430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            fl.addView(new SurfaceTextureView(this));
71430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        } else {
72430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            fl.addView(new CameraPreviewView(this));
73430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        }
74430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
75d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        ((Button) findViewById(R.id.gobutton)).setOnClickListener(mGoListener);
76d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
77d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        ((TextView)findViewById(R.id.statushistory)).setVerticalScrollBarEnabled(true);
78202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        mTextStatusHistory = (TextView) findViewById(R.id.statushistory);
79d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
805ef376788944f9deb937798e96a20fd93058815bMike Dodd        logMessage("Display Orientation " + getDisplayOrientation());
81202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
82202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            dumpCameraCaps(i);
83202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
84d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
85d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
86202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    private void logMessage(String message) {
87202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Log.v(TAG, message);
88202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        mTextStatusHistory.append(message + "\r\n");
89202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
90202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd
91202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    public int getCameraOrientation(int id) {
92202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.CameraInfo info =
93202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            new Camera.CameraInfo();
94202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.getCameraInfo(id, info);
95202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        return info.orientation;
96202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
97202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd
98202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    private void dumpCameraCaps(int id) {
99202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera cam = Camera.open(id);
100202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.Parameters params = cam.getParameters();
101202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<Integer> formats = params.getSupportedPreviewFormats();
102202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<int[]> frameRates = params.getSupportedPreviewFpsRange();
103202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<Camera.Size> sizes = params.getSupportedPreviewSizes();
104202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Camera " + id);
105202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Orientation " + getCameraOrientation(id));
106202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Sizes");
107202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (Size size : sizes) {
108202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(size.width + "x" + size.height);
109202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
110202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("frameRates");
111202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (int[] rates : frameRates) {
112202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(rates[0] + "-" + rates[1]);
113202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
114202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("formats");
115202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (Integer format : formats) {
116202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(format.toString());
117202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
118202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        cam.release();
119202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
120d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /**
121d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     * Called when the activity is about to start interacting with the user.
122d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     */
123d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    @Override
124d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    protected void onResume() {
125d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        super.onResume();
126d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
127d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
1285ef376788944f9deb937798e96a20fd93058815bMike Dodd    private int getDisplayOrientation() {
1295ef376788944f9deb937798e96a20fd93058815bMike Dodd        int rotation = getWindowManager().getDefaultDisplay().getRotation();
1305ef376788944f9deb937798e96a20fd93058815bMike Dodd        int degrees = 0;
1315ef376788944f9deb937798e96a20fd93058815bMike Dodd        switch (rotation) {
1325ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_0:
1335ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 0;
1345ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1355ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_90:
1365ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 90;
1375ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1385ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_180:
1395ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 180;
1405ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1415ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_270:
1425ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 270;
1435ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1445ef376788944f9deb937798e96a20fd93058815bMike Dodd        }
1455ef376788944f9deb937798e96a20fd93058815bMike Dodd        return degrees;
1465ef376788944f9deb937798e96a20fd93058815bMike Dodd    }
1475ef376788944f9deb937798e96a20fd93058815bMike Dodd
148d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /**
149d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     * A call-back for when the user presses the back button.
150d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     */
151d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    OnClickListener mGoListener = new OnClickListener() {
1525ef376788944f9deb937798e96a20fd93058815bMike Dodd        @Override
153d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        public void onClick(View v) {
1545ef376788944f9deb937798e96a20fd93058815bMike Dodd            int degrees = getDisplayOrientation();
1555ef376788944f9deb937798e96a20fd93058815bMike Dodd            new CameraTestRunner().execute(new Integer[] { degrees });
156d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
157d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    };
158d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
1595ef376788944f9deb937798e96a20fd93058815bMike Dodd    private class CameraTestRunner extends AsyncTask<Integer, String, Void> {
160d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
161d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        TextView mTextStatus;
162d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        TextView mTextStatusHistory;
1635ef376788944f9deb937798e96a20fd93058815bMike Dodd        private int mDisplayOrientation;
164d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
165d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
1665ef376788944f9deb937798e96a20fd93058815bMike Dodd        protected Void doInBackground(Integer... params) {
1675ef376788944f9deb937798e96a20fd93058815bMike Dodd            mDisplayOrientation = params[0];
168897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            mTextStatus = (TextView) findViewById(R.id.status);
169897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            mTextStatusHistory = (TextView) findViewById(R.id.statushistory);
170897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testFrontCamera =
171897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                    ((CheckBox) findViewById(R.id.frontcameracheckbox)).isChecked();
172897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testBackCamera = ((CheckBox) findViewById(R.id.backcameracheckbox)).isChecked();
173897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testQVGA = ((CheckBox) findViewById(R.id.qvgacheckbox)).isChecked();
174897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testVGA = ((CheckBox) findViewById(R.id.vgacheckbox)).isChecked();
175897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean test15fps = ((CheckBox) findViewById(R.id.fps15checkbox)).isChecked();
176897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean test30fps = ((CheckBox) findViewById(R.id.fps30checkbox)).isChecked();
177897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate0 = ((CheckBox) findViewById(R.id.rotate0checkbox)).isChecked();
178897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate90 = ((CheckBox) findViewById(R.id.rotate90checkbox)).isChecked();
179897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate180 = ((CheckBox) findViewById(R.id.rotate180checkbox)).isChecked();
180897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate270 = ((CheckBox) findViewById(R.id.rotate270checkbox)).isChecked();
1815ef376788944f9deb937798e96a20fd93058815bMike Dodd            boolean testRotateAuto = ((CheckBox) findViewById(R.id.rotateautocheckbox)).isChecked();
1821c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
1831c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            ArrayList<Integer> setDisplayOrentationAngles = new ArrayList<Integer>();
1841c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
1851c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate0) {
1861c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(0);
1871c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate90) {
1891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(90);
1901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate180) {
1921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(180);
1931c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1941c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate270) {
1951c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(270);
1961c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1975ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testRotateAuto) {
1985ef376788944f9deb937798e96a20fd93058815bMike Dodd                setDisplayOrentationAngles.add(-1);
1995ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
200d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
201897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int widths[] = new int[] {320, 640};
202897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int heights[] = new int[] {240, 480};
203d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
204897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int framerates[] = new int[] {15, 30};
205d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
2065ef376788944f9deb937798e96a20fd93058815bMike Dodd            ArrayList<Integer> whichCameras = new ArrayList<Integer>();
2075ef376788944f9deb937798e96a20fd93058815bMike Dodd            int numCameras = Camera.getNumberOfCameras();
2085ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testFrontCamera) {
2095ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (int i = 0; i < numCameras; i++) {
2105ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.CameraInfo info = new Camera.CameraInfo();
2115ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.getCameraInfo(i, info);
2125ef376788944f9deb937798e96a20fd93058815bMike Dodd                    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
2135ef376788944f9deb937798e96a20fd93058815bMike Dodd                        whichCameras.add(i);
2145ef376788944f9deb937798e96a20fd93058815bMike Dodd                        break;
215d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
2165ef376788944f9deb937798e96a20fd93058815bMike Dodd                }
2175ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
2185ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testBackCamera) {
2195ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (int i = 0; i < numCameras; i++) {
2205ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.CameraInfo info = new Camera.CameraInfo();
2215ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.getCameraInfo(i, info);
2225ef376788944f9deb937798e96a20fd93058815bMike Dodd                    if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
2235ef376788944f9deb937798e96a20fd93058815bMike Dodd                        whichCameras.add(i);
2245ef376788944f9deb937798e96a20fd93058815bMike Dodd                        break;
225d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
2265ef376788944f9deb937798e96a20fd93058815bMike Dodd                }
2275ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
2285ef376788944f9deb937798e96a20fd93058815bMike Dodd            do {
2295ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (Integer whichCamera : whichCameras) {
230897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                    for (int whichResolution = 0; whichResolution < 2; whichResolution++) {
231897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        if (whichResolution == 0 && !testQVGA) {
232d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                            continue;
233d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                        }
234897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        if (whichResolution == 1 && !testVGA) {
235d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                            continue;
236d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                        }
237d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
238897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        for (int whichFramerate = 0; whichFramerate < 2; whichFramerate++) {
239897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            if (whichFramerate == 0 && !test15fps) {
240897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                continue;
241897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            }
242897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            if (whichFramerate == 1 && !test30fps) {
243897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                continue;
244897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            }
245897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd
246897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            TestCamera(whichCamera, widths[whichResolution],
247897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                    heights[whichResolution], framerates[whichFramerate],
248897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                    setDisplayOrentationAngles);
249897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        }
250d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
251d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
252897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            } while (((CheckBox) findViewById(R.id.repeatcheckbox)).isChecked());
253d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            // start tests
254d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
255d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            return null;
256d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
257d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
258d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
259d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        protected void onPostExecute(Void result) {
260d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            final String allDoneString = "Test complete";
261d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, allDoneString);
262d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatus.setText(allDoneString);
263d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatusHistory.append(allDoneString + "\r\n");
264d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
265d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
266d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
267d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        private class FrameCatcher implements Camera.PreviewCallback {
268d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public int mFrames = 0;
269202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            private final int mExpectedSize;
270d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public FrameCatcher(int width, int height) {
271202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                mExpectedSize = width * height * 3 / 2;
272d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
273d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
274d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            @Override
275d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public void onPreviewFrame(byte[] data, Camera camera) {
276202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (mExpectedSize != data.length) {
277202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException("bad size, got " + data.length + " expected " + mExpectedSize);
278202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
279d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                mFrames++;
280d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.addCallbackBuffer(data);
281d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
282d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
283d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
2841c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
2851c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        private void setupCallback(Camera camera, FrameCatcher catcher, int bufferSize) {
2861c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            camera.setPreviewCallbackWithBuffer(null);
2871c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            camera.setPreviewCallbackWithBuffer(catcher);
2881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            for (int i = 0; i < NUM_CAMERA_PREVIEW_BUFFERS; i++) {
2891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                byte [] cameraBuffer = new byte[bufferSize];
2901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                camera.addCallbackBuffer(cameraBuffer);
2911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
2921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        }
2935ef376788944f9deb937798e96a20fd93058815bMike Dodd
2945ef376788944f9deb937798e96a20fd93058815bMike Dodd        private int getAutoDisplayOrientation(int displayOrientationDegrees,
2955ef376788944f9deb937798e96a20fd93058815bMike Dodd                int cameraId, android.hardware.Camera camera) {
2965ef376788944f9deb937798e96a20fd93058815bMike Dodd            android.hardware.Camera.CameraInfo info =
2975ef376788944f9deb937798e96a20fd93058815bMike Dodd                    new android.hardware.Camera.CameraInfo();
2985ef376788944f9deb937798e96a20fd93058815bMike Dodd            android.hardware.Camera.getCameraInfo(cameraId, info);
2995ef376788944f9deb937798e96a20fd93058815bMike Dodd
3005ef376788944f9deb937798e96a20fd93058815bMike Dodd            int result;
3015ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
3025ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (info.orientation + displayOrientationDegrees) % 360;
3035ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (360 - result) % 360; // compensate the mirror
3045ef376788944f9deb937798e96a20fd93058815bMike Dodd            } else { // back-facing
3055ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (info.orientation - displayOrientationDegrees + 360) % 360;
3065ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
3075ef376788944f9deb937798e96a20fd93058815bMike Dodd            return result;
3085ef376788944f9deb937798e96a20fd93058815bMike Dodd        }
3095ef376788944f9deb937798e96a20fd93058815bMike Dodd
3101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        protected void TestCamera(int whichCamera,
3111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int width, int height,
3121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int frameRate,
3131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                List<Integer> setDisplayOrentationAngles) {
314d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            String baseStatus = "Camera id " + whichCamera + " " +
315d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                width + "x" + height + " " +
316d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                frameRate + "fps";
317d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            publishProgress("Initializing " + baseStatus);
318d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            String status = "";
319d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            boolean succeeded = true;
320d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, "Start test -- id " + whichCamera + " " + width + "x" + height +
321d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    " " + frameRate + "fps");
322d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Camera camera;
323430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            FrameLayout previewBlock = (FrameLayout)findViewById(R.id.previewFrame);
324430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            SurfaceTextureView surfaceTextureView = null;
325430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            CameraPreviewView previewView = null;
326430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            if (sRunningOnHoneycomb) {
327430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                surfaceTextureView = (SurfaceTextureView)previewBlock.getChildAt(0);
328430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            } else {
329430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                previewView = (CameraPreviewView)previewBlock.getChildAt(0);
330430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            }
331d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
332d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            camera = Camera.open(whichCamera);
333d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            publishProgress("Opened " + baseStatus);
334d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            try {
335d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                try {
336430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
337430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewTexture(surfaceTextureView.getSurfaceTexture());
338430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
339430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewDisplay(previewView.mHolder);
340430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
341d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } catch (IOException exception) {
342d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
343d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status = exception.toString();
344d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    return;
345d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
346d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
347d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.setPreviewCallbackWithBuffer(null);
348d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Camera.Parameters parameters = camera.getParameters();
349d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
350202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                publishProgress("Changing preview parameters " + width + "x" + height + baseStatus);
351d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
352d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewSize(width, height);
353d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewFormat(ImageFormat.NV21);
354d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
355d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewFrameRate(frameRate);
356d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.setParameters(parameters);
357d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
358d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                publishProgress("Validating preview parameters " + baseStatus);
359d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
360d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters = camera.getParameters();
361d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Size setSize = parameters.getPreviewSize();
362d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (setSize.width != width || setSize.height != height) {
363d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status += "Bad reported size, wanted " + width + "x" + height + ", got " +
364d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    setSize.width + "x" + setSize.height;
365d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
366d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
367d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
368d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (parameters.getPreviewFrameRate() != frameRate) {
369d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status += "Bad reported frame rate, wanted " + frameRate
370d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    + ", got " + parameters.getPreviewFrameRate();
371d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
372d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
373d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
374d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                publishProgress("Initializing callback buffers " + baseStatus);
375d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                int imageFormat = parameters.getPreviewFormat();
376202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (imageFormat != ImageFormat.NV21) {
377202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    status = "Bad reported image format, wanted NV21 (" + ImageFormat.NV21 +
378202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                            ") got " + imageFormat;
379202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    succeeded = false;
380202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException(status);
381202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
382d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                int bufferSize;
383d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                bufferSize = setSize.width * setSize.height
384d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                                * ImageFormat.getBitsPerPixel(imageFormat) / 8;
385202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                int sizeWeShouldHave = (width * height * 3 / 2);
386202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (bufferSize != sizeWeShouldHave) {
387202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    status = "Bad calculate size. Should have been " + (width * height * 3 / 2) +
388202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                            " but got " + imageFormat;
389202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    succeeded = false;
390202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException(status);
391202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
392d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
393d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                FrameCatcher catcher = new FrameCatcher(setSize.width, setSize.height);
394d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
395d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (succeeded) {
396d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Starting " + baseStatus);
397d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
398d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Starting " + baseStatus + " -- but " + status);
399d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
4001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
4011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int numPasses;
4021c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                boolean doSetDisplayOrientation;
4031c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                if (setDisplayOrentationAngles == null || setDisplayOrentationAngles.size() == 0) {
4041c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    numPasses = 1;
4051c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    doSetDisplayOrientation = false;
4061c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                } else {
4071c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    numPasses = setDisplayOrentationAngles.size();
4081c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    doSetDisplayOrientation = true;
4091c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                }
4101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
4111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                for (int i = 0; i < numPasses; i++) {
4121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    if (doSetDisplayOrientation) {
4131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        int rotation = setDisplayOrentationAngles.get(i);
4145ef376788944f9deb937798e96a20fd93058815bMike Dodd                        if (rotation == -1) {
4155ef376788944f9deb937798e96a20fd93058815bMike Dodd                            rotation = getAutoDisplayOrientation(mDisplayOrientation,
4165ef376788944f9deb937798e96a20fd93058815bMike Dodd                                    whichCamera, camera);
4175ef376788944f9deb937798e96a20fd93058815bMike Dodd                        }
4181c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        publishProgress("setDisplayOrientation to " + rotation);
4191c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        try {
4201c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            camera.setDisplayOrientation(rotation);
4211c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        } catch (RuntimeException exception) {
4221c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            succeeded = false;
4231c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            status = exception.toString();
4241c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            return;
4251c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        }
4261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    }
427430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
428430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.resetFrameCounter();
429430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.setCameraEnabled(true);
430430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
431430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        setupCallback(camera, catcher, bufferSize);
432430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
4331c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    camera.startPreview();
4341c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    try {
4351c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        Thread.sleep(5000);
4361c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    } catch (InterruptedException exception) {
4371c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        succeeded = false;
4381c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        status = exception.toString();
4391c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        return;
4401c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    }
441430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
442430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.setCameraEnabled(false);
443430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
444430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewCallbackWithBuffer(null);
445430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
4461c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    camera.stopPreview();
447d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
448d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
449430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                int frames;
450430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                if (sRunningOnHoneycomb) {
451430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    frames = surfaceTextureView.getFrameCounter();
452430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                } else {
453430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    frames = catcher.mFrames;
454430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                }
455430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                if (frames == 0) {
456d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
457d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Preview callback received no frames from " + baseStatus);
458d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
459430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    publishProgress("Preview callback got " + frames + " frames (~" +
460430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                            Math.round(((double)frames)/(5.0 * numPasses)) + "fps) " +
4611c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            baseStatus);
462d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
463d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                try {
464d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    camera.setPreviewDisplay(null);
465d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } catch (IOException exception) {
466d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
467d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status = exception.toString();
468d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    return;
469d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
470d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            } finally {
471d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Log.v(TAG, "Releasing camera");
472d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
473d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (succeeded) {
474d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Success " + baseStatus);
475d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
476d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Finished " + baseStatus + " -- but " + status);
477d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
478d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
479d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.release();
480d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
481d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
482d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
483d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
484d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        protected void onProgressUpdate(String... message) {
485d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, message[0]);
486d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatus.setText(message[0]);
487d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatusHistory.append(message[0] + "\r\n");
488d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
489d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
490d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd}
491