• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.test
17 
18 import android.content.Context
19 import android.content.pm.ActivityInfo
20 import android.content.res.Configuration.ORIENTATION_LANDSCAPE
21 import android.graphics.Color
22 import android.graphics.Paint
23 import android.graphics.Point
24 import android.graphics.Rect
25 import android.os.Bundle
26 import android.view.Gravity
27 import android.view.Surface
28 import android.view.SurfaceHolder
29 import android.view.SurfaceView
30 import android.view.View
31 import android.view.WindowManager
32 import android.view.cts.surfacevalidator.CapturedActivity
33 import android.widget.FrameLayout
34 import java.util.concurrent.CountDownLatch
35 import java.util.concurrent.locks.ReentrantLock
36 import kotlin.concurrent.withLock
37 
38 class MainActivity : CapturedActivity() {
39     val mSurfaceProxy = SurfaceProxy()
40     private var mSurfaceHolder: SurfaceHolder? = null
41     private val mDrawLock = ReentrantLock()
42     var mSurfaceView: SurfaceView? = null
43     private var mCountDownLatch: CountDownLatch? = null
44 
45     val surface: Surface? get() = mSurfaceHolder?.surface
46 
onCreatenull47     override fun onCreate(savedInstanceState: Bundle?) {
48         super.onCreate(savedInstanceState)
49         window.decorView.apply {
50             systemUiVisibility =
51                     View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
52         }
53     }
54 
getCaptureDurationMsnull55     override fun getCaptureDurationMs(): Long {
56         return 30000
57     }
58 
addSurfaceViewnull59     fun addSurfaceView(size: Point): CountDownLatch {
60         val layout = findViewById<FrameLayout>(android.R.id.content)
61         val surfaceReadyLatch = CountDownLatch(1)
62         mSurfaceView = createSurfaceView(applicationContext, size, surfaceReadyLatch)
63         layout!!.addView(mSurfaceView!!,
64                 FrameLayout.LayoutParams(size.x, size.y, Gravity.TOP or Gravity.LEFT)
65                         .also { it.setMargins(100, 100, 0, 0) })
66 
67         return surfaceReadyLatch
68     }
69 
resizeSurfaceViewnull70     fun resizeSurfaceView(size: Point): CountDownLatch {
71         mCountDownLatch = CountDownLatch(1)
72         mSurfaceView!!.layoutParams.also {
73             it.width = size.x
74             it.height = size.y
75         }
76         mSurfaceView!!.requestLayout()
77         return mCountDownLatch!!
78     }
79 
enableSeamlessRotationnull80     fun enableSeamlessRotation() {
81         val p: WindowManager.LayoutParams = window.attributes
82         p.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS
83         window.attributes = p
84     }
85 
rotate90null86     fun rotate90() {
87         if (getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE) {
88             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
89         } else {
90             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
91         }
92     }
93 
createSurfaceViewnull94     private fun createSurfaceView(
95         context: Context,
96         size: Point,
97         surfaceReadyLatch: CountDownLatch
98     ): SurfaceView {
99         val surfaceView = SurfaceView(context)
100         surfaceView.setWillNotDraw(false)
101         surfaceView.holder.addCallback(object : SurfaceHolder.Callback {
102             override fun surfaceCreated(holder: SurfaceHolder) {
103                 mDrawLock.withLock {
104                     mSurfaceHolder = holder
105                     mSurfaceProxy.setSurface(holder.surface)
106                 }
107                 surfaceReadyLatch.countDown()
108             }
109 
110             override fun surfaceChanged(
111                 holder: SurfaceHolder,
112                 format: Int,
113                 width: Int,
114                 height: Int
115             ) {
116                 mCountDownLatch?.countDown()
117             }
118 
119             override fun surfaceDestroyed(holder: SurfaceHolder) {
120                 mDrawLock.withLock {
121                     mSurfaceHolder = null
122                 }
123             }
124         })
125         return surfaceView
126     }
127 
drawFramenull128     fun drawFrame(): Rect {
129         mDrawLock.withLock {
130             val holder = mSurfaceHolder ?: return Rect()
131             val canvas = holder.lockCanvas()
132             val canvasSize = Rect(0, 0, canvas.width, canvas.height)
133             canvas.drawColor(Color.GREEN)
134             val p = Paint()
135             p.color = Color.RED
136             canvas.drawRect(canvasSize, p)
137             holder.unlockCanvasAndPost(canvas)
138             return canvasSize
139         }
140     }
141 }