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