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 
17 package com.android.permissioncontroller.role.utils;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.content.pm.ApplicationInfo;
22 import android.os.UserHandle;
23 import android.util.Log;
24 
25 import androidx.annotation.NonNull;
26 import androidx.annotation.Nullable;
27 
28 import com.android.permissioncontroller.role.ui.RequestRoleItemView;
29 import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
30 import com.android.permissioncontroller.role.ui.RolePreference;
31 import com.android.permissioncontroller.role.ui.behavior.RoleUiBehavior;
32 import com.android.role.controller.model.Role;
33 
34 import java.util.List;
35 
36 /**
37  * Utility methods for Role UI behavior
38  */
39 public final class RoleUiBehaviorUtils {
40 
41     private static final String LOG_TAG = RoleUiBehaviorUtils.class.getSimpleName();
42 
43     /**
44      * Get the role ui behavior if available
45      */
46     @Nullable
getUiBehavior(@onNull Role role)47     private static RoleUiBehavior getUiBehavior(@NonNull Role role) {
48         String uiBehaviorName = role.getUiBehaviorName();
49         if (uiBehaviorName == null) {
50             return null;
51         }
52         RoleUiBehavior uiBehavior;
53         String uiBehaviorClassName = RoleUiBehavior.class.getPackage().getName() + '.'
54                 + uiBehaviorName;
55         try {
56             uiBehavior = (RoleUiBehavior) Class.forName(uiBehaviorClassName).newInstance();
57         } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
58             Log.e(LOG_TAG, "Unable to instantiate UI behavior: " + uiBehaviorClassName, e);
59             return null;
60         }
61         return uiBehavior;
62     }
63 
64     /**
65      * @see RoleUiBehavior#prepareRequestRoleItemViewAsUser
66      */
prepareRequestRoleItemViewAsUser(@onNull Role role, @NonNull RequestRoleItemView itemView, @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user, @NonNull Context context)67     public static void prepareRequestRoleItemViewAsUser(@NonNull Role role,
68             @NonNull RequestRoleItemView itemView, @NonNull ApplicationInfo applicationInfo,
69             @NonNull UserHandle user, @NonNull Context context) {
70         RoleUiBehavior uiBehavior = getUiBehavior(role);
71         if (uiBehavior == null) {
72             return;
73         }
74         uiBehavior.prepareRequestRoleItemViewAsUser(role, itemView, applicationInfo, user, context);
75     }
76 
77     /**
78      * @see RoleUiBehavior#getManageIntentAsUser
79      */
80     @Nullable
getManageIntentAsUser(@onNull Role role, @NonNull UserHandle user, @NonNull Context context)81     public static Intent getManageIntentAsUser(@NonNull Role role, @NonNull UserHandle user,
82             @NonNull Context context) {
83         RoleUiBehavior uiBehavior = getUiBehavior(role);
84         if (uiBehavior == null) {
85             return null;
86         }
87         return uiBehavior.getManageIntentAsUser(role, user, context);
88     }
89 
90     /**
91      * @see RoleUiBehavior#preparePreferenceAsUser
92      */
preparePreferenceAsUser(@onNull Role role, @NonNull List<ApplicationInfo> applicationInfos, @NonNull RolePreference preference, @NonNull UserHandle user, @NonNull Context context)93     public static void preparePreferenceAsUser(@NonNull Role role,
94             @NonNull List<ApplicationInfo> applicationInfos, @NonNull RolePreference preference,
95             @NonNull UserHandle user, @NonNull Context context) {
96         RoleUiBehavior uiBehavior = getUiBehavior(role);
97         if (uiBehavior == null) {
98             return;
99         }
100         uiBehavior.preparePreferenceAsUser(role, preference, applicationInfos, user, context);
101     }
102 
103     /**
104      * @see RoleUiBehavior#prepareApplicationPreferenceAsUser
105      */
prepareApplicationPreferenceAsUser(@onNull Role role, @NonNull RoleApplicationPreference preference, @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user, @NonNull Context context)106     public static void prepareApplicationPreferenceAsUser(@NonNull Role role,
107             @NonNull RoleApplicationPreference preference,
108             @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user,
109             @NonNull Context context) {
110         RoleUiBehavior uiBehavior = getUiBehavior(role);
111         if (uiBehavior == null) {
112             return;
113         }
114         uiBehavior.prepareApplicationPreferenceAsUser(
115                 role, preference.asTwoStatePreference(), applicationInfo, user,
116                 context);
117     }
118 
119     /**
120      * @see RoleUiBehavior#getConfirmationMessage
121      */
122     @Nullable
getConfirmationMessage(@onNull Role role, @NonNull String packageName, @NonNull Context context)123     public static CharSequence getConfirmationMessage(@NonNull Role role,
124             @NonNull String packageName, @NonNull Context context) {
125         RoleUiBehavior uiBehavior = getUiBehavior(role);
126         if (uiBehavior == null) {
127             return null;
128         }
129         return uiBehavior.getConfirmationMessage(role, packageName, context);
130     }
131 }
132