Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea6d4a33 authored by Candice Lo's avatar Candice Lo Committed by chihtinglo
Browse files

fix(fullscreen magnification): add flag for drawing fullscreen magnification border in SystemUI

Add the flag for:
1. Wrapping the contents in methods that are related to border drawing
2. Avoid creating the MagnifiedViewport that is used for managing UI-related components to save memory

Bug: 291891390
Test: manually enable/disable the flag to check if the original orange border exists
      atest WindowManagerServiceTests#testDrawMagnifiedViewport
      atest frameworks/base/services/tests/servicestests/src/com/android/server/accessibility/magnification
Flag: ACONGIF com.android.window.flags.magnification_always_draw_fullscreen_border DEVELOPMENT

Change-Id: I7c9a61afd4dfee5a64219a8f3e908b9512f68b6d
parent 79a5e722
Loading
Loading
Loading
Loading
+48 −20
Original line number Original line Diff line number Diff line
@@ -304,9 +304,9 @@ final class AccessibilityController {
    Surface forceShowMagnifierSurface(int displayId) {
    Surface forceShowMagnifierSurface(int displayId) {
        final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
        final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
        if (displayMagnifier != null) {
        if (displayMagnifier != null) {
            displayMagnifier.mMagnifedViewport.mWindow.setAlpha(DisplayMagnifier.MagnifiedViewport
            displayMagnifier.mMagnifiedViewport.mWindow.setAlpha(DisplayMagnifier.MagnifiedViewport
                    .ViewportWindow.AnimationController.MAX_ALPHA);
                    .ViewportWindow.AnimationController.MAX_ALPHA);
            return displayMagnifier.mMagnifedViewport.mWindow.mSurface;
            return displayMagnifier.mMagnifiedViewport.mWindow.mSurface;
        }
        }
        return null;
        return null;
    }
    }
@@ -463,6 +463,10 @@ final class AccessibilityController {
    }
    }


    void drawMagnifiedRegionBorderIfNeeded(int displayId) {
    void drawMagnifiedRegionBorderIfNeeded(int displayId) {
        if (Flags.magnificationAlwaysDrawFullscreenBorder()) {
            return;
        }

        if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
        if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
            mAccessibilityTracing.logTrace(
            mAccessibilityTracing.logTrace(
                    TAG + ".drawMagnifiedRegionBorderIfNeeded",
                    TAG + ".drawMagnifiedRegionBorderIfNeeded",
@@ -614,7 +618,7 @@ final class AccessibilityController {


        private final Context mDisplayContext;
        private final Context mDisplayContext;
        private final WindowManagerService mService;
        private final WindowManagerService mService;
        private final MagnifiedViewport mMagnifedViewport;
        private final MagnifiedViewport mMagnifiedViewport;
        private final Handler mHandler;
        private final Handler mHandler;
        private final DisplayContent mDisplayContent;
        private final DisplayContent mDisplayContent;
        private final Display mDisplay;
        private final Display mDisplay;
@@ -649,7 +653,8 @@ final class AccessibilityController {
            mDisplayContent = displayContent;
            mDisplayContent = displayContent;
            mDisplay = display;
            mDisplay = display;
            mHandler = new MyHandler(mService.mH.getLooper());
            mHandler = new MyHandler(mService.mH.getLooper());
            mMagnifedViewport = new MagnifiedViewport();
            mMagnifiedViewport = Flags.magnificationAlwaysDrawFullscreenBorder()
                    ? null : new MagnifiedViewport();
            mAccessibilityTracing =
            mAccessibilityTracing =
                    AccessibilityController.getAccessibilityControllerInternal(mService);
                    AccessibilityController.getAccessibilityControllerInternal(mService);
            mLongAnimationDuration = mDisplayContext.getResources().getInteger(
            mLongAnimationDuration = mDisplayContext.getResources().getInteger(
@@ -692,7 +697,9 @@ final class AccessibilityController {
                mMagnificationSpec.clear();
                mMagnificationSpec.clear();
            }
            }


            mMagnifedViewport.setShowMagnifiedBorderIfNeeded();
            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                mMagnifiedViewport.setShowMagnifiedBorderIfNeeded();
            }
        }
        }


        void setFullscreenMagnificationActivated(boolean activated) {
        void setFullscreenMagnificationActivated(boolean activated) {
@@ -701,8 +708,10 @@ final class AccessibilityController {
                        FLAGS_MAGNIFICATION_CALLBACK, "activated=" + activated);
                        FLAGS_MAGNIFICATION_CALLBACK, "activated=" + activated);
            }
            }
            mIsFullscreenMagnificationActivated = activated;
            mIsFullscreenMagnificationActivated = activated;
            mMagnifedViewport.setMagnifiedRegionBorderShown(activated, true);
            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
            mMagnifedViewport.showMagnificationBoundsIfNeeded();
                mMagnifiedViewport.setMagnifiedRegionBorderShown(activated, true);
                mMagnifiedViewport.showMagnificationBoundsIfNeeded();
            }
        }
        }


        boolean isFullscreenMagnificationActivated() {
        boolean isFullscreenMagnificationActivated() {
@@ -737,7 +746,9 @@ final class AccessibilityController {
            }
            }


            recomputeBounds();
            recomputeBounds();
            mMagnifedViewport.onDisplaySizeChanged();
            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                mMagnifiedViewport.onDisplaySizeChanged();
            }
            mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED);
            mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED);
        }
        }


