OSDN Git Service

[Magnifier-84] Improve PixelCopy failures handling
authorMihai Popa <popam@google.com>
Tue, 7 May 2019 21:29:52 +0000 (22:29 +0100)
committerMihai Popa <popam@google.com>
Wed, 22 May 2019 11:09:27 +0000 (11:09 +0000)
The CL adds PixelCopy failure handling in Magnifier. Previously, if the
content copy failed, the Magnifier would still render the shadow,
therefore displaying an empty rectangle shadow frame. The CL fixes this,
avoiding displaying anything if the PixelCopy request fails.

Test: atest CtsWidgetTestCases:android.widget.cts.MagnifierTest
Bug: 132136368
Change-Id: I66715c56770380afafa5af5a3ee976bcaaa5ba1e
(cherry picked from commit 3aa46b2dd00ab9bad26d4f27fa41e0d692afda90)
Merged-In: I66715c56770380afafa5af5a3ee976bcaaa5ba1e

core/java/android/widget/Magnifier.java

index 08799cf..4fcc77f 100644 (file)
@@ -625,7 +625,7 @@ public final class Magnifier {
         resolvedTop = Math.min(resolvedTop, mContentCopySurface.mHeight - mSourceHeight);
         if (resolvedLeft < 0 || resolvedTop < 0) {
             Log.e(TAG, "Magnifier's content is copied from a surface smaller than"
-                    + "the content requested size. This will probably lead to distorted content.");
+                    + "the content requested size. The magnifier will be dismissed.");
         }
         resolvedRight = Math.max(resolvedRight, resolvedLeft + mSourceWidth);
         resolvedBottom = Math.max(resolvedBottom, resolvedTop + mSourceHeight);
@@ -664,6 +664,7 @@ public final class Magnifier {
     private void performPixelCopy(final int startXInSurface, final int startYInSurface,
             final boolean updateWindowPosition) {
         if (mContentCopySurface.mSurface == null || !mContentCopySurface.mSurface.isValid()) {
+            onPixelCopyFailed();
             return;
         }
 
@@ -681,6 +682,10 @@ public final class Magnifier {
                 Bitmap.createBitmap(mSourceWidth, mSourceHeight, Bitmap.Config.ARGB_8888);
         PixelCopy.request(mContentCopySurface.mSurface, mPixelCopyRequestRect, bitmap,
                 result -> {
+                    if (result != PixelCopy.SUCCESS) {
+                        onPixelCopyFailed();
+                        return;
+                    }
                     synchronized (mLock) {
                         if (mWindow != currentWindowInstance) {
                             // The magnifier was dismissed (and maybe shown again) in the meantime.
@@ -699,6 +704,17 @@ public final class Magnifier {
         mDirtyState = false;
     }
 
+    private void onPixelCopyFailed() {
+        Log.e(TAG, "Magnifier failed to copy content from the view Surface. It will be dismissed.");
+        // Post to make sure #dismiss is done on the main thread.
+        Handler.getMain().postAtFrontOfQueue(() -> {
+            dismiss();
+            if (mCallback != null) {
+                mCallback.onOperationComplete();
+            }
+        });
+    }
+
     /**
      * Clamp window coordinates inside the surface the magnifier is attached to, to avoid
      * displaying the magnifier out of screen or overlapping with system insets.