summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2017-02-28 15:14:58 -0800
committerSunny Goyal <sunnygoyal@google.com>2017-03-01 17:17:40 -0800
commitad2e91a216edae0f25bce83a2b058c81953981af (patch)
tree0c72c0934aff0c23789d124998ea8534ac9d756a /src/com
parentcf18c3c2d14b54896e51fec829ae2d89642a59eb (diff)
downloadandroid_packages_apps_Trebuchet-ad2e91a216edae0f25bce83a2b058c81953981af.tar.gz
android_packages_apps_Trebuchet-ad2e91a216edae0f25bce83a2b058c81953981af.tar.bz2
android_packages_apps_Trebuchet-ad2e91a216edae0f25bce83a2b058c81953981af.zip
Fixing SDCard and package enabled state checks in PackageManagerHeler
Bug: 32365540 Change-Id: Iaac3e08ce55457ebbfb3633514ebc8ade6d200c5
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/launcher3/LauncherModel.java7
-rw-r--r--src/com/android/launcher3/compat/LauncherAppsCompat.java3
-rw-r--r--src/com/android/launcher3/compat/LauncherAppsCompatVL.java26
-rw-r--r--src/com/android/launcher3/compat/LauncherAppsCompatVO.java5
-rw-r--r--src/com/android/launcher3/model/SdCardAvailableReceiver.java2
-rw-r--r--src/com/android/launcher3/util/PackageManagerHelper.java62
6 files changed, 50 insertions, 55 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 8c90c2cb1..dc668e6a4 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -981,7 +981,7 @@ public class LauncherModel extends BroadcastReceiver
c.markDeleted("Unrestored app removed: " + targetPkg);
continue;
}
- } else if (pmHelper.isAppOnSdcard(targetPkg)) {
+ } else if (pmHelper.isAppOnSdcard(targetPkg, c.user)) {
// Package is present but not available.
disabledState |= ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE;
// Add the icon on the workspace anyway.
@@ -1032,8 +1032,7 @@ public class LauncherModel extends BroadcastReceiver
info.iconBitmap = LauncherIcons
.createShortcutIcon(pinnedShortcut, context);
if (pmHelper.isAppSuspended(
- info.getTargetComponent().getPackageName(),
- info.user)) {
+ pinnedShortcut.getPackage(), info.user)) {
info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SUSPENDED;
}
intent = info.intent;
@@ -1046,7 +1045,7 @@ public class LauncherModel extends BroadcastReceiver
info = c.loadSimpleShortcut();
// Shortcuts are only available on the primary profile
- if (pmHelper.isAppSuspended(targetPkg)) {
+ if (pmHelper.isAppSuspended(targetPkg, c.user)) {
disabledState |= ShortcutInfo.FLAG_DISABLED_SUSPENDED;
}
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java
index 44a3686ed..2eb5b023b 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompat.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java
@@ -73,7 +73,8 @@ public abstract class LauncherAppsCompat {
UserHandle user);
public abstract void startActivityForProfile(ComponentName component, UserHandle user,
Rect sourceBounds, Bundle opts);
- public abstract ApplicationInfo getApplicationInfo(String packageName, UserHandle user);
+ public abstract ApplicationInfo getApplicationInfo(
+ String packageName, int flags, UserHandle user);
public abstract void showAppDetailsForProfile(ComponentName component, UserHandle user);
public abstract void addOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
public abstract void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
index 776f59360..e5517a6c6 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
@@ -27,6 +27,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.graphics.Rect;
import android.os.Bundle;
+import android.os.Process;
import android.os.UserHandle;
import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVL;
@@ -66,9 +67,28 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat {
}
@Override
- public ApplicationInfo getApplicationInfo(String packageName, UserHandle user) {
- List<LauncherActivityInfo> activityList = mLauncherApps.getActivityList(packageName, user);
- return activityList.size() > 0 ? activityList.get(0).getApplicationInfo() : null;
+ public ApplicationInfo getApplicationInfo(String packageName, int flags, UserHandle user) {
+ final boolean isPrimaryUser = Process.myUserHandle().equals(user);
+ if (!isPrimaryUser && (flags == 0)) {
+ // We are looking for an installed app on a secondary profile. Prior to O, the only
+ // entry point for work profiles is through the LauncherActivity.
+ List<LauncherActivityInfo> activityList =
+ mLauncherApps.getActivityList(packageName, user);
+ return activityList.size() > 0 ? activityList.get(0).getApplicationInfo() : null;
+ }
+ try {
+ ApplicationInfo info =
+ mContext.getPackageManager().getApplicationInfo(packageName, flags);
+ // There is no way to check if the app is installed for managed profile. But for
+ // primary profile, we can still have this check.
+ if (isPrimaryUser && ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0)) {
+ return null;
+ }
+ return info;
+ } catch (PackageManager.NameNotFoundException e) {
+ // Package not found
+ return null;
+ }
}
@Override
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java
index 377907aa9..c0f80d01c 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompatVO.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompatVO.java
@@ -35,8 +35,9 @@ public class LauncherAppsCompatVO extends LauncherAppsCompatVL {
}
@Override
- public ApplicationInfo getApplicationInfo(String packageName, UserHandle user) {
- return mLauncherApps.getApplicationInfo(packageName, 0, user);
+ public ApplicationInfo getApplicationInfo(String packageName, int flags, UserHandle user) {
+ ApplicationInfo info = mLauncherApps.getApplicationInfo(packageName, flags, user);
+ return info == null || (info.flags & ApplicationInfo.FLAG_INSTALLED) == 0 ? null : info;
}
@Override
diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java
index 7c9836282..278669bdb 100644
--- a/src/com/android/launcher3/model/SdCardAvailableReceiver.java
+++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java
@@ -63,7 +63,7 @@ public class SdCardAvailableReceiver extends BroadcastReceiver {
for (String pkg : new HashSet<>(entry.getValue())) {
if (!launcherApps.isPackageEnabledForProfile(pkg, user)) {
- if (pmHelper.isAppOnSdcard(pkg)) {
+ if (pmHelper.isAppOnSdcard(pkg, user)) {
packagesUnavailable.add(pkg);
} else {
packagesRemoved.add(pkg);
diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java
index bfa932b6d..7629f7822 100644
--- a/src/com/android/launcher3/util/PackageManagerHelper.java
+++ b/src/com/android/launcher3/util/PackageManagerHelper.java
@@ -40,81 +40,55 @@ import java.util.List;
*/
public class PackageManagerHelper {
- private static final int FLAG_SUSPENDED = 1<<30;
-
private final Context mContext;
private final PackageManager mPm;
+ private final LauncherAppsCompat mLauncherApps;
public PackageManagerHelper(Context context) {
mContext = context;
mPm = context.getPackageManager();
+ mLauncherApps = LauncherAppsCompat.getInstance(context);
}
/**
* Returns true if the app can possibly be on the SDCard. This is just a workaround and doesn't
* guarantee that the app is on SD card.
*/
- public boolean isAppOnSdcard(String packageName) {
- return isAppEnabled(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
- }
-
- public boolean isAppEnabled(String packageName) {
- return isAppEnabled(packageName, 0);
+ public boolean isAppOnSdcard(String packageName, UserHandle user) {
+ ApplicationInfo info = mLauncherApps.getApplicationInfo(
+ packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, user);
+ return info != null && (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
}
- public boolean isAppEnabled(String packageName, int flags) {
- try {
- ApplicationInfo info = mPm.getApplicationInfo(packageName, flags);
- return info != null && info.enabled;
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- }
-
- /**
- * Returns whether a package is suspended for the current user as per
- * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}.
- */
- public boolean isAppSuspended(String packageName) {
- try {
- ApplicationInfo info = mPm.getApplicationInfo(packageName, 0);
- return info != null && isAppSuspended(info);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- }
-
- /**
- * Returns whether the target app is suspended for a given user as per
- * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}.
- */
+ /**
+ * Returns whether the target app is suspended for a given user as per
+ * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}.
+ */
public boolean isAppSuspended(String packageName, UserHandle user) {
- ApplicationInfo info =
- LauncherAppsCompat.getInstance(mContext).getApplicationInfo(packageName, user);
+ ApplicationInfo info = mLauncherApps.getApplicationInfo(packageName, 0, user);
return info != null && isAppSuspended(info);
}
public boolean isSafeMode() {
- return mPm.isSafeMode();
+ return mContext.getPackageManager().isSafeMode();
}
public Intent getAppLaunchIntent(String pkg, UserHandle user) {
- List<LauncherActivityInfo> activities = LauncherAppsCompat.getInstance(mContext)
- .getActivityList(pkg, user);
+ List<LauncherActivityInfo> activities = mLauncherApps.getActivityList(pkg, user);
return activities.isEmpty() ? null :
AppInfo.makeLaunchIntent(mContext, activities.get(0), user);
}
- /**
- * Returns whether an application is suspended as per
- * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}.
- */
+ /**
+ * Returns whether an application is suspended as per
+ * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}.
+ */
public static boolean isAppSuspended(ApplicationInfo info) {
// The value of FLAG_SUSPENDED was reused by a hidden constant
// ApplicationInfo.FLAG_PRIVILEGED prior to N, so only check for suspended flag on N
// or later.
if (Utilities.ATLEAST_NOUGAT) {
- return (info.flags & FLAG_SUSPENDED) != 0;
+ return (info.flags & ApplicationInfo.FLAG_SUSPENDED) != 0;
} else {
return false;
}