@@ -901,7 +912,10 @@ final class AccessibilityController {
            if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
            if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
                mAccessibilityTracing.logTrace(LOG_TAG + ".destroy", FLAGS_MAGNIFICATION_CALLBACK);
                mAccessibilityTracing.logTrace(LOG_TAG + ".destroy", FLAGS_MAGNIFICATION_CALLBACK);
            }
            }
            mMagnifedViewport.destroyWindow();

            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                mMagnifiedViewport.destroyWindow();
            }
        }
        }


        void drawMagnifiedRegionBorderIfNeeded() {
        void drawMagnifiedRegionBorderIfNeeded() {
@@ -909,7 +923,10 @@ final class AccessibilityController {
                mAccessibilityTracing.logTrace(LOG_TAG + ".drawMagnifiedRegionBorderIfNeeded",
                mAccessibilityTracing.logTrace(LOG_TAG + ".drawMagnifiedRegionBorderIfNeeded",
                        FLAGS_MAGNIFICATION_CALLBACK);
                        FLAGS_MAGNIFICATION_CALLBACK);
            }
            }
            mMagnifedViewport.drawWindowIfNeeded();

            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                mMagnifiedViewport.drawWindowIfNeeded();
            }
        }
        }


        void recomputeBounds() {
        void recomputeBounds() {
@@ -1006,14 +1023,16 @@ final class AccessibilityController {
            }
            }
            visibleWindows.clear();
            visibleWindows.clear();


            mMagnifedViewport.intersectWithDrawBorderInset(screenWidth, screenHeight);
            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {

                mMagnifiedViewport.intersectWithDrawBorderInset(screenWidth, screenHeight);
            }


            final boolean magnifiedChanged =
            final boolean magnifiedChanged =
                    !mOldMagnificationRegion.equals(mMagnificationRegion);
                    !mOldMagnificationRegion.equals(mMagnificationRegion);
            if (magnifiedChanged) {
            if (magnifiedChanged) {
                mMagnifedViewport.updateBorderDrawingStatus(screenWidth, screenHeight);
                if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {

                    mMagnifiedViewport.updateBorderDrawingStatus(screenWidth, screenHeight);
                }
                mOldMagnificationRegion.set(mMagnificationRegion);
                mOldMagnificationRegion.set(mMagnificationRegion);
                final SomeArgs args = SomeArgs.obtain();
                final SomeArgs args = SomeArgs.obtain();
                args.arg1 = Region.obtain(mMagnificationRegion);
                args.arg1 = Region.obtain(mMagnificationRegion);
@@ -1070,7 +1089,9 @@ final class AccessibilityController {
        }
        }


        void dump(PrintWriter pw, String prefix) {
        void dump(PrintWriter pw, String prefix) {
            mMagnifedViewport.dump(pw, prefix);
            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                mMagnifiedViewport.dump(pw, prefix);
            }
        }
        }


        private final class MagnifiedViewport {
        private final class MagnifiedViewport {
@@ -1079,7 +1100,7 @@ final class AccessibilityController {
            private final int mHalfBorderWidth;
            private final int mHalfBorderWidth;
            private final int mDrawBorderInset;
            private final int mDrawBorderInset;


            private final ViewportWindow mWindow;
            @Nullable private final ViewportWindow mWindow;


            private boolean mFullRedrawNeeded;
            private boolean mFullRedrawNeeded;


@@ -1138,9 +1159,9 @@ final class AccessibilityController {
            void onDisplaySizeChanged() {
            void onDisplaySizeChanged() {
                // If fullscreen magnification is activated, hide the border immediately so
                // If fullscreen magnification is activated, hide the border immediately so
                // the user does not see strange artifacts during display size changed caused by
                // the user does not see strange artifacts during display size changed caused by
                // rotation or folding/unfolding the device. In the rotation case, the screenshot
                // rotation or folding/unfolding the device. In the rotation case, the
                // used for rotation already has the border. After the rotation is complete
                // screenshot used for rotation already has the border. After the rotation is
                // we will show the border.
                // completed we will show the border.
                if (isFullscreenMagnificationActivated()) {
                if (isFullscreenMagnificationActivated()) {
                    setMagnifiedRegionBorderShown(false, false);
                    setMagnifiedRegionBorderShown(false, false);
                    final long delay = (long) (mLongAnimationDuration
                    final long delay = (long) (mLongAnimationDuration
@@ -1173,6 +1194,8 @@ final class AccessibilityController {
                mWindow.dump(pw, prefix);
                mWindow.dump(pw, prefix);
            }
            }


            // TODO(291891390): Remove this class when we clean up the flag
            //  magnificationAlwaysDrawFullscreenBorder
            private final class ViewportWindow implements Runnable {
            private final class ViewportWindow implements Runnable {
                private static final String SURFACE_TITLE = "Magnification Overlay";
                private static final String SURFACE_TITLE = "Magnification Overlay";


@@ -1467,6 +1490,9 @@ final class AccessibilityController {
            public static final int MESSAGE_NOTIFY_MAGNIFICATION_REGION_CHANGED = 1;
            public static final int MESSAGE_NOTIFY_MAGNIFICATION_REGION_CHANGED = 1;
            public static final int MESSAGE_NOTIFY_USER_CONTEXT_CHANGED = 3;
            public static final int MESSAGE_NOTIFY_USER_CONTEXT_CHANGED = 3;
            public static final int MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED = 4;
            public static final int MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED = 4;

            // TODO(291891390): Remove this field when we clean up the flag
            //  magnificationAlwaysDrawFullscreenBorder
            public static final int MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED = 5;
            public static final int MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED = 5;
            public static final int MESSAGE_NOTIFY_IME_WINDOW_VISIBILITY_CHANGED = 6;
            public static final int MESSAGE_NOTIFY_IME_WINDOW_VISIBILITY_CHANGED = 6;


@@ -1495,7 +1521,9 @@ final class AccessibilityController {
                    case MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED : {
                    case MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED : {
                        synchronized (mService.mGlobalLock) {
                        synchronized (mService.mGlobalLock) {
                            if (isFullscreenMagnificationActivated()) {
                            if (isFullscreenMagnificationActivated()) {
                                mMagnifedViewport.setMagnifiedRegionBorderShown(true, true);
                                if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
                                    mMagnifiedViewport.setMagnifiedRegionBorderShown(true, true);
                                }
                                mService.scheduleAnimationLocked();
                                mService.scheduleAnimationLocked();
                            }
                            }
                        }
                        }
+8 −0
Original line number Original line Diff line number Diff line
@@ -82,7 +82,10 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.MergedConfiguration;
import android.util.MergedConfiguration;
import android.view.ContentRecordingSession;
import android.view.ContentRecordingSession;
@@ -109,6 +112,7 @@ import com.android.internal.os.IResultReceiver;
import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.wm.SensitiveContentPackages.PackageInfo;
import com.android.server.wm.SensitiveContentPackages.PackageInfo;
import com.android.server.wm.WindowManagerService.WindowContainerInfo;
import com.android.server.wm.WindowManagerService.WindowContainerInfo;
import com.android.window.flags.Flags;


import com.google.common.truth.Expect;
import com.google.common.truth.Expect;


@@ -140,6 +144,9 @@ public class WindowManagerServiceTests extends WindowTestsBase {
    @Rule
    @Rule
    public Expect mExpect = Expect.create();
    public Expect mExpect = Expect.create();


    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @After
    @After
    public void tearDown() {
    public void tearDown() {
        mWm.mSensitiveContentPackages.clearBlockedApps();
        mWm.mSensitiveContentPackages.clearBlockedApps();
@@ -1106,6 +1113,7 @@ public class WindowManagerServiceTests extends WindowTestsBase {
                argThat(h -> (h.inputConfig & InputConfig.SPY) == InputConfig.SPY));
                argThat(h -> (h.inputConfig & InputConfig.SPY) == InputConfig.SPY));
    }
    }


    @RequiresFlagsDisabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER)
    @Test
    @Test
    public void testDrawMagnifiedViewport() {
    public void testDrawMagnifiedViewport() {
        final int displayId = mDisplayContent.mDisplayId;
        final int displayId = mDisplayContent.mDisplayId;