summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fyodor Kupolov <fkupolov@google.com> 2015-01-27 11:59:00 -0800
committer Fyodor Kupolov <fkupolov@google.com> 2015-01-27 12:05:07 -0800
commit703d1c43a25fe6e80c5fea46cc0ff14f0e1fbc00 (patch)
tree92335c5da88106cf1b8b536c5042957d78c850d0
parentcd4c8525fa18b5c2e96de781edf113e9972e2ba2 (diff)
Added primaryUserOnly attribute for activities
In addition to receivers, primaryUserOnly is now supported for activities. In queryIntentActivities method, activities with primaryUserOnly flag set will be filtered out, when current user is not the owner. Change-Id: I0b7168b8c96749cd6d23b8c95d5624589f5f2d86
-rw-r--r--core/java/android/content/pm/PackageParser.java11
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java29
2 files changed, 31 insertions, 9 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index d7d9e8bf6a4e..5c09b427f213 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3082,6 +3082,12 @@ public class PackageParser {
a.info.flags |= ActivityInfo.FLAG_IMMERSIVE;
}
+ if (sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestActivity_primaryUserOnly,
+ false)) {
+ a.info.flags |= ActivityInfo.FLAG_PRIMARY_USER_ONLY;
+ }
+
if (!receiver) {
if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestActivity_hardwareAccelerated,
@@ -3153,11 +3159,6 @@ public class PackageParser {
setExported = true;
}
}
- if (sa.getBoolean(
- com.android.internal.R.styleable.AndroidManifestActivity_primaryUserOnly,
- false)) {
- a.info.flags |= ActivityInfo.FLAG_PRIMARY_USER_ONLY;
- }
}
sa.recycle();
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 13b2b0fe3770..2569f6cdd850 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3381,7 +3381,7 @@ public class PackageManagerService extends IPackageManager.Stub {
if (resolveInfo != null) {
List<ResolveInfo> result = new ArrayList<ResolveInfo>(1);
result.add(resolveInfo);
- return result;
+ return filterIfNotPrimaryUser(result, userId);
}
// Check for cross profile results.
resolveInfo = queryCrossProfileIntents(
@@ -3394,17 +3394,38 @@ public class PackageManagerService extends IPackageManager.Stub {
result.add(resolveInfo);
Collections.sort(result, mResolvePrioritySorter);
}
- return result;
+ return filterIfNotPrimaryUser(result, userId);
}
final PackageParser.Package pkg = mPackages.get(pkgName);
if (pkg != null) {
- return mActivities.queryIntentForPackage(intent, resolvedType, flags,
- pkg.activities, userId);
+ return filterIfNotPrimaryUser(
+ mActivities.queryIntentForPackage(
+ intent, resolvedType, flags, pkg.activities, userId),
+ userId);
}
return new ArrayList<ResolveInfo>();
}
}
+ /**
+ * Filter out activities with primaryUserOnly flag set, when current user is not the owner.
+ *
+ * @return filtered list
+ */
+ private List<ResolveInfo> filterIfNotPrimaryUser(List<ResolveInfo> resolveInfos, int userId) {
+ if (userId == UserHandle.USER_OWNER) {
+ return resolveInfos;
+ }
+ for (int i = resolveInfos.size() - 1; i >= 0; i--) {
+ ResolveInfo info = resolveInfos.get(i);
+ if ((info.activityInfo.flags & ActivityInfo.FLAG_PRIMARY_USER_ONLY) != 0) {
+ resolveInfos.remove(i);
+ }
+ }
+ return resolveInfos;
+ }
+
+
private ResolveInfo querySkipCurrentProfileIntents(
List<CrossProfileIntentFilter> matchingFilters, Intent intent, String resolvedType,
int flags, int sourceUserId) {