Android OOP-D: Use JavaHandlerThread for Display Compositor

Android OOP-D requires running a Java Choreographer based
BeginFrameSource on the display compositor thread. In order to do this,
this thread must have a Java looper.

This CL adds a looper by converting this thread from a base::Thread
to a base::android::JavaHandlerThread on Android. As we also want to
be able to specify a thread priority for this thread, this patch adds
thread priority support to the JavaHandlerThread class.

Bug: 811967
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I12d39edd5925f33629e91ad17eaf575ed49b0296
Reviewed-on: https://chromium-review.googlesource.com/1109020
Reviewed-by: Khushal <khushalsagar@chromium.org>
Reviewed-by: Yaron Friedman <yfriedman@chromium.org>
Commit-Queue: Eric Karl <ericrk@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#569333}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: b2ce0204f34f426de59e14e25edc96269aacea50
diff --git a/android/java/src/org/chromium/base/JavaHandlerThread.java b/android/java/src/org/chromium/base/JavaHandlerThread.java
index 065fee1..9a7431e 100644
--- a/android/java/src/org/chromium/base/JavaHandlerThread.java
+++ b/android/java/src/org/chromium/base/JavaHandlerThread.java
@@ -27,13 +27,13 @@
      * Construct a java-only instance. Can be connected with native side later.
      * Useful for cases where a java thread is needed before native library is loaded.
      */
-    public JavaHandlerThread(String name) {
-        mThread = new HandlerThread(name);
+    public JavaHandlerThread(String name, int priority) {
+        mThread = new HandlerThread(name, priority);
     }
 
     @CalledByNative
-    private static JavaHandlerThread create(String name) {
-        return new JavaHandlerThread(name);
+    private static JavaHandlerThread create(String name, int priority) {
+        return new JavaHandlerThread(name, priority);
     }
 
     public Looper getLooper() {
diff --git a/android/java_handler_thread.cc b/android/java_handler_thread.cc
index f61c784..3b3f3b6 100644
--- a/android/java_handler_thread.cc
+++ b/android/java_handler_thread.cc
@@ -10,6 +10,7 @@
 #include "base/android/jni_string.h"
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/threading/platform_thread_internal_posix.h"
 #include "base/threading/thread_restrictions.h"
 #include "jni/JavaHandlerThread_jni.h"
 
@@ -19,10 +20,12 @@
 
 namespace android {
 
-JavaHandlerThread::JavaHandlerThread(const char* name)
+JavaHandlerThread::JavaHandlerThread(const char* name,
+                                     base::ThreadPriority priority)
     : JavaHandlerThread(Java_JavaHandlerThread_create(
           AttachCurrentThread(),
-          ConvertUTF8ToJavaString(AttachCurrentThread(), name))) {}
+          ConvertUTF8ToJavaString(AttachCurrentThread(), name),
+          base::internal::ThreadPriorityToNiceValue(priority))) {}
 
 JavaHandlerThread::JavaHandlerThread(
     const base::android::ScopedJavaLocalRef<jobject>& obj)
diff --git a/android/java_handler_thread.h b/android/java_handler_thread.h
index 9529320..df90f66 100644
--- a/android/java_handler_thread.h
+++ b/android/java_handler_thread.h
@@ -27,7 +27,9 @@
 class BASE_EXPORT JavaHandlerThread {
  public:
   // Create new thread.
-  explicit JavaHandlerThread(const char* name);
+  explicit JavaHandlerThread(
+      const char* name,
+      base::ThreadPriority priority = base::ThreadPriority::NORMAL);
   // Wrap and connect to an existing JavaHandlerThread.
   // |obj| is an instance of JavaHandlerThread.
   explicit JavaHandlerThread(
diff --git a/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java b/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java
index 3da7ba8..3985e6a 100644
--- a/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java
+++ b/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java
@@ -5,6 +5,7 @@
 package org.chromium.base;
 
 import android.os.Handler;
+import android.os.Process;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.CalledByNativeUnchecked;
@@ -32,7 +33,8 @@
             }
         };
 
-        JavaHandlerThread thread = new JavaHandlerThread("base_unittests_java");
+        JavaHandlerThread thread =
+                new JavaHandlerThread("base_unittests_java", Process.THREAD_PRIORITY_DEFAULT);
         thread.maybeStart();
 
         Handler handler = new Handler(thread.getLooper());