1 /* 2 * Copyright (C) 2022 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 android.healthconnect.cts.lib 17 18 import android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS 19 import android.content.Context 20 import android.content.Intent 21 import android.content.Intent.EXTRA_PACKAGE_NAME 22 import android.content.pm.PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES 23 import android.health.connect.HealthConnectManager 24 import android.healthconnect.cts.lib.UiTestUtils.TEST_APP_PACKAGE_NAME 25 import android.healthconnect.cts.lib.UiTestUtils.skipOnboardingIfAppears 26 import com.android.compatibility.common.util.SystemUtil 27 import com.android.compatibility.common.util.UiAutomatorUtils2.getUiDevice 28 29 /** A class that provides a way to launch the Health Connect [MainActivity] in tests. */ 30 object ActivityLauncher { 31 /** Launches the Main activity and exits it once [block] completes. */ Contextnull32 fun Context.launchMainActivity(block: () -> Unit) { 33 val intent = 34 Intent("android.health.connect.action.HEALTH_HOME_SETTINGS") 35 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 36 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) 37 executeBlockAndExit(block) { 38 startActivity(intent) 39 skipOnboardingIfAppears() 40 } 41 } 42 Contextnull43 fun Context.launchDataActivity(block: () -> Unit) { 44 val intent = 45 Intent("android.health.connect.action.MANAGE_HEALTH_DATA") 46 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 47 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) 48 executeBlockAndExit(block) { 49 startActivity(intent) 50 skipOnboardingIfAppears() 51 } 52 } 53 Contextnull54 fun Context.launchRequestPermissionActivity( 55 packageName: String = TEST_APP_PACKAGE_NAME, 56 permissions: List<String>, 57 block: () -> Unit 58 ) { 59 val intent = 60 Intent(HealthConnectManager.ACTION_REQUEST_HEALTH_PERMISSIONS).apply { 61 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 62 addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) 63 putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissions.toTypedArray()) 64 putExtra(EXTRA_PACKAGE_NAME, packageName) 65 } 66 executeBlockAndExit(block) { 67 SystemUtil.runWithShellPermissionIdentity( 68 { 69 startActivity(intent) 70 skipOnboardingIfAppears() 71 }, 72 GRANT_RUNTIME_PERMISSIONS) 73 } 74 } 75 executeBlockAndExitnull76 private fun executeBlockAndExit(block: () -> Unit, launchActivity: () -> Unit) { 77 val uiDevice = getUiDevice() 78 uiDevice.waitForIdle() 79 launchActivity() 80 uiDevice.waitForIdle() 81 block() 82 uiDevice.pressBack() 83 uiDevice.waitForIdle() 84 } 85 } 86