181883e5717ca215fa1f2b104912701f830829642Mike Dodd// Copyright 2010 Google Inc.
281883e5717ca215fa1f2b104912701f830829642Mike Dodd// All Rights Reserved.
3d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
4d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpackage com.example.android.videochatcameratest;
5d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
6d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.app.Activity;
7d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.graphics.ImageFormat;
8d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera;
9d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.hardware.Camera.Size;
10d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.AsyncTask;
11d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.os.Bundle;
12d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.util.Log;
135ef376788944f9deb937798e96a20fd93058815bMike Doddimport android.view.Surface;
14430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.view.TextureView;
15d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View;
16d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.view.View.OnClickListener;
17f5959cb49b5186b9dbd18488341adeab70307e48Mike Doddimport android.view.Window;
18f5959cb49b5186b9dbd18488341adeab70307e48Mike Doddimport android.view.WindowManager;
19d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.Button;
20d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.CheckBox;
21430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Doddimport android.widget.FrameLayout;
22d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport android.widget.TextView;
23d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
24d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddimport java.io.IOException;
25202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Doddimport java.lang.UnsupportedOperationException;
261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.ArrayList;
271c9454b217a7c470dc8b8bf3940679a222ed9cedMike Doddimport java.util.List;
28d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
29d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Doddpublic class VideoChatTestActivity extends Activity {
30d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
31d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    static final private int NUM_CAMERA_PREVIEW_BUFFERS = 2;
32430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    static final boolean sRunningOnHoneycomb;
33d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    static final private String TAG = "VideoChatTest";
34202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    TextView mTextStatusHistory;
35430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    static {
36430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        sRunningOnHoneycomb =
37430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB;
38430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd    }
39430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
40d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    public VideoChatTestActivity() {
41d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
42d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
43d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /** Called with the activity is first created. */
44d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    @Override
45d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    public void onCreate(Bundle savedInstanceState) {
46d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        super.onCreate(savedInstanceState);
47d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
48f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd        Window window = getWindow();
49f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd        window.setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
50f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
51f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd
52d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        // Inflate our UI from its XML layout description.
53d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        setContentView(R.layout.videochatcameratest_activity);
54d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
55430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        FrameLayout fl = (FrameLayout)findViewById(R.id.previewFrame);
56430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
57430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        if (sRunningOnHoneycomb) {
58430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            fl.addView(new SurfaceTextureView(this));
59430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        } else {
60430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            fl.addView(new CameraPreviewView(this));
61430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd        }
62430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd
63d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        ((Button) findViewById(R.id.gobutton)).setOnClickListener(mGoListener);
64d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
65d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        ((TextView)findViewById(R.id.statushistory)).setVerticalScrollBarEnabled(true);
66202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        mTextStatusHistory = (TextView) findViewById(R.id.statushistory);
67d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
685ef376788944f9deb937798e96a20fd93058815bMike Dodd        logMessage("Display Orientation " + getDisplayOrientation());
69202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
70202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            dumpCameraCaps(i);
71202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
72d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
73d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
74202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    private void logMessage(String message) {
75202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Log.v(TAG, message);
76202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        mTextStatusHistory.append(message + "\r\n");
77202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
78202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd
79202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    public int getCameraOrientation(int id) {
80202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.CameraInfo info =
81202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            new Camera.CameraInfo();
82202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.getCameraInfo(id, info);
83202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        return info.orientation;
84202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
85202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd
86202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    private void dumpCameraCaps(int id) {
87202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera cam = Camera.open(id);
88202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        Camera.Parameters params = cam.getParameters();
89202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<Integer> formats = params.getSupportedPreviewFormats();
90202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<int[]> frameRates = params.getSupportedPreviewFpsRange();
91202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        List<Camera.Size> sizes = params.getSupportedPreviewSizes();
92202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Camera " + id);
93202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Orientation " + getCameraOrientation(id));
94202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("Sizes");
95202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (Size size : sizes) {
96202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(size.width + "x" + size.height);
97202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
98202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("frameRates");
99202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (int[] rates : frameRates) {
100202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(rates[0] + "-" + rates[1]);
101202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
102202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        logMessage("formats");
103202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        for (Integer format : formats) {
104202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            logMessage(format.toString());
105202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        }
106202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd        cam.release();
107202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd    }
108d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /**
109d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     * Called when the activity is about to start interacting with the user.
110d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     */
111d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    @Override
112d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    protected void onResume() {
113d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        super.onResume();
114d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
115d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
1165ef376788944f9deb937798e96a20fd93058815bMike Dodd    private int getDisplayOrientation() {
1175ef376788944f9deb937798e96a20fd93058815bMike Dodd        int rotation = getWindowManager().getDefaultDisplay().getRotation();
1185ef376788944f9deb937798e96a20fd93058815bMike Dodd        int degrees = 0;
1195ef376788944f9deb937798e96a20fd93058815bMike Dodd        switch (rotation) {
1205ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_0:
1215ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 0;
1225ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1235ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_90:
1245ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 90;
1255ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1265ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_180:
1275ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 180;
1285ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1295ef376788944f9deb937798e96a20fd93058815bMike Dodd            case Surface.ROTATION_270:
1305ef376788944f9deb937798e96a20fd93058815bMike Dodd                degrees = 270;
1315ef376788944f9deb937798e96a20fd93058815bMike Dodd                break;
1325ef376788944f9deb937798e96a20fd93058815bMike Dodd        }
1335ef376788944f9deb937798e96a20fd93058815bMike Dodd        return degrees;
1345ef376788944f9deb937798e96a20fd93058815bMike Dodd    }
1355ef376788944f9deb937798e96a20fd93058815bMike Dodd
136d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    /**
137d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     * A call-back for when the user presses the back button.
138d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd     */
139d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    OnClickListener mGoListener = new OnClickListener() {
1405ef376788944f9deb937798e96a20fd93058815bMike Dodd        @Override
141d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        public void onClick(View v) {
1425ef376788944f9deb937798e96a20fd93058815bMike Dodd            int degrees = getDisplayOrientation();
1435ef376788944f9deb937798e96a20fd93058815bMike Dodd            new CameraTestRunner().execute(new Integer[] { degrees });
144d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
145d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    };
146d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
1475ef376788944f9deb937798e96a20fd93058815bMike Dodd    private class CameraTestRunner extends AsyncTask<Integer, String, Void> {
148d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
149d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        TextView mTextStatus;
1505ef376788944f9deb937798e96a20fd93058815bMike Dodd        private int mDisplayOrientation;
151f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd        private volatile boolean mClearStatusOnNextUpdate;
152d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
153d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
1545ef376788944f9deb937798e96a20fd93058815bMike Dodd        protected Void doInBackground(Integer... params) {
1555ef376788944f9deb937798e96a20fd93058815bMike Dodd            mDisplayOrientation = params[0];
156897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            mTextStatus = (TextView) findViewById(R.id.status);
157897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testFrontCamera =
158897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                    ((CheckBox) findViewById(R.id.frontcameracheckbox)).isChecked();
159897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testBackCamera = ((CheckBox) findViewById(R.id.backcameracheckbox)).isChecked();
160897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testQVGA = ((CheckBox) findViewById(R.id.qvgacheckbox)).isChecked();
161897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testVGA = ((CheckBox) findViewById(R.id.vgacheckbox)).isChecked();
162897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean test15fps = ((CheckBox) findViewById(R.id.fps15checkbox)).isChecked();
163897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean test30fps = ((CheckBox) findViewById(R.id.fps30checkbox)).isChecked();
164897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate0 = ((CheckBox) findViewById(R.id.rotate0checkbox)).isChecked();
165897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate90 = ((CheckBox) findViewById(R.id.rotate90checkbox)).isChecked();
166897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate180 = ((CheckBox) findViewById(R.id.rotate180checkbox)).isChecked();
167897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            boolean testRotate270 = ((CheckBox) findViewById(R.id.rotate270checkbox)).isChecked();
1685ef376788944f9deb937798e96a20fd93058815bMike Dodd            boolean testRotateAuto = ((CheckBox) findViewById(R.id.rotateautocheckbox)).isChecked();
1691c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
1701c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            ArrayList<Integer> setDisplayOrentationAngles = new ArrayList<Integer>();
1711c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
1721c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate0) {
1731c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(0);
1741c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1751c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate90) {
1761c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(90);
1771c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1781c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate180) {
1791c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(180);
1801c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1811c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            if (testRotate270) {
1821c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                setDisplayOrentationAngles.add(270);
1831c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
1845ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testRotateAuto) {
1855ef376788944f9deb937798e96a20fd93058815bMike Dodd                setDisplayOrentationAngles.add(-1);
1865ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
187d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
188897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int widths[] = new int[] {320, 640};
189897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int heights[] = new int[] {240, 480};
190d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
191897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            final int framerates[] = new int[] {15, 30};
192d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
1935ef376788944f9deb937798e96a20fd93058815bMike Dodd            ArrayList<Integer> whichCameras = new ArrayList<Integer>();
1945ef376788944f9deb937798e96a20fd93058815bMike Dodd            int numCameras = Camera.getNumberOfCameras();
1955ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testFrontCamera) {
1965ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (int i = 0; i < numCameras; i++) {
1975ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.CameraInfo info = new Camera.CameraInfo();
1985ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.getCameraInfo(i, info);
1995ef376788944f9deb937798e96a20fd93058815bMike Dodd                    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
2005ef376788944f9deb937798e96a20fd93058815bMike Dodd                        whichCameras.add(i);
2015ef376788944f9deb937798e96a20fd93058815bMike Dodd                        break;
202d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
2035ef376788944f9deb937798e96a20fd93058815bMike Dodd                }
2045ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
2055ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (testBackCamera) {
2065ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (int i = 0; i < numCameras; i++) {
2075ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.CameraInfo info = new Camera.CameraInfo();
2085ef376788944f9deb937798e96a20fd93058815bMike Dodd                    Camera.getCameraInfo(i, info);
2095ef376788944f9deb937798e96a20fd93058815bMike Dodd                    if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
2105ef376788944f9deb937798e96a20fd93058815bMike Dodd                        whichCameras.add(i);
2115ef376788944f9deb937798e96a20fd93058815bMike Dodd                        break;
212d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
2135ef376788944f9deb937798e96a20fd93058815bMike Dodd                }
2145ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
2155ef376788944f9deb937798e96a20fd93058815bMike Dodd            do {
216f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd                mClearStatusOnNextUpdate = true;
2175ef376788944f9deb937798e96a20fd93058815bMike Dodd                for (Integer whichCamera : whichCameras) {
218897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                    for (int whichResolution = 0; whichResolution < 2; whichResolution++) {
219897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        if (whichResolution == 0 && !testQVGA) {
220d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                            continue;
221d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                        }
222897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        if (whichResolution == 1 && !testVGA) {
223d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                            continue;
224d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                        }
225d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
226897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        for (int whichFramerate = 0; whichFramerate < 2; whichFramerate++) {
227897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            if (whichFramerate == 0 && !test15fps) {
228897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                continue;
229897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            }
230897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            if (whichFramerate == 1 && !test30fps) {
231897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                continue;
232897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            }
233897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd
234897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                            TestCamera(whichCamera, widths[whichResolution],
235897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                    heights[whichResolution], framerates[whichFramerate],
236897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                                    setDisplayOrentationAngles);
237897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd                        }
238d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    }
239d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
240897a4640891a4f7d90e9edecd5f385772d2c92c3Mike Dodd            } while (((CheckBox) findViewById(R.id.repeatcheckbox)).isChecked());
241d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            // start tests
242d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
243d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            return null;
244d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
245d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
246d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
247d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        protected void onPostExecute(Void result) {
248d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            final String allDoneString = "Test complete";
249d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, allDoneString);
250d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatus.setText(allDoneString);
251d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatusHistory.append(allDoneString + "\r\n");
252d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
253d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
254d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
255d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        private class FrameCatcher implements Camera.PreviewCallback {
256d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public int mFrames = 0;
257202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd            private final int mExpectedSize;
258d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public FrameCatcher(int width, int height) {
259202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                mExpectedSize = width * height * 3 / 2;
260d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
261d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
262d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            @Override
263d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            public void onPreviewFrame(byte[] data, Camera camera) {
264202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (mExpectedSize != data.length) {
265202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException("bad size, got " + data.length + " expected " + mExpectedSize);
266202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
267d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                mFrames++;
268d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.addCallbackBuffer(data);
269d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
270d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
271d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
2721c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
2731c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        private void setupCallback(Camera camera, FrameCatcher catcher, int bufferSize) {
2741c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            camera.setPreviewCallbackWithBuffer(null);
2751c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            camera.setPreviewCallbackWithBuffer(catcher);
2761c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            for (int i = 0; i < NUM_CAMERA_PREVIEW_BUFFERS; i++) {
2771c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                byte [] cameraBuffer = new byte[bufferSize];
2781c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                camera.addCallbackBuffer(cameraBuffer);
2791c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd            }
2801c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        }
2815ef376788944f9deb937798e96a20fd93058815bMike Dodd
2825ef376788944f9deb937798e96a20fd93058815bMike Dodd        private int getAutoDisplayOrientation(int displayOrientationDegrees,
2835ef376788944f9deb937798e96a20fd93058815bMike Dodd                int cameraId, android.hardware.Camera camera) {
2845ef376788944f9deb937798e96a20fd93058815bMike Dodd            android.hardware.Camera.CameraInfo info =
2855ef376788944f9deb937798e96a20fd93058815bMike Dodd                    new android.hardware.Camera.CameraInfo();
2865ef376788944f9deb937798e96a20fd93058815bMike Dodd            android.hardware.Camera.getCameraInfo(cameraId, info);
2875ef376788944f9deb937798e96a20fd93058815bMike Dodd
2885ef376788944f9deb937798e96a20fd93058815bMike Dodd            int result;
2895ef376788944f9deb937798e96a20fd93058815bMike Dodd            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
2905ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (info.orientation + displayOrientationDegrees) % 360;
2915ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (360 - result) % 360; // compensate the mirror
2925ef376788944f9deb937798e96a20fd93058815bMike Dodd            } else { // back-facing
2935ef376788944f9deb937798e96a20fd93058815bMike Dodd                result = (info.orientation - displayOrientationDegrees + 360) % 360;
2945ef376788944f9deb937798e96a20fd93058815bMike Dodd            }
2955ef376788944f9deb937798e96a20fd93058815bMike Dodd            return result;
2965ef376788944f9deb937798e96a20fd93058815bMike Dodd        }
2975ef376788944f9deb937798e96a20fd93058815bMike Dodd
2981c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd        protected void TestCamera(int whichCamera,
2991c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int width, int height,
3001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int frameRate,
3011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                List<Integer> setDisplayOrentationAngles) {
302d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            String baseStatus = "Camera id " + whichCamera + " " +
303d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                width + "x" + height + " " +
304d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                frameRate + "fps";
305d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            publishProgress("Initializing " + baseStatus);
306d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            String status = "";
307d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            boolean succeeded = true;
308d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, "Start test -- id " + whichCamera + " " + width + "x" + height +
309d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    " " + frameRate + "fps");
310d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Camera camera;
311430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            FrameLayout previewBlock = (FrameLayout)findViewById(R.id.previewFrame);
312430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            SurfaceTextureView surfaceTextureView = null;
313430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            CameraPreviewView previewView = null;
314430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            if (sRunningOnHoneycomb) {
315430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                surfaceTextureView = (SurfaceTextureView)previewBlock.getChildAt(0);
316430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            } else {
317430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                previewView = (CameraPreviewView)previewBlock.getChildAt(0);
318430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd            }
319d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
320d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            camera = Camera.open(whichCamera);
321d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            publishProgress("Opened " + baseStatus);
322d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            try {
323d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                try {
324430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
325430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewTexture(surfaceTextureView.getSurfaceTexture());
326430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
327430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewDisplay(previewView.mHolder);
328430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
329d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } catch (IOException exception) {
330d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
331d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status = exception.toString();
332d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    return;
333d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
334d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
335d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.setPreviewCallbackWithBuffer(null);
336d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Camera.Parameters parameters = camera.getParameters();
337d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
338202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                publishProgress("Changing preview parameters " + width + "x" + height + baseStatus);
339d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
340d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewSize(width, height);
341d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewFormat(ImageFormat.NV21);
342d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
343d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters.setPreviewFrameRate(frameRate);
344d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.setParameters(parameters);
345d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
346d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                publishProgress("Validating preview parameters " + baseStatus);
347d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
348d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                parameters = camera.getParameters();
349d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Size setSize = parameters.getPreviewSize();
350d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (setSize.width != width || setSize.height != height) {
351d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status += "Bad reported size, wanted " + width + "x" + height + ", got " +
352d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    setSize.width + "x" + setSize.height;
353d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
354d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
355d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
356d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (parameters.getPreviewFrameRate() != frameRate) {
357d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status += "Bad reported frame rate, wanted " + frameRate
358d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    + ", got " + parameters.getPreviewFrameRate();
359d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
360d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
361d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
362d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                publishProgress("Initializing callback buffers " + baseStatus);
363d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                int imageFormat = parameters.getPreviewFormat();
364202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (imageFormat != ImageFormat.NV21) {
365202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    status = "Bad reported image format, wanted NV21 (" + ImageFormat.NV21 +
366202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                            ") got " + imageFormat;
367202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    succeeded = false;
368202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException(status);
369202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
370d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                int bufferSize;
371d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                bufferSize = setSize.width * setSize.height
372d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                                * ImageFormat.getBitsPerPixel(imageFormat) / 8;
373202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                int sizeWeShouldHave = (width * height * 3 / 2);
374202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                if (bufferSize != sizeWeShouldHave) {
375202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    status = "Bad calculate size. Should have been " + (width * height * 3 / 2) +
376202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                            " but got " + imageFormat;
377202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    succeeded = false;
378202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                    throw new UnsupportedOperationException(status);
379202e88cbb3a52a78d6c4ccf55fa9ed9248f43ecdMike Dodd                }
380d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
381d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                FrameCatcher catcher = new FrameCatcher(setSize.width, setSize.height);
382d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
383d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (succeeded) {
384d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Starting " + baseStatus);
385d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
386d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Starting " + baseStatus + " -- but " + status);
387d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
3881c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
3891c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                int numPasses;
3901c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                boolean doSetDisplayOrientation;
3911c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                if (setDisplayOrentationAngles == null || setDisplayOrentationAngles.size() == 0) {
3921c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    numPasses = 1;
3931c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    doSetDisplayOrientation = false;
3941c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                } else {
3951c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    numPasses = setDisplayOrentationAngles.size();
3961c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    doSetDisplayOrientation = true;
3971c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                }
3981c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd
3991c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                for (int i = 0; i < numPasses; i++) {
4001c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    if (doSetDisplayOrientation) {
4011c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        int rotation = setDisplayOrentationAngles.get(i);
4025ef376788944f9deb937798e96a20fd93058815bMike Dodd                        if (rotation == -1) {
4035ef376788944f9deb937798e96a20fd93058815bMike Dodd                            rotation = getAutoDisplayOrientation(mDisplayOrientation,
4045ef376788944f9deb937798e96a20fd93058815bMike Dodd                                    whichCamera, camera);
4055ef376788944f9deb937798e96a20fd93058815bMike Dodd                        }
4061c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        publishProgress("setDisplayOrientation to " + rotation);
4071c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        try {
4081c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            camera.setDisplayOrientation(rotation);
4091c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        } catch (RuntimeException exception) {
4101c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            succeeded = false;
4111c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            status = exception.toString();
4121c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            return;
4131c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        }
4141c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    }
415430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
416430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.resetFrameCounter();
417430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.setCameraEnabled(true);
418430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
419430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        setupCallback(camera, catcher, bufferSize);
420430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
4211c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    camera.startPreview();
4221c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    try {
4231c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        Thread.sleep(5000);
4241c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    } catch (InterruptedException exception) {
4251c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        succeeded = false;
4261c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        status = exception.toString();
4271c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                        return;
4281c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    }
429430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    if (sRunningOnHoneycomb) {
430430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        surfaceTextureView.setCameraEnabled(false);
431430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    } else {
432430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                        camera.setPreviewCallbackWithBuffer(null);
433430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    }
4341c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                    camera.stopPreview();
435d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
436d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
437430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                int frames;
438430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                if (sRunningOnHoneycomb) {
439430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    frames = surfaceTextureView.getFrameCounter();
440430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                } else {
441430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    frames = catcher.mFrames;
442430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                }
443430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                if (frames == 0) {
444d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
445d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Preview callback received no frames from " + baseStatus);
446d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
447430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                    publishProgress("Preview callback got " + frames + " frames (~" +
448430aa048a20aa42f089d213d8b4b6c67ab1b43feMike Dodd                            Math.round(((double)frames)/(5.0 * numPasses)) + "fps) " +
4491c9454b217a7c470dc8b8bf3940679a222ed9cedMike Dodd                            baseStatus);
450d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
451d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                try {
452d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    camera.setPreviewDisplay(null);
453d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } catch (IOException exception) {
454d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    succeeded = false;
455d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    status = exception.toString();
456d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    return;
457d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
458d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            } finally {
459d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                Log.v(TAG, "Releasing camera");
460d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
461d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                if (succeeded) {
462d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Success " + baseStatus);
463d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                } else {
464d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                    publishProgress("Finished " + baseStatus + " -- but " + status);
465d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                }
466d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
467d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd                camera.release();
468d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            }
469d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
470d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd
471d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        @Override
472d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        protected void onProgressUpdate(String... message) {
473f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd            if (mClearStatusOnNextUpdate) {
474f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd                mClearStatusOnNextUpdate = false;
475f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd                mTextStatusHistory.setText("");
476f5959cb49b5186b9dbd18488341adeab70307e48Mike Dodd            }
477d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            Log.v(TAG, message[0]);
478d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatus.setText(message[0]);
479d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd            mTextStatusHistory.append(message[0] + "\r\n");
480d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd        }
481d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd    }
482d25ce723b563a2967382484b34e0fd1dcd40aaf1Mike Dodd}
483