1 /* 2 * Copyright 2024 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 * https://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 */ 18 19 package com.android.healthconnect.controller.navigation 20 21 import android.content.Intent 22 import android.content.Intent.EXTRA_PACKAGE_NAME 23 import android.health.connect.HealthConnectManager 24 import android.os.Bundle 25 import android.util.Log 26 import android.view.WindowManager 27 import androidx.fragment.app.FragmentActivity 28 import com.android.healthconnect.controller.MainActivity 29 import com.android.healthconnect.controller.data.DataManagementActivity 30 import com.android.healthconnect.controller.onboarding.OnboardingActivity 31 import com.android.healthconnect.controller.onboarding.OnboardingActivity.Companion.shouldRedirectToOnboardingActivity 32 import com.android.healthconnect.controller.permissions.shared.SettingsActivity 33 import com.android.healthconnect.controller.utils.DeviceInfoUtils 34 import com.android.healthconnect.controller.utils.activity.EmbeddingUtils.maybeRedirectIntoTwoPaneSettings 35 import dagger.hilt.android.AndroidEntryPoint 36 import javax.inject.Inject 37 38 /** 39 * A proxy activity that starts health connect screens. This activity validates intents and handles 40 * errors starting health connect screens. 41 */ 42 @AndroidEntryPoint(FragmentActivity::class) 43 class TrampolineActivity : Hilt_TrampolineActivity() { 44 45 companion object { 46 private const val TAG = "TrampolineActivity" 47 } 48 49 @Inject lateinit var deviceInfoUtils: DeviceInfoUtils 50 onCreatenull51 override fun onCreate(savedInstanceState: Bundle?) { 52 super.onCreate(savedInstanceState) 53 // This flag ensures a non system app cannot show an overlay on Health Connect. b/313425281 54 window.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) 55 // Handles unsupported devices and user profiles. 56 if (!deviceInfoUtils.isHealthConnectAvailable(this)) { 57 Log.e(TAG, "Health connect is not available for this user or hardware, finishing!") 58 finish() 59 return 60 } 61 62 // Handles large screen support in settings. 63 if (maybeRedirectIntoTwoPaneSettings(this)) { 64 finish() 65 return 66 } 67 68 val targetIntent = getTargetIntent() 69 70 // Handles showing Health Connect Onboarding. 71 if (shouldRedirectToOnboardingActivity(this)) { 72 startActivity(OnboardingActivity.createIntent(this, targetIntent)) 73 finish() 74 return 75 } 76 77 startActivity(targetIntent) 78 finish() 79 } 80 getTargetIntentnull81 private fun getTargetIntent(): Intent { 82 return when (intent.action) { 83 HealthConnectManager.ACTION_HEALTH_HOME_SETTINGS -> { 84 Intent(this, MainActivity::class.java) 85 } 86 HealthConnectManager.ACTION_MANAGE_HEALTH_DATA -> { 87 Intent(this, DataManagementActivity::class.java) 88 } 89 HealthConnectManager.ACTION_MANAGE_HEALTH_PERMISSIONS -> { 90 val extraPackageName: String? = intent.getStringExtra(EXTRA_PACKAGE_NAME) 91 92 Intent(this, SettingsActivity::class.java).apply { 93 if (extraPackageName != null) { 94 putExtra(EXTRA_PACKAGE_NAME, extraPackageName) 95 } 96 } 97 } 98 99 else -> { 100 // Default to open Health Connect MainActivity 101 Intent(this, MainActivity::class.java) 102 } 103 } 104 } 105 } 106