DefaultDialerManager.java revision db6da486217daa3418944cf93086a3bae549dad2
1014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee/* 2014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * Copyright (C) 2015 The Android Open Source Project 3014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 4014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * in compliance with the License. You may obtain a copy of the License at 6014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 7014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * http://www.apache.org/licenses/LICENSE-2.0 8014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 9014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * Unless required by applicable law or agreed to in writing, software distributed under the License 10014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * or implied. See the License for the specific language governing permissions and limitations under 12014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * the License. 13014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee */ 14014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 15014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leepackage android.telecom; 16014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 176526f67e45fc810b8f4c7419eecf599d228f674fYorke Leeimport android.app.ActivityManager; 18014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.content.Context; 19014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.content.Intent; 20014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.content.pm.ActivityInfo; 21014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.content.pm.PackageManager; 22014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.content.pm.ResolveInfo; 23856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Leeimport android.net.Uri; 24014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.provider.Settings; 25014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport android.text.TextUtils; 26014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 27014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport java.util.ArrayList; 28014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leeimport java.util.List; 29014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 30014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee/** 31014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * Class for managing the default dialer application that will receive incoming calls, and be 32014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * allowed to make emergency outgoing calls. 33014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 34014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * @hide 35014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee */ 36014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Leepublic class DefaultDialerManager { 37014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee private static final String TAG = "DefaultDialerManager"; 38014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 39014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee /** 406526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * Sets the specified package name as the default dialer application for the current user. 416526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * The caller of this method needs to have permission to write to secure settings and 426526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * manage users on the device. 43014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 44db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * @return {@code true} if the default dialer application was successfully changed, 45db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * {@code false} otherwise. 46db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * 47014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * @hide 48014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * */ 49db6da486217daa3418944cf93086a3bae549dad2Yorke Lee public static boolean setDefaultDialerApplication(Context context, String packageName) { 50db6da486217daa3418944cf93086a3bae549dad2Yorke Lee return setDefaultDialerApplication(context, packageName, ActivityManager.getCurrentUser()); 516526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee } 526526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee 536526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee /** 546526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * Sets the specified package name as the default dialer application for the specified user. 556526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * The caller of this method needs to have permission to write to secure settings and 566526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * manage users on the device. 576526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 58db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * @return {@code true} if the default dialer application was successfully changed, 59db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * {@code false} otherwise. 60db6da486217daa3418944cf93086a3bae549dad2Yorke Lee * 616526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * @hide 626526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * */ 63db6da486217daa3418944cf93086a3bae549dad2Yorke Lee public static boolean setDefaultDialerApplication(Context context, String packageName, 64db6da486217daa3418944cf93086a3bae549dad2Yorke Lee int user) { 65014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // Get old package name 666526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(), 676526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee Settings.Secure.DIALER_DEFAULT_APPLICATION, user); 68014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 69014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee if (packageName != null && oldPackageName != null && packageName.equals(oldPackageName)) { 70014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // No change 71db6da486217daa3418944cf93086a3bae549dad2Yorke Lee return false; 72014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 73014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 74014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // Only make the change if the new package belongs to a valid phone application 758e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee List<String> packageNames = getInstalledDialerApplications(context); 76014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 778e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee if (packageNames.contains(packageName)) { 78014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // Update the secure setting. 796526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee Settings.Secure.putStringForUser(context.getContentResolver(), 806526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee Settings.Secure.DIALER_DEFAULT_APPLICATION, packageName, user); 81db6da486217daa3418944cf93086a3bae549dad2Yorke Lee return true; 82014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 83db6da486217daa3418944cf93086a3bae549dad2Yorke Lee return false; 84014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 85014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 86014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee /** 876526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * Returns the installed dialer application for the current user that will be used to receive 886526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * incoming calls, and is allowed to make emergency calls. 89014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 90014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * The application will be returned in order of preference: 91014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 1) User selected phone application (if still installed) 92014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 2) Pre-installed system dialer (if not disabled) 93014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 3) Null 94014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 956526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * The caller of this method needs to have permission to manage users on the device. 966526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 97014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * @hide 98014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * */ 998e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee public static String getDefaultDialerApplication(Context context) { 1006526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee return getDefaultDialerApplication(context, ActivityManager.getCurrentUser()); 1016526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee } 102014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 1036526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee /** 1046526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * Returns the installed dialer application for the specified user that will be used to receive 1056526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * incoming calls, and is allowed to make emergency calls. 1066526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 1076526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * The application will be returned in order of preference: 1086526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 1) User selected phone application (if still installed) 1096526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 2) Pre-installed system dialer (if not disabled) 1106526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 3) Null 1116526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 1126526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * The caller of this method needs to have permission to manage users on the device. 1136526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * 1146526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * @hide 1156526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee * */ 1166526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee public static String getDefaultDialerApplication(Context context, int user) { 1176526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee String defaultPackageName = Settings.Secure.getStringForUser(context.getContentResolver(), 1186526f67e45fc810b8f4c7419eecf599d228f674fYorke Lee Settings.Secure.DIALER_DEFAULT_APPLICATION, user); 1198e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee 1208e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee final List<String> packageNames = getInstalledDialerApplications(context); 1218e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee 1228e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee // Verify that the default dialer has not been disabled or uninstalled. 1238e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee if (packageNames.contains(defaultPackageName)) { 1248e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee return defaultPackageName; 125014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 126014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 127014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // No user-set dialer found, fallback to system dialer 1288e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee String systemDialerPackageName = getTelecomManager(context).getSystemDialerPackage(); 129014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 1308e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee if (TextUtils.isEmpty(systemDialerPackageName)) { 131014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // No system dialer configured at build time 132014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee return null; 133014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 134014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 1358e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee if (packageNames.contains(systemDialerPackageName)) { 1368e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee return systemDialerPackageName; 1378e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee } else { 1388e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee return null; 1398e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee } 140014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 141014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 142014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee /** 143014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * Returns a list of installed and available dialer applications. 144014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 145014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * In order to appear in the list, a dialer application must implement an intent-filter with 146014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * the DIAL intent for the following schemes: 147014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 148014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 1) Empty scheme 149014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 2) tel Uri scheme 150014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * 151014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee * @hide 152014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee **/ 1538e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee public static List<String> getInstalledDialerApplications(Context context) { 154014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee PackageManager packageManager = context.getPackageManager(); 155014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 156014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee // Get the list of apps registered for the DIAL intent with empty scheme 157014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee Intent intent = new Intent(Intent.ACTION_DIAL); 158014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0); 159014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 1608e0207ba5b7ca3bca9d87847eef4d00aa89d7a7aYorke Lee List<String> packageNames = new ArrayList<>(); 161014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 162014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee for (ResolveInfo resolveInfo : resolveInfoList) { 163014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee final ActivityInfo activityInfo = resolveInfo.activityInfo; 164856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee if (activityInfo != null && !packageNames.contains(activityInfo.packageName)) { 165856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee packageNames.add(activityInfo.packageName); 166014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 167014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 168014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 169856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee final Intent dialIntentWithTelScheme = new Intent(Intent.ACTION_DIAL); 170856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee dialIntentWithTelScheme.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, "", null)); 171856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee return filterByIntent(context, packageNames, dialIntentWithTelScheme); 172014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 173014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee 174014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee /** 175610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * Determines if the package name belongs to the user-selected default dialer or the preloaded 176610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * system dialer, and thus should be allowed to perform certain privileged operations. 177610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * 178610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * @param context A valid context. 179610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * @param packageName of the package to check for. 180610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * 181610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * @return {@code true} if the provided package name corresponds to the user-selected default 182610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * dialer or the preloaded system dialer, {@code false} otherwise. 183610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * 184610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee * @hide 185610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee */ 186610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee public static boolean isDefaultOrSystemDialer(Context context, String packageName) { 187610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee if (TextUtils.isEmpty(packageName)) { 188610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee return false; 189610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee } 190610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee final TelecomManager tm = getTelecomManager(context); 191610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee return packageName.equals(tm.getDefaultDialerPackage()) 192610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee || packageName.equals(tm.getSystemDialerPackage()); 193610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee } 194610438230b72bc4932e6580230bfa2d5dd4e9913Yorke Lee 195856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee /** 196856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * Filter a given list of package names for those packages that contain an activity that has 197856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * an intent filter for a given intent. 198856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * 199856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * @param context A valid context 200856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * @param packageNames List of package names to filter. 201856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee * @return The filtered list. 202856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee */ 203856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee private static List<String> filterByIntent(Context context, List<String> packageNames, 204856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee Intent intent) { 205856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee if (packageNames == null || packageNames.isEmpty()) { 206856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee return new ArrayList<>(); 207856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee } 208856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee 209856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee final List<String> result = new ArrayList<>(); 210856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee final List<ResolveInfo> resolveInfoList = 211856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee context.getPackageManager().queryIntentActivities(intent, 0); 212856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee final int length = resolveInfoList.size(); 213856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee for (int i = 0; i < length; i++) { 214856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee final ActivityInfo info = resolveInfoList.get(i).activityInfo; 215856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee if (info != null && packageNames.contains(info.packageName) 216856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee && !result.contains(info.packageName)) { 217856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee result.add(info.packageName); 218856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee } 219856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee } 220856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee 221856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee return result; 222856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee } 223856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee 224856a5ac70474e9f57f71699ad934c701b01c1c7bYorke Lee 225014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee private static TelecomManager getTelecomManager(Context context) { 226014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); 227014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee } 228014de02dd2e050c36f7e0d4f57690bd5d023b4f2Yorke Lee} 229