Merge changes from topic "actorenforceuser"

* changes:
  Fix user handling for actor enforcement
  Fix OverlayableInfo native construction
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index f3a626e..5d13cf8 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -32,6 +32,11 @@
 
 namespace android {
 
+static struct overlayableinfo_offsets_t {
+  jclass classObject;
+  jmethodID constructor;
+} gOverlayableInfoOffsets;
+
 static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, jstring java_path, jboolean system,
                         jboolean force_shared_lib, jboolean overlay, jboolean for_loader) {
   ScopedUtfChars path(env, java_path);
@@ -222,12 +227,9 @@
     return 0;
   }
 
-  jclass overlayable_class = env->FindClass("android/content/om/OverlayableInfo");
-  jmethodID overlayable_constructor = env->GetMethodID(overlayable_class, "<init>",
-                                                       "(Ljava/lang/String;Ljava/lang/String;I)V");
   return env->NewObject(
-      overlayable_class,
-      overlayable_constructor,
+      gOverlayableInfoOffsets.classObject,
+      gOverlayableInfoOffsets.constructor,
       overlayable_name,
       actor_string
   );
@@ -267,6 +269,11 @@
 };
 
 int register_android_content_res_ApkAssets(JNIEnv* env) {
+  jclass overlayableInfoClass = FindClassOrDie(env, "android/content/om/OverlayableInfo");
+  gOverlayableInfoOffsets.classObject = MakeGlobalRefOrDie(env, overlayableInfoClass);
+  gOverlayableInfoOffsets.constructor = GetMethodIDOrDie(env, gOverlayableInfoOffsets.classObject,
+      "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
+
   return RegisterMethodsOrDie(env, "android/content/res/ApkAssets", gApkAssetsMethods,
                               arraysize(gApkAssetsMethods));
 }
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index 63de61c..8b69946 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -533,13 +533,13 @@
 
     private final IBinder mService = new IOverlayManager.Stub() {
         @Override
-        public Map<String, List<OverlayInfo>> getAllOverlays(int userId) throws RemoteException {
+        public Map<String, List<OverlayInfo>> getAllOverlays(final int userIdArg) {
             try {
-                traceBegin(TRACE_TAG_RRO, "OMS#getAllOverlays " + userId);
-                userId = handleIncomingUser(userId, "getAllOverlays");
+                traceBegin(TRACE_TAG_RRO, "OMS#getAllOverlays " + userIdArg);
+                final int realUserId = handleIncomingUser(userIdArg, "getAllOverlays");
 
                 synchronized (mLock) {
-                    return mImpl.getOverlaysForUser(userId);
+                    return mImpl.getOverlaysForUser(realUserId);
                 }
             } finally {
                 traceEnd(TRACE_TAG_RRO);
@@ -548,16 +548,17 @@
 
         @Override
         public List<OverlayInfo> getOverlayInfosForTarget(@Nullable final String targetPackageName,
-                int userId) throws RemoteException {
+                final int userIdArg) {
+            if (targetPackageName == null) {
+                return Collections.emptyList();
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfosForTarget " + targetPackageName);
-                userId = handleIncomingUser(userId, "getOverlayInfosForTarget");
-                if (targetPackageName == null) {
-                    return Collections.emptyList();
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "getOverlayInfosForTarget");
 
                 synchronized (mLock) {
-                    return mImpl.getOverlayInfosForTarget(targetPackageName, userId);
+                    return mImpl.getOverlayInfosForTarget(targetPackageName, realUserId);
                 }
             } finally {
                 traceEnd(TRACE_TAG_RRO);
@@ -566,16 +567,17 @@
 
         @Override
         public OverlayInfo getOverlayInfo(@Nullable final String packageName,
-                int userId) throws RemoteException {
+                final int userIdArg) {
+            if (packageName == null) {
+                return null;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfo " + packageName);
-                userId = handleIncomingUser(userId, "getOverlayInfo");
-                if (packageName == null) {
-                    return null;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "getOverlayInfo");
 
                 synchronized (mLock) {
-                    return mImpl.getOverlayInfo(packageName, userId);
+                    return mImpl.getOverlayInfo(packageName, realUserId);
                 }
             } finally {
                 traceEnd(TRACE_TAG_RRO);
@@ -584,19 +586,20 @@
 
         @Override
         public boolean setEnabled(@Nullable final String packageName, final boolean enable,
-                int userId) throws RemoteException {
+                int userIdArg) {
+            if (packageName == null) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setEnabled " + packageName + " " + enable);
-                enforceActor(packageName, "setEnabled", userId);
-                userId = handleIncomingUser(userId, "setEnabled");
-                if (packageName == null) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "setEnabled");
+                enforceActor(packageName, "setEnabled", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
-                        return mImpl.setEnabled(packageName, enable, userId);
+                        return mImpl.setEnabled(packageName, enable, realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -608,20 +611,21 @@
 
         @Override
         public boolean setEnabledExclusive(@Nullable final String packageName, final boolean enable,
-                int userId) throws RemoteException {
+                int userIdArg) {
+            if (packageName == null || !enable) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusive " + packageName + " " + enable);
-                enforceActor(packageName, "setEnabledExclusive", userId);
-                userId = handleIncomingUser(userId, "setEnabledExclusive");
-                if (packageName == null || !enable) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "setEnabledExclusive");
+                enforceActor(packageName, "setEnabledExclusive", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
                         return mImpl.setEnabledExclusive(packageName, false /* withinCategory */,
-                                userId);
+                                realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -632,21 +636,23 @@
         }
 
         @Override
-        public boolean setEnabledExclusiveInCategory(@Nullable String packageName, int userId)
-                throws RemoteException {
+        public boolean setEnabledExclusiveInCategory(@Nullable String packageName,
+                final int userIdArg) {
+            if (packageName == null) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusiveInCategory " + packageName);
-                enforceActor(packageName, "setEnabledExclusiveInCategory", userId);
-                userId = handleIncomingUser(userId, "setEnabledExclusiveInCategory");
-                if (packageName == null) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg,
+                        "setEnabledExclusiveInCategory");
+                enforceActor(packageName, "setEnabledExclusiveInCategory", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
                         return mImpl.setEnabledExclusive(packageName, true /* withinCategory */,
-                                userId);
+                                realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -658,20 +664,21 @@
 
         @Override
         public boolean setPriority(@Nullable final String packageName,
-                @Nullable final String parentPackageName, int userId) throws RemoteException {
+                @Nullable final String parentPackageName, final int userIdArg) {
+            if (packageName == null || parentPackageName == null) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setPriority " + packageName + " "
                         + parentPackageName);
-                enforceActor(packageName, "setPriority", userId);
-                userId = handleIncomingUser(userId, "setPriority");
-                if (packageName == null || parentPackageName == null) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "setPriority");
+                enforceActor(packageName, "setPriority", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
-                        return mImpl.setPriority(packageName, parentPackageName, userId);
+                        return mImpl.setPriority(packageName, parentPackageName, realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -682,20 +689,20 @@
         }
 
         @Override
-        public boolean setHighestPriority(@Nullable final String packageName, int userId)
-                throws RemoteException {
+        public boolean setHighestPriority(@Nullable final String packageName, final int userIdArg) {
+            if (packageName == null) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setHighestPriority " + packageName);
-                enforceActor(packageName, "setHighestPriority", userId);
-                userId = handleIncomingUser(userId, "setHighestPriority");
-                if (packageName == null) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "setHighestPriority");
+                enforceActor(packageName, "setHighestPriority", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
-                        return mImpl.setHighestPriority(packageName, userId);
+                        return mImpl.setHighestPriority(packageName, realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -706,20 +713,20 @@
         }
 
         @Override
-        public boolean setLowestPriority(@Nullable final String packageName, int userId)
-                throws RemoteException {
+        public boolean setLowestPriority(@Nullable final String packageName, final int userIdArg) {
+            if (packageName == null) {
+                return false;
+            }
+
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#setLowestPriority " + packageName);
-                enforceActor(packageName, "setLowestPriority", userId);
-                userId = handleIncomingUser(userId, "setLowestPriority");
-                if (packageName == null) {
-                    return false;
-                }
+                final int realUserId = handleIncomingUser(userIdArg, "setLowestPriority");
+                enforceActor(packageName, "setLowestPriority", realUserId);
 
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     synchronized (mLock) {
-                        return mImpl.setLowestPriority(packageName, userId);
+                        return mImpl.setLowestPriority(packageName, realUserId);
                     }
                 } finally {
                     Binder.restoreCallingIdentity(ident);
@@ -730,7 +737,7 @@
         }
 
         @Override
-        public String[] getDefaultOverlayPackages() throws RemoteException {
+        public String[] getDefaultOverlayPackages() {
             try {
                 traceBegin(TRACE_TAG_RRO, "OMS#getDefaultOverlayPackages");
                 getContext().enforceCallingOrSelfPermission(
@@ -750,18 +757,17 @@
         }
 
         @Override
-        public void invalidateCachesForOverlay(@Nullable String packageName, int userId)
-                throws RemoteException {
+        public void invalidateCachesForOverlay(@Nullable String packageName, final int userIdArg) {
             if (packageName == null) {
                 return;
             }
 
-            enforceActor(packageName, "invalidateCachesForOverlay", userId);
-            userId = handleIncomingUser(userId, "invalidateCachesForOverlay");
+            final int realUserId = handleIncomingUser(userIdArg, "invalidateCachesForOverlay");
+            enforceActor(packageName, "invalidateCachesForOverlay", realUserId);
             final long ident = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
-                    mImpl.removeIdmapForOverlay(packageName, userId);
+                    mImpl.removeIdmapForOverlay(packageName, realUserId);
                 }
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -876,11 +882,16 @@
             getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, message);
         }
 
-        private void enforceActor(String packageName, String methodName, int userId)
+        private void enforceActor(String packageName, String methodName, int realUserId)
                 throws SecurityException {
-            OverlayInfo overlayInfo = mImpl.getOverlayInfo(packageName, userId);
+            OverlayInfo overlayInfo = mImpl.getOverlayInfo(packageName, realUserId);
+            if (overlayInfo == null) {
+                throw new IllegalArgumentException("Unable to retrieve overlay information for "
+                        + packageName);
+            }
+
             int callingUid = Binder.getCallingUid();
-            mActorEnforcer.enforceActor(overlayInfo, methodName, callingUid, userId);
+            mActorEnforcer.enforceActor(overlayInfo, methodName, callingUid, realUserId);
         }
     };