16d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/* 26d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Copyright 2016 The Android Open Source Project 36d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 46d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Licensed under the Apache License, Version 2.0 (the "License"); 56d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * you may not use this file except in compliance with the License. 66d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * You may obtain a copy of the License at 76d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 86d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * http://www.apache.org/licenses/LICENSE-2.0 96d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Unless required by applicable law or agreed to in writing, software 116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * distributed under the License is distributed on an "AS IS" BASIS, 126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * See the License for the specific language governing permissions and 146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * limitations under the License. 156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpackage com.android.mediaframeworktest; 186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.app.Activity; 206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.os.Bundle; 216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.os.ConditionVariable; 226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.os.SystemClock; 236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.util.Log; 246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.view.SurfaceHolder; 256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.view.SurfaceView; 266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.view.WindowManager; 276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/** 296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * (non-Javadoc) 306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @see android.hardware.camera2.cts.Camera2SurfaceViewCtsActivity 316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpublic class Camera2SurfaceViewActivity extends Activity implements SurfaceHolder.Callback { 336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private static final String TAG = "SurfaceViewActivity"; 346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private final ConditionVariable surfaceChangedDone = new ConditionVariable(); 356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private SurfaceView mSurfaceView; 376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private int currentWidth = 0; 386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private int currentHeight = 0; 396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private final Object sizeLock = new Object(); 406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim @Override 426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim protected void onCreate(Bundle savedInstanceState) { 436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim super.onCreate(savedInstanceState); 446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim setContentView(R.layout.surface_view_2); 466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); 476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim mSurfaceView.getHolder().addCallback(this); 486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim //Acquire the full wake lock to keep the device up 506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public SurfaceView getSurfaceView() { 546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return mSurfaceView; 556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public boolean waitForSurfaceSizeChanged(int timeOutMs, int expectWidth, int expectHeight) { 586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (timeOutMs <= 0 || expectWidth <= 0 || expectHeight <= 0) { 596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new IllegalArgumentException( 606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim String.format( 616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim "timeout(%d), expectWidth(%d), and expectHeight(%d) " + 626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim "should all be positive numbers", 636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim timeOutMs, expectWidth, expectHeight)); 646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim synchronized(sizeLock) { 676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (expectWidth == currentWidth && expectHeight == currentHeight) { 686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return true; 696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim int waitTimeMs = timeOutMs; 736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim boolean changeSucceeded = false; 746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim while (!changeSucceeded && waitTimeMs > 0) { 756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim long startTimeMs = SystemClock.elapsedRealtime(); 766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim changeSucceeded = surfaceChangedDone.block(waitTimeMs); 776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (!changeSucceeded) { 786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim Log.e(TAG, "Wait for surface change timed out after " + timeOutMs + " ms"); 796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return changeSucceeded; 806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } else { 816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim // Get a surface change callback, need to check if the size is expected. 826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim surfaceChangedDone.close(); 836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (currentWidth == expectWidth && currentHeight == expectHeight) { 846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return changeSucceeded; 856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim // Do a further iteration surface change check as surfaceChanged could be called 876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim // again. 886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim changeSucceeded = false; 896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim waitTimeMs -= (SystemClock.elapsedRealtime() - startTimeMs); 916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim // Couldn't get expected surface size change. 946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return false; 956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim @Override 986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public void surfaceCreated(SurfaceHolder holder) { 996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim @Override 1026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 1036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim Log.i(TAG, "Surface Changed to: " + width + "x" + height); 1046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim synchronized (sizeLock) { 1056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim currentWidth = width; 1066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim currentHeight = height; 1076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim surfaceChangedDone.open(); 1096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim @Override 1126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public void surfaceDestroyed(SurfaceHolder holder) { 1136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim} 115