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