summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/Magnifier.java18
1 files changed, 17 insertions, 1 deletions
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 08799cfb5d4c..4fcc77fd922a 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -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.