• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.packageinstaller.role.model;
18 
19 import android.content.Context;
20 import android.os.Process;
21 import android.os.UserHandle;
22 import android.os.UserManager;
23 import android.telephony.TelephonyManager;
24 
25 import androidx.annotation.NonNull;
26 import androidx.annotation.Nullable;
27 
28 import com.android.packageinstaller.permission.utils.CollectionUtils;
29 import com.android.packageinstaller.role.utils.UserUtils;
30 import com.android.permissioncontroller.R;
31 
32 import java.util.List;
33 
34 /**
35  * Class for behavior of the SMS role.
36  *
37  * @see com.android.settings.applications.DefaultAppSettings
38  * @see com.android.settings.applications.defaultapps.DefaultSmsPreferenceController
39  * @see com.android.settings.applications.defaultapps.DefaultSmsPicker
40  */
41 public class SmsRoleBehavior implements RoleBehavior {
42 
43     @Override
isAvailableAsUser(@onNull Role role, @NonNull UserHandle user, @NonNull Context context)44     public boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
45             @NonNull Context context) {
46         if (UserUtils.isWorkProfile(user, context)) {
47             return false;
48         }
49         UserManager userManager = context.getSystemService(UserManager.class);
50         if (userManager.isRestrictedProfile(user)) {
51             return false;
52         }
53         TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
54         if (!telephonyManager.isSmsCapable()
55                 // Ensure sms role is present on car despite !isSmsCapable config (b/132972702)
56                 && getDefaultHolder(role, context) == null) {
57             return false;
58         }
59         return true;
60     }
61 
62     @Nullable
63     @Override
getFallbackHolder(@onNull Role role, @NonNull Context context)64     public String getFallbackHolder(@NonNull Role role, @NonNull Context context) {
65         String defaultPackageName = getDefaultHolder(role, context);
66         if (defaultPackageName != null) {
67             return defaultPackageName;
68         }
69 
70         // TODO(b/132916161): This was the previous behavior, however this may allow any third-party
71         //  app to suddenly become the default SMS app and get the permissions, if no system default
72         //  SMS app is available.
73         List<String> qualifyingPackageNames = role.getQualifyingPackagesAsUser(
74                 Process.myUserHandle(), context);
75         return CollectionUtils.firstOrNull(qualifyingPackageNames);
76     }
77 
78     @Nullable
getDefaultHolder(@onNull Role role, @NonNull Context context)79     private static String getDefaultHolder(@NonNull Role role, @NonNull Context context) {
80         return ExclusiveDefaultHolderMixin.getDefaultHolder(role, "config_defaultSms", context);
81     }
82 
83     @Nullable
84     @Override
getConfirmationMessage(@onNull Role role, @NonNull String packageName, @NonNull Context context)85     public CharSequence getConfirmationMessage(@NonNull Role role, @NonNull String packageName,
86             @NonNull Context context) {
87         return EncryptionUnawareConfirmationMixin.getConfirmationMessage(role, packageName,
88                 context);
89     }
90 
91     @Override
isVisibleAsUser(@onNull Role role, @NonNull UserHandle user, @NonNull Context context)92     public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
93             @NonNull Context context) {
94         return context.getResources().getBoolean(R.bool.config_showSmsRole);
95     }
96 }
97