DefaultHomePreference.java revision 7ea14c5625c988a81c09625f54faed846fc07ec7
17ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk/*
27ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * Copyright (C) 2016 The Android Open Source Project
37ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk *
47ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
57ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * except in compliance with the License. You may obtain a copy of the License at
67ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk *
77ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
87ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk *
97ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
107ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
117ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * KIND, either express or implied. See the License for the specific language governing
127ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk * permissions and limitations under the License.
137ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk */
147ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
157ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkpackage com.android.settings.applications;
167ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
177ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.ComponentName;
187ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.Context;
197ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.Intent;
207ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.IntentFilter;
217ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.pm.ActivityInfo;
227ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.pm.ApplicationInfo;
237ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.pm.PackageManager;
247ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.pm.ResolveInfo;
257ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.content.pm.UserInfo;
267ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.os.Build;
277ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.os.UserManager;
287ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport android.util.AttributeSet;
297ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport com.android.settings.AppListPreference;
307ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport com.android.settings.R;
317ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
327ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport java.util.ArrayList;
337ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkimport java.util.List;
347ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
357ea14c5625c988a81c09625f54faed846fc07ec7Jason Monkpublic class DefaultHomePreference extends AppListPreference {
367ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
377ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    private final ArrayList<ComponentName> mAllHomeComponents = new ArrayList<>();
387ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    private final IntentFilter mHomeFilter;
397ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
407ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    public DefaultHomePreference(Context context, AttributeSet attrs) {
417ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        super(context, attrs);
427ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        mHomeFilter = new IntentFilter(Intent.ACTION_MAIN);
437ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        mHomeFilter.addCategory(Intent.CATEGORY_HOME);
447ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT);
457ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        refreshHomeOptions();
467ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
477ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
487ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    @Override
497ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    public void performClick() {
507ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        refreshHomeOptions();
517ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        super.performClick();
527ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
537ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
547ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    @Override
557ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    protected boolean persistString(String value) {
567ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        if (value != null) {
577ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            ComponentName component = ComponentName.unflattenFromString(value);
587ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            getContext().getPackageManager().replacePreferredActivity(mHomeFilter,
597ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                    IntentFilter.MATCH_CATEGORY_EMPTY,
607ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                    mAllHomeComponents.toArray(new ComponentName[0]), component);
617ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            setSummary(getEntry());
627ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        }
637ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        return super.persistString(value);
647ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
657ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
667ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    public void refreshHomeOptions() {
677ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        final String myPkg = getContext().getPackageName();
687ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
697ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        PackageManager pm = getContext().getPackageManager();
707ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        ComponentName currentDefaultHome  = pm.getHomeActivities(homeActivities);
717ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        ArrayList<ComponentName> components = new ArrayList<>();
727ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        mAllHomeComponents.clear();
737ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        List<CharSequence> summaries = new ArrayList<>();
747ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
757ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        boolean mustSupportManagedProfile = hasManagedProfile();
767ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        for (int i = 0; i < homeActivities.size(); i++) {
777ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            final ResolveInfo candidate = homeActivities.get(i);
787ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            final ActivityInfo info = candidate.activityInfo;
797ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            ComponentName activityName = new ComponentName(info.packageName, info.name);
807ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            mAllHomeComponents.add(activityName);
817ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            if (info.packageName.equals(myPkg)) {
827ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                continue;
837ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            }
847ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            components.add(activityName);
857ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            if (mustSupportManagedProfile && !launcherHasManagedProfilesFeature(candidate, pm)) {
867ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                summaries.add(getContext().getString(R.string.home_work_profile_not_supported));
877ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            } else {
887ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                summaries.add(null);
897ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            }
907ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        }
917ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        setComponentNames(components.toArray(new ComponentName[0]), currentDefaultHome,
927ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                summaries.toArray(new CharSequence[0]));
937ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
947ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
957ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    private boolean launcherHasManagedProfilesFeature(ResolveInfo resolveInfo, PackageManager pm) {
967ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        try {
977ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            ApplicationInfo appInfo = pm.getApplicationInfo(
987ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk                    resolveInfo.activityInfo.packageName, 0 /* default flags */);
997ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            return versionNumberAtLeastL(appInfo.targetSdkVersion);
1007ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        } catch (PackageManager.NameNotFoundException e) {
1017ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            return false;
1027ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        }
1037ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
1047ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
1057ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    private boolean versionNumberAtLeastL(int versionNumber) {
1067ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
1077ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
1087ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
1097ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    private boolean hasManagedProfile() {
1107ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        UserManager userManager = getContext().getSystemService(UserManager.class);
1117ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        List<UserInfo> profiles = userManager.getProfiles(getContext().getUserId());
1127ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        for (UserInfo userInfo : profiles) {
1137ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk            if (userInfo.isManagedProfile()) return true;
1147ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        }
1157ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk        return false;
1167ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk    }
1177ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk
1187ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk}
119