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.server.telecom; 18 19 import android.app.role.RoleManager; 20 import android.content.Context; 21 import android.content.pm.ApplicationInfo; 22 import android.content.pm.PackageManager; 23 import android.os.Binder; 24 import android.os.UserHandle; 25 import android.telecom.Log; 26 27 import com.android.internal.util.IndentingPrintWriter; 28 29 import java.util.ArrayList; 30 import java.util.List; 31 import java.util.concurrent.Executor; 32 import java.util.function.IntConsumer; 33 import java.util.stream.Collectors; 34 35 public class RoleManagerAdapterImpl implements RoleManagerAdapter { 36 private static final String ROLE_CALL_REDIRECTION_APP = RoleManager.ROLE_CALL_REDIRECTION; 37 private static final String ROLE_CALL_SCREENING = RoleManager.ROLE_CALL_SCREENING; 38 private static final String ROLE_DIALER = RoleManager.ROLE_DIALER; 39 40 private String mOverrideDefaultCallRedirectionApp = null; 41 private String mOverrideDefaultCallScreeningApp = null; 42 private String mOverrideDefaultDialerApp = null; 43 private List<String> mOverrideCallCompanionApps = new ArrayList<>(); 44 private Context mContext; 45 private RoleManager mRoleManager; 46 private UserHandle mCurrentUserHandle; 47 RoleManagerAdapterImpl(Context context, RoleManager roleManager)48 public RoleManagerAdapterImpl(Context context, RoleManager roleManager) { 49 mContext = context; 50 mRoleManager = roleManager; 51 } 52 53 @Override getDefaultCallRedirectionApp(UserHandle userHandleForCallRedirection)54 public String getDefaultCallRedirectionApp(UserHandle userHandleForCallRedirection) { 55 if (mOverrideDefaultCallRedirectionApp != null) { 56 return mOverrideDefaultCallRedirectionApp; 57 } 58 return getRoleManagerCallRedirectionApp(userHandleForCallRedirection); 59 } 60 61 @Override setTestDefaultCallRedirectionApp(String packageName)62 public void setTestDefaultCallRedirectionApp(String packageName) { 63 mOverrideDefaultCallRedirectionApp = packageName; 64 } 65 66 @Override getDefaultCallScreeningApp(UserHandle userHandleForCallScreening)67 public String getDefaultCallScreeningApp(UserHandle userHandleForCallScreening) { 68 if (mOverrideDefaultCallScreeningApp != null) { 69 return mOverrideDefaultCallScreeningApp; 70 } 71 return getRoleManagerCallScreeningApp(userHandleForCallScreening); 72 } 73 74 @Override setTestDefaultCallScreeningApp(String packageName)75 public void setTestDefaultCallScreeningApp(String packageName) { 76 mOverrideDefaultCallScreeningApp = packageName; 77 } 78 79 @Override getDefaultDialerApp(int user)80 public String getDefaultDialerApp(int user) { 81 if (mOverrideDefaultDialerApp != null) { 82 return mOverrideDefaultDialerApp; 83 } 84 return getRoleManagerDefaultDialerApp(user); 85 } 86 87 @Override observeDefaultDialerApp(Executor executor, IntConsumer observer)88 public void observeDefaultDialerApp(Executor executor, IntConsumer observer) { 89 mRoleManager.addOnRoleHoldersChangedListenerAsUser(executor, (roleName, user) -> { 90 if (ROLE_DIALER.equals(roleName)) { 91 observer.accept(user.getIdentifier()); 92 } 93 }, UserHandle.ALL); 94 } 95 96 @Override setTestDefaultDialer(String packageName)97 public void setTestDefaultDialer(String packageName) { 98 mOverrideDefaultDialerApp = packageName; 99 } 100 101 @Override getCallCompanionApps()102 public List<String> getCallCompanionApps() { 103 List<String> callCompanionApps = new ArrayList<>(); 104 callCompanionApps.addAll(mOverrideCallCompanionApps); 105 return callCompanionApps; 106 } 107 108 @Override addOrRemoveTestCallCompanionApp(String packageName, boolean isAdded)109 public void addOrRemoveTestCallCompanionApp(String packageName, boolean isAdded) { 110 if (isAdded) { 111 mOverrideCallCompanionApps.add(packageName); 112 } else { 113 mOverrideCallCompanionApps.remove(packageName); 114 } 115 } 116 117 @Override setCurrentUserHandle(UserHandle currentUserHandle)118 public void setCurrentUserHandle(UserHandle currentUserHandle) { 119 mCurrentUserHandle = currentUserHandle; 120 } 121 getRoleManagerCallScreeningApp(UserHandle userHandle)122 private String getRoleManagerCallScreeningApp(UserHandle userHandle) { 123 List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(ROLE_CALL_SCREENING, 124 userHandle); 125 if (roleHolders == null || roleHolders.isEmpty()) { 126 return null; 127 } 128 return roleHolders.get(0); 129 } 130 getRoleManagerDefaultDialerApp(int user)131 private String getRoleManagerDefaultDialerApp(int user) { 132 List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(ROLE_DIALER, 133 new UserHandle(user)); 134 if (roleHolders == null || roleHolders.isEmpty()) { 135 return null; 136 } 137 return roleHolders.get(0); 138 } 139 140 // TODO in R: Use companion app manager getRoleManagerCallCompanionApps()141 private List<String> getRoleManagerCallCompanionApps() { 142 return new ArrayList<>(); 143 } 144 getRoleManagerCallRedirectionApp(UserHandle userHandle)145 private String getRoleManagerCallRedirectionApp(UserHandle userHandle) { 146 List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(ROLE_CALL_REDIRECTION_APP, 147 userHandle); 148 if (roleHolders == null || roleHolders.isEmpty()) { 149 return null; 150 } 151 return roleHolders.get(0); 152 } 153 154 /** 155 * Returns the application label that corresponds to the given package name 156 * 157 * @param packageName A valid package name. 158 * 159 * @return Application label for the given package name, or null if not found. 160 */ 161 @Override getApplicationLabelForPackageName(String packageName)162 public String getApplicationLabelForPackageName(String packageName) { 163 PackageManager pm = mContext.getPackageManager(); 164 ApplicationInfo info = null; 165 try { 166 info = pm.getApplicationInfo(packageName, 0); 167 } catch (PackageManager.NameNotFoundException e) { 168 Log.d(this, "Application info not found for packageName " + packageName); 169 } 170 if (info == null) { 171 return packageName; 172 } else { 173 return info.loadLabel(pm).toString(); 174 } 175 } 176 177 /** 178 * Dumps the state of the {@link InCallController}. 179 * 180 * @param pw The {@code IndentingPrintWriter} to write the state to. 181 */ dump(IndentingPrintWriter pw)182 public void dump(IndentingPrintWriter pw) { 183 pw.print("DefaultCallRedirectionApp: "); 184 if (mOverrideDefaultCallRedirectionApp != null) { 185 pw.print("(override "); 186 pw.print(mOverrideDefaultCallRedirectionApp); 187 pw.print(") "); 188 pw.print(getRoleManagerCallRedirectionApp(Binder.getCallingUserHandle())); 189 } 190 pw.println(); 191 192 pw.print("DefaultCallScreeningApp: "); 193 if (mOverrideDefaultCallScreeningApp != null) { 194 pw.print("(override "); 195 pw.print(mOverrideDefaultCallScreeningApp); 196 pw.print(") "); 197 pw.print(getRoleManagerCallScreeningApp(Binder.getCallingUserHandle())); 198 } 199 pw.println(); 200 201 pw.print("DefaultCallCompanionApps: "); 202 if (mOverrideCallCompanionApps != null) { 203 pw.print("(override "); 204 pw.print(mOverrideCallCompanionApps.stream().collect(Collectors.joining(", "))); 205 pw.print(") "); 206 List<String> appsInRole = getRoleManagerCallCompanionApps(); 207 if (appsInRole != null) { 208 pw.print(appsInRole.stream().collect(Collectors.joining(", "))); 209 } 210 } 211 pw.println(); 212 } 213 } 214