• 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.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