DefaultHomePicker.java revision fef14cac00b7e4f1ef0481845421618bc3810643
1/*
2 * Copyright (C) 2017 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
17package com.android.settings.applications.defaultapps;
18
19import android.content.ComponentName;
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.content.pm.ActivityInfo;
24import android.content.pm.ApplicationInfo;
25import android.content.pm.PackageManager;
26import android.content.pm.ResolveInfo;
27import android.content.pm.UserInfo;
28import android.os.Build;
29import android.text.TextUtils;
30
31import com.android.internal.logging.nano.MetricsProto;
32import com.android.settings.R;
33import com.android.settingslib.applications.DefaultAppInfo;
34
35import java.util.ArrayList;
36import java.util.List;
37
38public class DefaultHomePicker extends DefaultAppPickerFragment {
39
40    private String mPackageName;
41
42    @Override
43    public void onAttach(Context context) {
44        super.onAttach(context);
45        mPackageName = context.getPackageName();
46    }
47
48    @Override
49    protected int getPreferenceScreenResId() {
50        return R.xml.default_home_settings;
51    }
52
53    @Override
54    public int getMetricsCategory() {
55        return MetricsProto.MetricsEvent.DEFAULT_HOME_PICKER;
56    }
57
58    @Override
59    protected List<DefaultAppInfo> getCandidates() {
60        final boolean mustSupportManagedProfile = hasManagedProfile();
61        final List<DefaultAppInfo> candidates = new ArrayList<>();
62        final List<ResolveInfo> homeActivities = new ArrayList<>();
63        final Context context = getContext();
64        mPm.getHomeActivities(homeActivities);
65
66        for (ResolveInfo resolveInfo : homeActivities) {
67            final ActivityInfo info = resolveInfo.activityInfo;
68            final ComponentName activityName = new ComponentName(info.packageName, info.name);
69            if (info.packageName.equals(mPackageName)) {
70                continue;
71            }
72
73            final String summary;
74            boolean enabled = true;
75            if (mustSupportManagedProfile && !launcherHasManagedProfilesFeature(resolveInfo)) {
76                summary = getContext().getString(R.string.home_work_profile_not_supported);
77                enabled = false;
78            } else {
79                summary = null;
80            }
81            final DefaultAppInfo candidate =
82                    new DefaultAppInfo(context, mPm, mUserId, activityName, summary, enabled);
83            candidates.add(candidate);
84        }
85        return candidates;
86    }
87
88    @Override
89    protected String getDefaultKey() {
90        final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
91        final ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities);
92        if (currentDefaultHome != null) {
93            return currentDefaultHome.flattenToString();
94        }
95        return null;
96    }
97
98    @Override
99    protected boolean setDefaultKey(String key) {
100        if (!TextUtils.isEmpty(key)) {
101            final ComponentName component = ComponentName.unflattenFromString(key);
102            final List<ResolveInfo> homeActivities = new ArrayList<>();
103            mPm.getHomeActivities(homeActivities);
104            final List<ComponentName> allComponents = new ArrayList<>();
105            for (ResolveInfo info : homeActivities) {
106                final ActivityInfo appInfo = info.activityInfo;
107                ComponentName activityName = new ComponentName(appInfo.packageName, appInfo.name);
108                allComponents.add(activityName);
109            }
110            mPm.replacePreferredActivity(
111                    DefaultHomePreferenceController.HOME_FILTER,
112                    IntentFilter.MATCH_CATEGORY_EMPTY,
113                    allComponents.toArray(new ComponentName[0]),
114                    component);
115
116            // Launch the new Home app so the change is immediately visible even if
117            // the Home button is not pressed.
118            final Context context = getContext();
119            Intent i = new Intent(Intent.ACTION_MAIN);
120            i.addCategory(Intent.CATEGORY_HOME);
121            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
122            context.startActivity(i);
123            return true;
124        }
125        return false;
126    }
127
128    private boolean hasManagedProfile() {
129        final Context context = getContext();
130        List<UserInfo> profiles = mUserManager.getProfiles(context.getUserId());
131        for (UserInfo userInfo : profiles) {
132            if (userInfo.isManagedProfile()) {
133                return true;
134            }
135        }
136        return false;
137    }
138
139    private boolean launcherHasManagedProfilesFeature(ResolveInfo resolveInfo) {
140        try {
141            ApplicationInfo appInfo = mPm.getPackageManager().getApplicationInfo(
142                    resolveInfo.activityInfo.packageName, 0 /* default flags */);
143            return versionNumberAtLeastL(appInfo.targetSdkVersion);
144        } catch (PackageManager.NameNotFoundException e) {
145            return false;
146        }
147    }
148
149    private boolean versionNumberAtLeastL(int versionNumber) {
150        return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
151    }
152}
153