Define GID range for external data and OBBs.

To quickly answer the question of "how much data is a UID using?" we
need a GID range to label files on external storage, similar to
the GID ranges already defined for cached and shared data.

Also define a new GID that will be used to label the OBB files shared
between all users under /data/media/obb.

Test: builds, newly added tests pass
Bug: 34263266
Change-Id: I16fb7d166c3dcdeafbf477162d191d3b73ae8ac2
diff --git a/libcutils/multiuser.c b/libcutils/multiuser.c
index 0ef337d..08d4d6c 100644
--- a/libcutils/multiuser.c
+++ b/libcutils/multiuser.c
@@ -37,6 +37,14 @@
     }
 }
 
+gid_t multiuser_get_ext_gid(userid_t user_id, appid_t app_id) {
+    if (app_id >= AID_APP_START && app_id <= AID_APP_END) {
+        return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_EXT_GID_START);
+    } else {
+        return -1;
+    }
+}
+
 gid_t multiuser_get_shared_gid(userid_t user_id, appid_t app_id) {
     if (app_id >= AID_APP_START && app_id <= AID_APP_END) {
         return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_SHARED_GID_START);
diff --git a/libcutils/tests/multiuser_test.cpp b/libcutils/tests/multiuser_test.cpp
index 2307ea8..c5f58b4 100644
--- a/libcutils/tests/multiuser_test.cpp
+++ b/libcutils/tests/multiuser_test.cpp
@@ -58,6 +58,14 @@
     EXPECT_EQ(1020000, multiuser_get_cache_gid(10, 10000));
 }
 
+TEST(MultiuserTest, TestExt) {
+    EXPECT_EQ(-1, multiuser_get_ext_gid(0, 0));
+    EXPECT_EQ(-1, multiuser_get_ext_gid(0, 1000));
+    EXPECT_EQ(30000, multiuser_get_ext_gid(0, 10000));
+    EXPECT_EQ(-1, multiuser_get_ext_gid(0, 50000));
+    EXPECT_EQ(1030000, multiuser_get_ext_gid(10, 10000));
+}
+
 TEST(MultiuserTest, TestShared) {
     EXPECT_EQ(-1, multiuser_get_shared_gid(0, 0));
     EXPECT_EQ(-1, multiuser_get_shared_gid(0, 1000));