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 
17 package com.android.server.wm.flicker.helpers
18 
19 import android.app.Instrumentation
20 import android.tools.common.traces.component.ComponentNameMatcher
21 import android.tools.device.apphelpers.StandardAppHelper
22 import android.tools.device.helpers.FIND_TIMEOUT
23 import android.tools.device.traces.parsers.WindowManagerStateHelper
24 import android.tools.device.traces.parsers.toFlickerComponent
25 import androidx.test.uiautomator.By
26 import androidx.test.uiautomator.Until
27 import com.android.server.wm.flicker.testapp.ActivityOptions
28 
29 open class ImeAppHelper
30 @JvmOverloads
31 constructor(
32     instr: Instrumentation,
33     launcherName: String = ActivityOptions.Ime.Default.LABEL,
34     component: ComponentNameMatcher = ActivityOptions.Ime.Default.COMPONENT.toFlickerComponent()
35 ) : StandardAppHelper(instr, launcherName, component) {
36     /**
37      * Opens the IME and wait for it to be displayed
38      *
39      * @param wmHelper Helper used to wait for WindowManager states
40      */
41     open fun openIME(wmHelper: WindowManagerStateHelper) {
42         val editText =
43             uiDevice.wait(Until.findObject(By.res(getPackage(), "plain_text_input")), FIND_TIMEOUT)
44 
45         requireNotNull(editText) {
46             "Text field not found, this usually happens when the device " +
47                 "was left in an unknown state (e.g. in split screen)"
48         }
49         editText.click()
50         waitIMEShown(wmHelper)
51     }
52 
53     protected fun waitIMEShown(wmHelper: WindowManagerStateHelper) {
54         wmHelper.StateSyncBuilder().withImeShown().waitForAndVerify()
55     }
56 
57     /**
58      * Opens the IME and wait for it to be gone
59      *
60      * @param wmHelper Helper used to wait for WindowManager states
61      */
62     open fun closeIME(wmHelper: WindowManagerStateHelper) {
63         uiDevice.pressBack()
64         wmHelper.StateSyncBuilder().withImeGone().waitForAndVerify()
65     }
66 
67     open fun finishActivity(wmHelper: WindowManagerStateHelper) {
68         val finishButton =
69             uiDevice.wait(
70                 Until.findObject(By.res(getPackage(), "finish_activity_btn")),
71                 FIND_TIMEOUT
72             )
73         requireNotNull(finishButton) {
74             "Finish activity button not found, probably IME activity is not on the screen?"
75         }
76         finishButton.click()
77         wmHelper.StateSyncBuilder().withActivityRemoved(this).waitForAndVerify()
78     }
79 }
80