DefaultHomePreference.java revision 2108d361bb1c4113d2250711d9ac8e6bc0de9245
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 } 1172108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 1182108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public static boolean hasHomePreference(String pkg, Context context) { 1192108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 1202108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk PackageManager pm = context.getPackageManager(); 1212108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk pm.getHomeActivities(homeActivities); 1222108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk for (int i = 0; i < homeActivities.size(); i++) { 1232108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (homeActivities.get(i).activityInfo.packageName.equals(pkg)) { 1242108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return true; 1252108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 1262108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 1272108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return false; 1282108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 1292108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 1302108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public static boolean isHomeDefault(String pkg, Context context) { 1312108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 1322108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk PackageManager pm = context.getPackageManager(); 1332108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk ComponentName def = pm.getHomeActivities(homeActivities); 1342108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 1352108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return def != null && def.getPackageName().equals(pkg); 1362108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 1377ea14c5625c988a81c09625f54faed846fc07ec7Jason Monk} 138