From ca1a5a9ce9b2c9fbf1a2cf1a5fc9902ab2c390c5 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Mon, 9 Dec 2019 22:10:59 +0100 Subject: [PATCH 1/2] Update gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index bcc63eac1..50859dd25 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.3' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3193b45a8..6a02253bc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jun 08 08:31:36 CEST 2019 +#Mon Dec 09 22:10:46 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip From 68618365b7539d00ed32084147f45d76ef7e4d37 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Mon, 9 Dec 2019 22:16:22 +0100 Subject: [PATCH 2/2] Create virtual display in a new Thread * Android Q issues an ANR if we run in the main thread --- .../java/com/kamron/pogoiv/ScreenGrabber.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/kamron/pogoiv/ScreenGrabber.java b/app/src/main/java/com/kamron/pogoiv/ScreenGrabber.java index 3237d8758..9a19a9d84 100644 --- a/app/src/main/java/com/kamron/pogoiv/ScreenGrabber.java +++ b/app/src/main/java/com/kamron/pogoiv/ScreenGrabber.java @@ -39,10 +39,15 @@ private ScreenGrabber(MediaProjection mediaProjection, DisplayMetrics raw) { projection = mediaProjection; imageReader = ImageReader.newInstance(rawDisplayMetrics.widthPixels, rawDisplayMetrics.heightPixels, PixelFormat.RGBA_8888, 2); - virtualDisplay = projection.createVirtualDisplay("screen-mirror", rawDisplayMetrics.widthPixels, - rawDisplayMetrics.heightPixels, - rawDisplayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.getSurface(), - null, null); + new Thread(new Runnable() { + @Override + public void run() { + virtualDisplay = projection.createVirtualDisplay("screen-mirror", rawDisplayMetrics.widthPixels, + rawDisplayMetrics.heightPixels, + rawDisplayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.getSurface(), + null, null); + } + }).start(); } public static ScreenGrabber init(MediaProjection mediaProjection, DisplayMetrics raw) { @@ -77,7 +82,8 @@ public void exit() { } @WorkerThread - public @Nullable Bitmap grabScreen() { + public @Nullable + Bitmap grabScreen() { Image image = null; Bitmap bmp = null; Integer retries = 60; // Retry for an entire second (given the rendering speed of 60fps) @@ -131,7 +137,9 @@ public void exit() { * @param points array of points representing coordinates to grab * @return array of colors for the requested pixels, or null if any of them is out-of-bounds */ - public @Nullable @ColorInt int[] grabPixels(Point[] points) { + public @Nullable + @ColorInt + int[] grabPixels(Point[] points) { Image image = null; try { //Note: imageReader shouldn't be null, but apparently sometimes is. @@ -172,7 +180,8 @@ public void exit() { } //Inspired by http://stackoverflow.com/a/27655022/53974. - private static @ColorInt int getPixel(ByteBuffer buffer, Point pos, int pixelStride, int rowStride) { + private static @ColorInt + int getPixel(ByteBuffer buffer, Point pos, int pixelStride, int rowStride) { int offset = pos.y * rowStride + pos.x * pixelStride; //This works because the image reader is configured with PixelFormat.RGBA_8888. int r = buffer.get(offset) & 0xff;