LauncherAppsCompatVL.java revision f2db25398a029b6f13afccbec331e35c8007dde6
1/* 2 * Copyright (C) 2014 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.launcher3.compat; 18 19import android.content.ComponentName; 20import android.content.Context; 21import android.content.Intent; 22import android.content.pm.ApplicationInfo; 23import android.content.pm.LauncherActivityInfo; 24import android.content.pm.LauncherApps; 25import android.content.pm.PackageManager; 26import android.content.pm.ResolveInfo; 27import android.content.pm.ShortcutInfo; 28import android.graphics.Rect; 29import android.os.Bundle; 30import android.os.Process; 31import android.os.UserHandle; 32 33import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVL; 34import com.android.launcher3.shortcuts.ShortcutInfoCompat; 35 36import java.util.ArrayList; 37import java.util.HashMap; 38import java.util.List; 39import java.util.Map; 40 41public class LauncherAppsCompatVL extends LauncherAppsCompat { 42 43 protected final LauncherApps mLauncherApps; 44 protected final Context mContext; 45 46 private Map<OnAppsChangedCallbackCompat, WrappedCallback> mCallbacks = new HashMap<>(); 47 48 LauncherAppsCompatVL(Context context) { 49 mContext = context; 50 mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE); 51 } 52 53 @Override 54 public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) { 55 return mLauncherApps.getActivityList(packageName, user); 56 } 57 58 @Override 59 public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) { 60 return mLauncherApps.resolveActivity(intent, user); 61 } 62 63 @Override 64 public void startActivityForProfile(ComponentName component, UserHandle user, 65 Rect sourceBounds, Bundle opts) { 66 mLauncherApps.startMainActivity(component, user, sourceBounds, opts); 67 } 68 69 @Override 70 public ApplicationInfo getApplicationInfo(String packageName, int flags, UserHandle user) { 71 final boolean isPrimaryUser = Process.myUserHandle().equals(user); 72 if (!isPrimaryUser && (flags == 0)) { 73 // We are looking for an installed app on a secondary profile. Prior to O, the only 74 // entry point for work profiles is through the LauncherActivity. 75 List<LauncherActivityInfo> activityList = 76 mLauncherApps.getActivityList(packageName, user); 77 return activityList.size() > 0 ? activityList.get(0).getApplicationInfo() : null; 78 } 79 try { 80 ApplicationInfo info = 81 mContext.getPackageManager().getApplicationInfo(packageName, flags); 82 // There is no way to check if the app is installed for managed profile. But for 83 // primary profile, we can still have this check. 84 if (isPrimaryUser && ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) 85 || !info.enabled) { 86 return null; 87 } 88 return info; 89 } catch (PackageManager.NameNotFoundException e) { 90 // Package not found 91 return null; 92 } 93 } 94 95 @Override 96 public void showAppDetailsForProfile(ComponentName component, UserHandle user) { 97 mLauncherApps.startAppDetailsActivity(component, user, null, null); 98 } 99 100 @Override 101 public void addOnAppsChangedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) { 102 WrappedCallback wrappedCallback = new WrappedCallback(callback); 103 synchronized (mCallbacks) { 104 mCallbacks.put(callback, wrappedCallback); 105 } 106 mLauncherApps.registerCallback(wrappedCallback); 107 } 108 109 @Override 110 public void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) { 111 final WrappedCallback wrappedCallback; 112 synchronized (mCallbacks) { 113 wrappedCallback = mCallbacks.remove(callback); 114 } 115 if (wrappedCallback != null) { 116 mLauncherApps.unregisterCallback(wrappedCallback); 117 } 118 } 119 120 @Override 121 public boolean isPackageEnabledForProfile(String packageName, UserHandle user) { 122 return mLauncherApps.isPackageEnabled(packageName, user); 123 } 124 125 @Override 126 public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) { 127 return mLauncherApps.isActivityEnabled(component, user); 128 } 129 130 private static class WrappedCallback extends LauncherApps.Callback { 131 private LauncherAppsCompat.OnAppsChangedCallbackCompat mCallback; 132 133 public WrappedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) { 134 mCallback = callback; 135 } 136 137 public void onPackageRemoved(String packageName, UserHandle user) { 138 mCallback.onPackageRemoved(packageName, user); 139 } 140 141 public void onPackageAdded(String packageName, UserHandle user) { 142 mCallback.onPackageAdded(packageName, user); 143 } 144 145 public void onPackageChanged(String packageName, UserHandle user) { 146 mCallback.onPackageChanged(packageName, user); 147 } 148 149 public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) { 150 mCallback.onPackagesAvailable(packageNames, user, replacing); 151 } 152 153 public void onPackagesUnavailable(String[] packageNames, UserHandle user, 154 boolean replacing) { 155 mCallback.onPackagesUnavailable(packageNames, user, replacing); 156 } 157 158 public void onPackagesSuspended(String[] packageNames, UserHandle user) { 159 mCallback.onPackagesSuspended(packageNames, user); 160 } 161 162 public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { 163 mCallback.onPackagesUnsuspended(packageNames, user); 164 } 165 166 public void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts, 167 UserHandle user) { 168 List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcuts.size()); 169 for (ShortcutInfo shortcutInfo : shortcuts) { 170 shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo)); 171 } 172 173 mCallback.onShortcutsChanged(packageName, shortcutInfoCompats, user); 174 } 175 } 176 177 @Override 178 public List<ShortcutConfigActivityInfo> getCustomShortcutActivityList() { 179 PackageManager pm = mContext.getPackageManager(); 180 List<ShortcutConfigActivityInfo> result = new ArrayList<>(); 181 for (ResolveInfo info : 182 pm.queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0)) { 183 result.add(new ShortcutConfigActivityInfoVL(info.activityInfo, pm)); 184 } 185 return result; 186 } 187} 188 189