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