1 /*
2  * Copyright (C) 2023 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.permissioncontroller.role.ui.wear
18 
19 import android.content.Intent
20 import android.os.Bundle
21 import android.os.UserHandle
22 import android.util.Log
23 import android.view.LayoutInflater
24 import android.view.View
25 import android.view.ViewGroup
26 import androidx.compose.ui.platform.ComposeView
27 import androidx.core.os.BundleCompat
28 import androidx.fragment.app.Fragment
29 import androidx.lifecycle.ViewModelProvider
30 import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
31 import com.android.permissioncontroller.role.ui.DefaultAppViewModel
32 import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData
33 import com.android.permissioncontroller.role.ui.wear.model.DefaultAppConfirmDialogViewModel
34 import com.android.permissioncontroller.role.ui.wear.model.DefaultAppConfirmDialogViewModelFactory
35 import com.android.role.controller.model.Role
36 import com.android.role.controller.model.Roles
37 
38 /**
39  * Wear specific version of
40  * [com.android.permissioncontroller.role.ui.handheld.HandheldDefaultAppFragment]
41  */
42 class WearDefaultAppFragment : Fragment() {
43     private lateinit var role: Role
44     private lateinit var viewModel: DefaultAppViewModel
45 
onCreateViewnull46     override fun onCreateView(
47         inflater: LayoutInflater,
48         container: ViewGroup?,
49         savedInstanceState: Bundle?
50     ): View? {
51         val roleName = arguments?.getString(Intent.EXTRA_ROLE_NAME) ?: ""
52         val user =
53             arguments?.let {
54                 BundleCompat.getParcelable(it, Intent.EXTRA_USER, UserHandle::class.java)!!
55             }
56                 ?: UserHandle.SYSTEM
57 
58         val activity = requireActivity()
59         role =
60             Roles.get(activity)[roleName]
61                 ?: let {
62                     Log.e(TAG, "Unknown role: $roleName")
63                     activity.finish()
64                     return null
65                 }
66 
67         viewModel =
68             ViewModelProvider(this, DefaultAppViewModel.Factory(role, user, activity.application))
69                 .get(DefaultAppViewModel::class.java)
70         viewModel.manageRoleHolderStateLiveData.observe(this, this::onManageRoleHolderStateChanged)
71 
72         val confirmDialogViewModel =
73             ViewModelProvider(this, DefaultAppConfirmDialogViewModelFactory())
74                 .get(DefaultAppConfirmDialogViewModel::class.java)
75 
76         return ComposeView(activity).apply {
77             setContent {
78                 WearPermissionTheme {
79                     WearDefaultAppScreen(
80                         WearDefaultAppHelper(
81                             activity,
82                             user,
83                             role,
84                             viewModel,
85                             confirmDialogViewModel
86                         )
87                     )
88                 }
89             }
90         }
91     }
92 
onManageRoleHolderStateChangednull93     private fun onManageRoleHolderStateChanged(state: Int) {
94         val liveData = viewModel.manageRoleHolderStateLiveData
95         when (state) {
96             ManageRoleHolderStateLiveData.STATE_SUCCESS -> {
97                 val packageName = liveData.lastPackageName
98                 if (packageName != null) {
99                     role.onHolderSelectedAsUser(packageName, liveData.lastUser, requireContext())
100                 }
101                 liveData.resetState()
102             }
103             ManageRoleHolderStateLiveData.STATE_FAILURE -> liveData.resetState()
104         }
105     }
106 
107     companion object {
108         const val TAG = "WearDefaultAppFragment"
109 
110         /** Creates a new instance of [WearDefaultAppFragment]. */
newInstancenull111         fun newInstance(roleName: String, user: UserHandle): WearDefaultAppFragment {
112             return WearDefaultAppFragment().apply {
113                 arguments =
114                     Bundle().apply {
115                         putString(Intent.EXTRA_ROLE_NAME, roleName)
116                         putParcelable(Intent.EXTRA_USER, user)
117                     }
118             }
119         }
120     }
121 }
122