[go: nahoru, domu]

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