DefaultHomePicker.java revision a278962dbc545f69ca3712159d438f2e50dab0a5
1b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala/*
2b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Copyright (C) 2017 The Android Open Source Project
3b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
4b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * you may not use this file except in compliance with the License.
6b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * You may obtain a copy of the License at
7b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
8b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
10b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * See the License for the specific language governing permissions and
14b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * limitations under the License.
15b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala */
16b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
172f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalapackage com.android.settings.applications.defaultapps;
18b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
198b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.content.ComponentName;
208b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.content.Context;
218b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.content.IntentFilter;
2249c62f51ba7b91149d428136fac3972ef40dc35fEino-Ville Talvalaimport android.content.pm.ActivityInfo;
2349c62f51ba7b91149d428136fac3972ef40dc35fEino-Ville Talvalaimport android.content.pm.ApplicationInfo;
2449c62f51ba7b91149d428136fac3972ef40dc35fEino-Ville Talvalaimport android.content.pm.PackageManager;
2549c62f51ba7b91149d428136fac3972ef40dc35fEino-Ville Talvalaimport android.content.pm.ResolveInfo;
265398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chenimport android.content.pm.UserInfo;
279c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinimport android.os.Build;
2849ea6ae76d78ff8d179c0957d4bc55f08cb98d0fYin-Chia Yehimport android.text.TextUtils;
2975a5570f7db6990e12100afbd3985c09fcff8d32Emilian Peev
304af73c2153747d0624ccc75dfa001cb91982957fEino-Ville Talvalaimport com.android.internal.logging.nano.MetricsProto;
31599be6182e1a8f647f02d02ed99d16a74db2a4c6Zhijun Heimport com.android.settings.R;
32b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
33b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvalaimport java.util.ArrayList;
342100ae7d2b448206813de76ec7e7260e4e765193Emilian Peevimport java.util.List;
358b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala
368b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalapublic class DefaultHomePicker extends DefaultAppPickerFragment {
37b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
38b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    private String mPackageName;
3921547d66a9ce591ff30a3ad4102f7f30a4764d80Igor Murashkin
40b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    @Override
41b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    public void onAttach(Context context) {
42b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        super.onAttach(context);
43b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mPackageName = context.getPackageName();
44b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
45b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
46b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    @Override
47b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    public int getMetricsCategory() {
48b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        return MetricsProto.MetricsEvent.DEFAULT_HOME_PICKER;
49b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
50b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
51b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    @Override
52b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    protected List<DefaultAppInfo> getCandidates() {
53b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        final boolean mustSupportManagedProfile = hasManagedProfile();
54b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        final List<DefaultAppInfo> candidates = new ArrayList<>();
55a636be6c9a8a9192f72a111c2b3084a226d37b7eYin-Chia Yeh        final List<ResolveInfo> homeActivities = new ArrayList<>();
56b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mPm.getHomeActivities(homeActivities);
57b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
58b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        for (ResolveInfo resolveInfo : homeActivities) {
59b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            final ActivityInfo info = resolveInfo.activityInfo;
60b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            final ComponentName activityName = new ComponentName(info.packageName, info.name);
6121547d66a9ce591ff30a3ad4102f7f30a4764d80Igor Murashkin            if (info.packageName.equals(mPackageName)) {
62b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                continue;
63b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            }
64b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
65b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            final String summary;
66b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            if (mustSupportManagedProfile && !launcherHasManagedProfilesFeature(resolveInfo)) {
67b67a3b36fd569e63c1b8ca6b2701c34c7a3927c1Eino-Ville Talvala                summary = getContext().getString(R.string.home_work_profile_not_supported);
680cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh            } else {
69b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                summary = null;
70b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            }
71b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            final DefaultAppInfo candidate =
72b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                    new DefaultAppInfo(mPm, mUserId, activityName, summary);
73b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            candidates.add(candidate);
74b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        }
75b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He        return candidates;
76b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He    }
77b67a3b36fd569e63c1b8ca6b2701c34c7a3927c1Eino-Ville Talvala
785b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen    @Override
795b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen    protected String getDefaultKey() {
805b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen        final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
815b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen        final ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities);
82b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        if (currentDefaultHome != null) {
83b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            return currentDefaultHome.flattenToString();
84b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He        }
85b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        return null;
86b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
87b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He
88b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He    @Override
89b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He    protected boolean setDefaultKey(String key) {
90b67a3b36fd569e63c1b8ca6b2701c34c7a3927c1Eino-Ville Talvala        if (!TextUtils.isEmpty(key)) {
915b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen            final ComponentName component = ComponentName.unflattenFromString(key);
925b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen            final List<ResolveInfo> homeActivities = new ArrayList<>();
935b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen            mPm.getHomeActivities(homeActivities);
945b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen            final List<ComponentName> allComponents = new ArrayList<>();
95b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            for (ResolveInfo info : homeActivities) {
96b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                final ActivityInfo appInfo = info.activityInfo;
97b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                ComponentName activityName = new ComponentName(appInfo.packageName, appInfo.name);
98b8b77bf59ed377d6a9bcd80b8dbe4e146d5fddd3Zhijun He                allComponents.add(activityName);
99b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            }
100b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            mPm.replacePreferredActivity(
101b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                    DefaultHomePreferenceController.HOME_FILTER,
102b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                    IntentFilter.MATCH_CATEGORY_EMPTY,
103b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                    allComponents.toArray(new ComponentName[0]),
104b67a3b36fd569e63c1b8ca6b2701c34c7a3927c1Eino-Ville Talvala                    component);
105b67a3b36fd569e63c1b8ca6b2701c34c7a3927c1Eino-Ville Talvala            return true;
1060cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh        }
1070cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh        return false;
1085b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen    }
1095b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen
1105b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen    private boolean hasManagedProfile() {
1115b0a58ea45157efcf8b8d742fcc57f60a116ecc9Chien-Yu Chen        final Context context = getContext();
112b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        List<UserInfo> profiles = mUserManager.getProfiles(context.getUserId());
113b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        for (UserInfo userInfo : profiles) {
114b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            if (userInfo.isManagedProfile()) {
115b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala                return true;
116b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala            }
117b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        }
118bbae94a02e73020646535b0d915f4557c39f357bZhijun He        return false;
119bbae94a02e73020646535b0d915f4557c39f357bZhijun He    }
1206828bb92bd9e5eeb3aa6d049a37e5ddec5dab355Chien-Yu Chen
1216828bb92bd9e5eeb3aa6d049a37e5ddec5dab355Chien-Yu Chen    private boolean launcherHasManagedProfilesFeature(ResolveInfo resolveInfo) {
1220cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh        try {
1238062d31d27943da4d652878b4c36aeabb8bb8b08Chien-Yu Chen            ApplicationInfo appInfo = mPm.getPackageManager().getApplicationInfo(
1240cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh                    resolveInfo.activityInfo.packageName, 0 /* default flags */);
1250cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh            return versionNumberAtLeastL(appInfo.targetSdkVersion);
1260cd24f2c569daafdfb2e7567875a864dc53f3698Yin-Chia Yeh        } catch (PackageManager.NameNotFoundException e) {
127bbae94a02e73020646535b0d915f4557c39f357bZhijun He            return false;
128bbae94a02e73020646535b0d915f4557c39f357bZhijun He        }
1296828bb92bd9e5eeb3aa6d049a37e5ddec5dab355Chien-Yu Chen    }
130bbae94a02e73020646535b0d915f4557c39f357bZhijun He
131bbae94a02e73020646535b0d915f4557c39f357bZhijun He    private boolean versionNumberAtLeastL(int versionNumber) {
132bbae94a02e73020646535b0d915f4557c39f357bZhijun He        return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
133bbae94a02e73020646535b0d915f4557c39f357bZhijun He    }
134b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala}
135b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala