1f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck/*
2f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * Copyright (C) 2016 The Android Open Source Project
3f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck *
4f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * you may not use this file except in compliance with the License.
6f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * You may obtain a copy of the License at
7f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck *
8f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck *
10f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * Unless required by applicable law or agreed to in writing, software
11f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * See the License for the specific language governing permissions and
14f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck * limitations under the License.
15f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck */
16f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
17f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckpackage com.android.test.hwui;
18f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
19f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.app.Activity;
20f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.graphics.Bitmap;
21f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.net.Uri;
22f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.os.Bundle;
23f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.os.Environment;
24f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.view.PixelCopy;
25f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.view.View;
26f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.widget.Button;
27f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.widget.FrameLayout;
28f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.widget.LinearLayout;
29f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.widget.Toast;
30f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport android.widget.VideoView;
31f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
32f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckimport java.io.FileOutputStream;
33f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
34f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reckpublic class VideoViewCaptureActivity extends Activity {
35f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck    private VideoView mVideoView;
36f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck    private int mVideoWidth, mVideoHeight;
37f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
38f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck    @Override
39f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck    protected void onCreate(Bundle savedInstanceState) {
40f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        super.onCreate(savedInstanceState);
41f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        mVideoView = new VideoView(this);
42f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        mVideoView.setOnPreparedListener(mp -> {
43f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            mp.setLooping(true);
44f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            mVideoWidth = mp.getVideoWidth();
45f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            mVideoHeight = mp.getVideoHeight();
46f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            mVideoView.start();
47f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        });
48f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
49f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        Uri uri = Uri.parse("android.resource://com.android.test.hwui/" + R.raw.colorgrid_video);
50f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        mVideoView.setVideoURI(uri);
51f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
52f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        Button button = new Button(this);
53f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        button.setText("Copy bitmap to /sdcard/surfaceview.png");
54f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        button.setOnClickListener((View v) -> {
55f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            final Bitmap b = Bitmap.createBitmap(
56f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                    mVideoWidth, mVideoHeight,
57f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                    Bitmap.Config.ARGB_8888);
58f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck            PixelCopy.request(mVideoView, b,
59f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                    (int result) -> {
60f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                        if (result != PixelCopy.SUCCESS) {
61f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                            Toast.makeText(VideoViewCaptureActivity.this,
62f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                                    "Failed to copy", Toast.LENGTH_SHORT).show();
63f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                            return;
64f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                        }
65f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                        try {
66f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                            try (FileOutputStream out = new FileOutputStream(
67f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                                    Environment.getExternalStorageDirectory() + "/surfaceview.png");) {
68f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                                b.compress(Bitmap.CompressFormat.PNG, 100, out);
69f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                            }
70f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                        } catch (Exception e) {
71f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                            // Ignore
72f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                        }
73f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                    }, mVideoView.getHandler());
74f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        });
75f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
76f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        FrameLayout content = new FrameLayout(this);
77f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        LinearLayout layout = new LinearLayout(this);
78f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        layout.setOrientation(LinearLayout.VERTICAL);
79f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        layout.addView(button, LinearLayout.LayoutParams.MATCH_PARENT,
80f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                LinearLayout.LayoutParams.WRAP_CONTENT);
81f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        layout.addView(mVideoView, LinearLayout.LayoutParams.MATCH_PARENT,
82f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                LinearLayout.LayoutParams.MATCH_PARENT);
83f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck
84f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        content.addView(layout, new FrameLayout.LayoutParams(
85f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                FrameLayout.LayoutParams.MATCH_PARENT,
86f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck                FrameLayout.LayoutParams.MATCH_PARENT));
87f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck        setContentView(content);
88f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck    }
89f3a51d652ff9fbcb5a41c71c801de71a3b1ece78John Reck}
90