1d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy/*
2d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Copyright (C) 2011 The Android Open Source Project
3d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy *
4d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * you may not use this file except in compliance with the License.
6d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * You may obtain a copy of the License at
7d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy *
8d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy *
10d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Unless required by applicable law or agreed to in writing, software
11d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * See the License for the specific language governing permissions and
14d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * limitations under the License.
15d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy */
16d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
17d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guypackage com.android.test.hwui;
18d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
19d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.app.Activity;
20d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.graphics.Bitmap;
21d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.graphics.SurfaceTexture;
22d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.hardware.Camera;
23d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.os.Bundle;
24d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.os.Environment;
25d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.Gravity;
26d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.TextureView;
27d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.View;
28d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.widget.Button;
29d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.widget.FrameLayout;
30d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
31d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.FileNotFoundException;
32d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.FileOutputStream;
33d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.IOException;
34d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
35d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy@SuppressWarnings({"UnusedDeclaration"})
36d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guypublic class GetBitmapActivity extends Activity implements TextureView.SurfaceTextureListener {
37d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    private Camera mCamera;
38d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    private TextureView mTextureView;
39d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
40d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    @Override
41d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    protected void onCreate(Bundle savedInstanceState) {
42d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        super.onCreate(savedInstanceState);
43d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
44d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        FrameLayout content = new FrameLayout(this);
45d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
46d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mTextureView = new TextureView(this);
47d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mTextureView.setSurfaceTextureListener(this);
48d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
49d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        Button button = new Button(this);
50d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        button.setText("Copy bitmap to /sdcard/textureview.png");
51d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        button.setOnClickListener(new View.OnClickListener() {
52d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy            @Override
53d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy            public void onClick(View v) {
54d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                Bitmap b = mTextureView.getBitmap();
55d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                try {
56d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                    FileOutputStream out = new FileOutputStream(
57d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                            Environment.getExternalStorageDirectory() + "/textureview.png");
58d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                    try {
59d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                        b.compress(Bitmap.CompressFormat.PNG, 100, out);
60d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                    } finally {
61d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                        try {
62d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                            out.close();
63d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                        } catch (IOException e) {
64d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                            // Ignore
65d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                        }
66d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                    }
67d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                } catch (FileNotFoundException e) {
68d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                    // Ignore
69d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                }
70d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy            }
71d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        });
72d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
73d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        content.addView(mTextureView, new FrameLayout.LayoutParams(500, 400, Gravity.CENTER));
74d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        content.addView(button, new FrameLayout.LayoutParams(
75d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT,
76d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
77d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        setContentView(content);
78d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    }
79d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
80d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    @Override
81d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
82d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mCamera = Camera.open();
83d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
84d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        try {
85d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy            mCamera.setPreviewTexture(surface);
86d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        } catch (IOException t) {
87d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy            android.util.Log.e("TextureView", "Cannot set preview texture target!", t);
88d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        }
89d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
90d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mCamera.startPreview();
91d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    }
92d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
93d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    @Override
94d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
95d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        // Ignored, the Camera does all the work for us
96d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    }
97d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy
98d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    @Override
99402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
100d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mCamera.stopPreview();
101d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        mCamera.release();
102402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba        return true;
103d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy    }
104cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba
105cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    @Override
106cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
107cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba        // Ignored
108cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    }
109d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy}
110