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

Commit b0d7008d authored by ryanlwlin's avatar ryanlwlin Committed by Ryan Lin
Browse files

Request connection for window magnification

request window magnification connection through IstatusBar only
when magnification mode is window and magnification state is enabled.

Bug: 152578960
Test: WindowMagnificationManagerTest

Change-Id: I4e00448d9b64f9fd04fa5a5758bd41b2d2c8352f
parent de2a50f7
Loading
Loading
Loading
Loading
+0 −35
Original line number Diff line number Diff line
@@ -21,19 +21,15 @@ import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.provider.Settings;
import android.util.Log;
import android.view.Display;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IWindowMagnificationConnection;
import android.view.accessibility.IWindowMagnificationConnectionCallback;

import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.CommandQueue;
@@ -89,37 +85,6 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
    @Override
    public void start() {
        mCommandQueue.addCallback(this);
        mContext.getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(Settings.Secure.WINDOW_MAGNIFICATION),
                true, new ContentObserver(mHandler) {
                    @Override
                    public void onChange(boolean selfChange) {
                        updateWindowMagnification();
                    }
                });
    }

    private void updateWindowMagnification() {
        try {
            boolean enable = Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.WINDOW_MAGNIFICATION) != 0;
            if (enable) {
                enableMagnification(
                        mContext.getResources().getInteger(R.integer.magnification_default_scale));
            } else {
                disableMagnification();
            }
        } catch (Settings.SettingNotFoundException e) {
            disableMagnification();
        }
    }

    private void enableMagnification(float scale) {
        enableWindowMagnification(Display.DEFAULT_DISPLAY, scale, Float.NaN, Float.NaN);
    }

    private void disableMagnification() {
        disableWindowMagnification(Display.DEFAULT_DISPLAY);
    }

    @MainThread
+23 −3
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ import com.android.internal.util.IntPair;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;

@@ -1368,7 +1369,26 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        return relevantEventTypes;
    }

    private void updateMagnificationModeChangeSettingsLocked() {
    private void updateMagnificationModeChangeSettingsLocked(AccessibilityUserState userState) {
        if (userState.mUserId != mCurrentUserId) {
            return;
        }

        final boolean windowMagnificationEnabled = userState.isShortcutMagnificationEnabledLocked()
                && (userState.getMagnificationModeLocked()
                == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);

        if (windowMagnificationEnabled == getWindowMagnificationMgr().isConnected()) {
            return;
        }
        final long identity = Binder.clearCallingIdentity();
        try {
            final StatusBarManagerInternal service = LocalServices.getService(
                    StatusBarManagerInternal.class);
            service.requestWindowMagnificationConnection(windowMagnificationEnabled);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
        mMainHandler.sendMessage(obtainMessage(
                AccessibilityManagerService::notifyMagnificationModeChangeToInputFilter,
                this));
@@ -1766,7 +1786,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        scheduleUpdateClientsIfNeededLocked(userState);
        updateAccessibilityShortcutKeyTargetsLocked(userState);
        updateAccessibilityButtonTargetsLocked(userState);
        updateMagnificationModeChangeSettingsLocked();
        updateMagnificationModeChangeSettingsLocked(userState);
    }

    private void updateWindowsForAccessibilityCallbackLocked(AccessibilityUserState userState) {
@@ -3097,7 +3117,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    readUserRecommendedUiTimeoutSettingsLocked(userState);
                } else if (mMagnificationModeUri.equals(uri)) {
                    if (readMagnificationModeLocked(userState)) {
                        updateMagnificationModeChangeSettingsLocked();
                        updateMagnificationModeChangeSettingsLocked(userState);
                    }
                }
            }
+7 −0
Original line number Diff line number Diff line
@@ -107,6 +107,13 @@ public final class WindowMagnificationManager implements
        mUserId = userId;
    }

    /**
     *
     * @return {@code true} if {@link IWindowMagnificationConnection} is available
     */
    public boolean isConnected() {
        return mConnectionWrapper != null;
    }

    private void resetWindowMagnifiers() {
        synchronized (mLock) {
+9 −0
Original line number Diff line number Diff line
@@ -245,6 +245,15 @@ public class WindowMagnificationManagerTest {
        assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
    }

    @Test
    public void isConnected_returnExpectedValue() throws RemoteException {
        assertFalse(mWindowMagnificationManager.isConnected());

        mWindowMagnificationManager.setConnection(mMockConnection.getConnection());

        assertTrue(mWindowMagnificationManager.isConnected());
    }

    private MotionEvent generatePointersDownEvent(PointF[] pointersLocation) {
        final int len = pointersLocation.length;