DefaultDialerManager.java revision 52153f4c0540a991b5b7214f4f14b5a891479a3c
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) {
10052153f4c0540a991b5b7214f4f14b5a891479a3cSvet Ganov        return getDefaultDialerApplication(context, context.getUserId());
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