Expose APIs to analyze UIDs in UserHandle/Process.

Clients of the NetworkStatsManager public APIs may get UIDs belonging
to other users, and UIDs which don't actually represent applications.
These APIs allow clients to understand whether a given ID belongs to
the same user as themselves, and whether an ID represents an
application or something else (e.g. a system UID).

Change-Id: Ia56d5891521ce98e5594c41da8f9d756819deb66
diff --git a/api/current.txt b/api/current.txt
index 8b9274c..0d031bc 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29061,6 +29061,7 @@
     method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
     method public static final int getUidForName(java.lang.String);
     method public static final boolean is64Bit();
+    method public static boolean isApplicationUid(int);
     method public static final void killProcess(int);
     method public static final int myPid();
     method public static final int myTid();
@@ -29241,6 +29242,7 @@
   public final class UserHandle implements android.os.Parcelable {
     ctor public UserHandle(android.os.Parcel);
     method public int describeContents();
+    method public static android.os.UserHandle getUserHandleForUid(int);
     method public static android.os.UserHandle readFromParcel(android.os.Parcel);
     method public void writeToParcel(android.os.Parcel, int);
     method public static void writeToParcel(android.os.UserHandle, android.os.Parcel);
diff --git a/api/system-current.txt b/api/system-current.txt
index 43a787f..1af8150 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -31354,6 +31354,7 @@
     method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
     method public static final int getUidForName(java.lang.String);
     method public static final boolean is64Bit();
+    method public static boolean isApplicationUid(int);
     method public static final void killProcess(int);
     method public static final int myPid();
     method public static final int myTid();
@@ -31580,6 +31581,7 @@
     ctor public UserHandle(android.os.Parcel);
     method public int describeContents();
     method public int getIdentifier();
+    method public static android.os.UserHandle getUserHandleForUid(int);
     method public deprecated boolean isOwner();
     method public boolean isSystem();
     method public static int myUserId();
diff --git a/api/test-current.txt b/api/test-current.txt
index 428b359..b6b8697 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -29070,6 +29070,7 @@
     method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
     method public static final int getUidForName(java.lang.String);
     method public static final boolean is64Bit();
+    method public static boolean isApplicationUid(int);
     method public static final void killProcess(int);
     method public static final int myPid();
     method public static final int myTid();
@@ -29251,6 +29252,7 @@
     ctor public UserHandle(android.os.Parcel);
     method public int describeContents();
     method public static int getAppId(int);
+    method public static android.os.UserHandle getUserHandleForUid(int);
     method public static android.os.UserHandle readFromParcel(android.os.Parcel);
     method public void writeToParcel(android.os.Parcel, int);
     method public static void writeToParcel(android.os.UserHandle, android.os.Parcel);
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index b51d2dfb..9984755 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -823,6 +823,16 @@
     }
 
     /**
+     * Returns whether the given uid belongs to an application.
+     * @param uid A kernel uid.
+     * @return Whether the uid corresponds to an application sandbox running in
+     *     a specific user.
+     */
+    public static boolean isApplicationUid(int uid) {
+        return UserHandle.isApp(uid);
+    }
+
+    /**
      * Returns whether the current process is in an isolated sandbox.
      * @hide
      */
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 24666fe..b3f4453 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -130,6 +130,15 @@
     }
 
     /**
+     * Returns the user for a given uid.
+     * @param uid A uid for an application running in a particular user.
+     * @return A {@link UserHandle} for that user.
+     */
+    public static UserHandle getUserHandleForUid(int uid) {
+        return of(getUserId(uid));
+    }
+
+    /**
      * Returns the user id for a given uid.
      * @hide
      */