Loading core/java/android/provider/Settings.java +18 −5 Original line number Diff line number Diff line Loading @@ -5605,22 +5605,34 @@ public final class Settings { "accessibility_web_content_key_bindings"; /** * Setting that specifies whether the display magnification is enabled. * Display magnifications allows the user to zoom in the display content * and is targeted to low vision users. The current magnification scale * is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * Setting that specifies whether the display magnification is enabled via a system-wide * triple tap gesture. Display magnifications allows the user to zoom in the display content * and is targeted to low vision users. The current magnification scale is controlled by * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled"; /** * Setting that specifies whether the display magnification is enabled via a shortcut * affordance within the system's navigation area. Display magnifications allows the user to * zoom in the display content and is targeted to low vision users. The current * magnification scale is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED = "accessibility_display_magnification_navbar_enabled"; /** * Setting that specifies what the display magnification scale is. * Display magnifications allows the user to zoom in the display * content and is targeted to low vision users. Whether a display * magnification is performed is controlled by * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED} * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED} and * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED} * * @hide */ Loading Loading @@ -6950,6 +6962,7 @@ public final class Settings { ACCESSIBILITY_DISPLAY_DALTONIZER, ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, ACCESSIBILITY_SCRIPT_INJECTION, ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, Loading core/java/android/view/WindowManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -167,6 +167,14 @@ public abstract class WindowManagerInternal { */ public abstract void setMagnificationSpec(MagnificationSpec spec); /** * Set by the accessibility framework to indicate whether the magnifiable regions of the display * should be shown. * * @param show {@code true} to show magnifiable region bounds, {@code false} to hide */ public abstract void setForceShowMagnifiableBounds(boolean show); /** * Obtains the magnification regions. * Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +32 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; Loading @@ -46,6 +47,7 @@ import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.telecom.TelecomManager; import android.text.TextUtils; Loading Loading @@ -104,6 +106,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private int mNavigationIconHints = 0; private int mNavigationBarMode; private AccessibilityManager mAccessibilityManager; private MagnificationContentObserver mMagnificationObserver; private int mDisabledFlags1; private StatusBar mStatusBar; Loading Loading @@ -135,6 +138,12 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mAccessibilityManager = getContext().getSystemService(AccessibilityManager.class); mAccessibilityManager.addAccessibilityServicesStateChangeListener( this::updateAccessibilityServicesState); mMagnificationObserver = new MagnificationContentObserver( getContext().getMainThreadHandler()); getContext().getContentResolver().registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED), false, mMagnificationObserver); if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); } Loading @@ -154,6 +163,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mCommandQueue.removeCallbacks(this); mAccessibilityManager.removeAccessibilityServicesStateChangeListener( this::updateAccessibilityServicesState); getContext().getContentResolver().unregisterContentObserver(mMagnificationObserver); try { WindowManagerGlobal.getWindowManagerService() .removeRotationWatcher(mRotationWatcher); Loading Loading @@ -387,6 +397,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton(); accessibilityButton.setOnClickListener(this::onAccessibilityClick); accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick); updateAccessibilityServicesState(); } private boolean onHomeTouch(View v, MotionEvent event) { Loading Loading @@ -550,10 +561,18 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } private void updateAccessibilityServicesState() { int requestingServices = 0; try { if (Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED) == 1) { requestingServices++; } } catch (Settings.SettingNotFoundException e) { } final List<AccessibilityServiceInfo> services = mAccessibilityManager.getEnabledAccessibilityServiceList( AccessibilityServiceInfo.FEEDBACK_ALL_MASK); int requestingServices = 0; for (int i = services.size() - 1; i >= 0; --i) { AccessibilityServiceInfo info = services.get(i); if ((info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0) { Loading Loading @@ -600,6 +619,18 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mNavigationBarView.getBarTransitions().finishAnimations(); } private class MagnificationContentObserver extends ContentObserver { public MagnificationContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { NavigationBarFragment.this.updateAccessibilityServicesState(); } } private final Stub mRotationWatcher = new Stub() { @Override public void onRotationChanged(int rotation) throws RemoteException { Loading services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +21 −5 Original line number Diff line number Diff line Loading @@ -77,9 +77,6 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo */ static final int FLAG_FEATURE_INJECT_MOTION_EVENTS = 0x00000010; static final int FEATURES_AFFECTING_MOTION_EVENTS = FLAG_FEATURE_INJECT_MOTION_EVENTS | FLAG_FEATURE_AUTOCLICK | FLAG_FEATURE_TOUCH_EXPLORATION | FLAG_FEATURE_SCREEN_MAGNIFIER; /** * Flag for enabling the feature to control the screen magnifier. If * {@link #FLAG_FEATURE_SCREEN_MAGNIFIER} is set this flag is ignored Loading @@ -90,6 +87,16 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo */ static final int FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER = 0x00000020; /** * Flag for enabling the feature to trigger the screen magnifier * from another on-device interaction. */ static final int FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER = 0x00000040; static final int FEATURES_AFFECTING_MOTION_EVENTS = FLAG_FEATURE_INJECT_MOTION_EVENTS | FLAG_FEATURE_AUTOCLICK | FLAG_FEATURE_TOUCH_EXPLORATION | FLAG_FEATURE_SCREEN_MAGNIFIER | FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER; private final Runnable mProcessBatchedEventsRunnable = new Runnable() { @Override public void run() { Loading Loading @@ -379,6 +386,12 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } } void notifyAccessibilityButtonClicked() { if (mMagnificationGestureHandler != null) { mMagnificationGestureHandler.notifyShortcutTriggered(); } } private void enableFeatures() { resetStreamState(); Loading @@ -393,11 +406,14 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } if ((mEnabledFeatures & FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER) != 0 || (mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0) { || ((mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0) || ((mEnabledFeatures & FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER) != 0)) { final boolean detectControlGestures = (mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0; final boolean triggerable = (mEnabledFeatures & FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER) != 0; mMagnificationGestureHandler = new MagnificationGestureHandler( mContext, mAms, detectControlGestures); mContext, mAms, detectControlGestures, triggerable); addFirstEventHandler(mMagnificationGestureHandler); } Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +47 −12 Original line number Diff line number Diff line Loading @@ -781,6 +781,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mIsTouchExplorationEnabled = false; userState.mIsEnhancedWebAccessibilityEnabled = false; userState.mIsDisplayMagnificationEnabled = false; userState.mIsNavBarMagnificationEnabled = false; userState.mIsAutoclickEnabled = false; userState.mEnabledServices.clear(); } Loading Loading @@ -831,6 +832,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mIsTouchExplorationEnabled = touchExplorationEnabled; userState.mIsEnhancedWebAccessibilityEnabled = false; userState.mIsDisplayMagnificationEnabled = false; userState.mIsNavBarMagnificationEnabled = false; userState.mIsAutoclickEnabled = false; userState.mEnabledServices.clear(); userState.mEnabledServices.add(service); Loading Loading @@ -1152,6 +1154,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private void notifyAccessibilityButtonClickedLocked() { final UserState state = getCurrentUserStateLocked(); if (state.mIsNavBarMagnificationEnabled) { mMainHandler.obtainMessage( MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget(); } else { for (int i = state.mBoundServices.size() - 1; i >= 0; i--) { final Service service = state.mBoundServices.get(i); // TODO(b/34720082): Only notify a single user-defined service Loading @@ -1160,6 +1166,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } } } private void notifyAccessibilityButtonAvailabilityChangedLocked(boolean available) { final UserState state = getCurrentUserStateLocked(); Loading Loading @@ -1548,6 +1555,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (userState.mIsDisplayMagnificationEnabled) { flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER; } if (userState.mIsNavBarMagnificationEnabled) { flags |= AccessibilityInputFilter.FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER; } if (userHasMagnificationServicesLocked(userState)) { flags |= AccessibilityInputFilter.FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER; } Loading Loading @@ -1781,7 +1791,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { somethingChanged |= readTouchExplorationEnabledSettingLocked(userState); somethingChanged |= readHighTextContrastEnabledSettingLocked(userState); somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState); somethingChanged |= readDisplayMagnificationEnabledSettingLocked(userState); somethingChanged |= readMagnificationEnabledSettingsLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readAccessibilityShortcutSettingLocked(userState); return somethingChanged; Loading Loading @@ -1810,13 +1820,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private boolean readDisplayMagnificationEnabledSettingLocked(UserState userState) { private boolean readMagnificationEnabledSettingsLocked(UserState userState) { final boolean displayMagnificationEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0, userState.mUserId) == 1; if (displayMagnificationEnabled != userState.mIsDisplayMagnificationEnabled) { final boolean navBarMagnificationEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 0, userState.mUserId) == 1; if ((displayMagnificationEnabled != userState.mIsDisplayMagnificationEnabled) || (navBarMagnificationEnabled != userState.mIsNavBarMagnificationEnabled)) { userState.mIsDisplayMagnificationEnabled = displayMagnificationEnabled; userState.mIsNavBarMagnificationEnabled = navBarMagnificationEnabled; return true; } return false; Loading Loading @@ -2018,8 +2034,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return; } if (userState.mIsDisplayMagnificationEnabled || userHasListeningMagnificationServicesLocked(userState)) { if (userState.mIsDisplayMagnificationEnabled || userState.mIsNavBarMagnificationEnabled || userHasListeningMagnificationServicesLocked(userState)) { // Initialize the magnification controller if necessary getMagnificationController(); mMagnificationController.register(); Loading Loading @@ -2241,6 +2257,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { pw.append(", touchExplorationEnabled=" + userState.mIsTouchExplorationEnabled); pw.append(", displayMagnificationEnabled=" + userState.mIsDisplayMagnificationEnabled); pw.append(", navBarMagnificationEnabled=" + userState.mIsNavBarMagnificationEnabled); pw.append(", autoclickEnabled=" + userState.mIsAutoclickEnabled); if (userState.mUiAutomationService != null) { pw.append(", "); Loading Loading @@ -2320,6 +2338,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public static final int MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS = 10; public static final int MSG_UPDATE_FINGERPRINT = 11; public static final int MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS = 12; public static final int MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER = 13; public MainHandler(Looper looper) { super(looper); Loading Loading @@ -2406,6 +2425,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } }); } break; case MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER: { synchronized (mLock) { if (mHasInputFilter && mInputFilter != null) { mInputFilter.notifyAccessibilityButtonClicked(); } } } } } Loading Loading @@ -4788,6 +4815,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public boolean mIsTextHighContrastEnabled; public boolean mIsEnhancedWebAccessibilityEnabled; public boolean mIsDisplayMagnificationEnabled; public boolean mIsNavBarMagnificationEnabled; public boolean mIsAutoclickEnabled; public boolean mIsPerformGesturesEnabled; public boolean mIsFilterKeyEventsEnabled; Loading Loading @@ -4856,6 +4884,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mIsTouchExplorationEnabled = false; mIsEnhancedWebAccessibilityEnabled = false; mIsDisplayMagnificationEnabled = false; mIsNavBarMagnificationEnabled = false; mIsAutoclickEnabled = false; mSoftKeyboardShowMode = 0; Loading Loading @@ -4888,6 +4917,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final Uri mDisplayMagnificationEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED); private final Uri mNavBarMagnificationEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED); private final Uri mAutoclickEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED); Loading Loading @@ -4927,6 +4959,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mDisplayMagnificationEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mNavBarMagnificationEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mAutoclickEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mEnabledAccessibilityServicesUri, Loading Loading @@ -4966,8 +5000,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (readTouchExplorationEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mDisplayMagnificationEnabledUri.equals(uri)) { if (readDisplayMagnificationEnabledSettingLocked(userState)) { } else if (mDisplayMagnificationEnabledUri.equals(uri) || mNavBarMagnificationEnabledUri.equals(uri)) { if (readMagnificationEnabledSettingsLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAutoclickEnabledUri.equals(uri)) { Loading Loading
core/java/android/provider/Settings.java +18 −5 Original line number Diff line number Diff line Loading @@ -5605,22 +5605,34 @@ public final class Settings { "accessibility_web_content_key_bindings"; /** * Setting that specifies whether the display magnification is enabled. * Display magnifications allows the user to zoom in the display content * and is targeted to low vision users. The current magnification scale * is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * Setting that specifies whether the display magnification is enabled via a system-wide * triple tap gesture. Display magnifications allows the user to zoom in the display content * and is targeted to low vision users. The current magnification scale is controlled by * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled"; /** * Setting that specifies whether the display magnification is enabled via a shortcut * affordance within the system's navigation area. Display magnifications allows the user to * zoom in the display content and is targeted to low vision users. The current * magnification scale is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. * * @hide */ public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED = "accessibility_display_magnification_navbar_enabled"; /** * Setting that specifies what the display magnification scale is. * Display magnifications allows the user to zoom in the display * content and is targeted to low vision users. Whether a display * magnification is performed is controlled by * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED} * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED} and * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED} * * @hide */ Loading Loading @@ -6950,6 +6962,7 @@ public final class Settings { ACCESSIBILITY_DISPLAY_DALTONIZER, ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, ACCESSIBILITY_SCRIPT_INJECTION, ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, Loading
core/java/android/view/WindowManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -167,6 +167,14 @@ public abstract class WindowManagerInternal { */ public abstract void setMagnificationSpec(MagnificationSpec spec); /** * Set by the accessibility framework to indicate whether the magnifiable regions of the display * should be shown. * * @param show {@code true} to show magnifiable region bounds, {@code false} to hide */ public abstract void setForceShowMagnifiableBounds(boolean show); /** * Obtains the magnification regions. * Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +32 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; Loading @@ -46,6 +47,7 @@ import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.telecom.TelecomManager; import android.text.TextUtils; Loading Loading @@ -104,6 +106,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private int mNavigationIconHints = 0; private int mNavigationBarMode; private AccessibilityManager mAccessibilityManager; private MagnificationContentObserver mMagnificationObserver; private int mDisabledFlags1; private StatusBar mStatusBar; Loading Loading @@ -135,6 +138,12 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mAccessibilityManager = getContext().getSystemService(AccessibilityManager.class); mAccessibilityManager.addAccessibilityServicesStateChangeListener( this::updateAccessibilityServicesState); mMagnificationObserver = new MagnificationContentObserver( getContext().getMainThreadHandler()); getContext().getContentResolver().registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED), false, mMagnificationObserver); if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); } Loading @@ -154,6 +163,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mCommandQueue.removeCallbacks(this); mAccessibilityManager.removeAccessibilityServicesStateChangeListener( this::updateAccessibilityServicesState); getContext().getContentResolver().unregisterContentObserver(mMagnificationObserver); try { WindowManagerGlobal.getWindowManagerService() .removeRotationWatcher(mRotationWatcher); Loading Loading @@ -387,6 +397,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton(); accessibilityButton.setOnClickListener(this::onAccessibilityClick); accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick); updateAccessibilityServicesState(); } private boolean onHomeTouch(View v, MotionEvent event) { Loading Loading @@ -550,10 +561,18 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } private void updateAccessibilityServicesState() { int requestingServices = 0; try { if (Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED) == 1) { requestingServices++; } } catch (Settings.SettingNotFoundException e) { } final List<AccessibilityServiceInfo> services = mAccessibilityManager.getEnabledAccessibilityServiceList( AccessibilityServiceInfo.FEEDBACK_ALL_MASK); int requestingServices = 0; for (int i = services.size() - 1; i >= 0; --i) { AccessibilityServiceInfo info = services.get(i); if ((info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0) { Loading Loading @@ -600,6 +619,18 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mNavigationBarView.getBarTransitions().finishAnimations(); } private class MagnificationContentObserver extends ContentObserver { public MagnificationContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { NavigationBarFragment.this.updateAccessibilityServicesState(); } } private final Stub mRotationWatcher = new Stub() { @Override public void onRotationChanged(int rotation) throws RemoteException { Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +21 −5 Original line number Diff line number Diff line Loading @@ -77,9 +77,6 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo */ static final int FLAG_FEATURE_INJECT_MOTION_EVENTS = 0x00000010; static final int FEATURES_AFFECTING_MOTION_EVENTS = FLAG_FEATURE_INJECT_MOTION_EVENTS | FLAG_FEATURE_AUTOCLICK | FLAG_FEATURE_TOUCH_EXPLORATION | FLAG_FEATURE_SCREEN_MAGNIFIER; /** * Flag for enabling the feature to control the screen magnifier. If * {@link #FLAG_FEATURE_SCREEN_MAGNIFIER} is set this flag is ignored Loading @@ -90,6 +87,16 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo */ static final int FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER = 0x00000020; /** * Flag for enabling the feature to trigger the screen magnifier * from another on-device interaction. */ static final int FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER = 0x00000040; static final int FEATURES_AFFECTING_MOTION_EVENTS = FLAG_FEATURE_INJECT_MOTION_EVENTS | FLAG_FEATURE_AUTOCLICK | FLAG_FEATURE_TOUCH_EXPLORATION | FLAG_FEATURE_SCREEN_MAGNIFIER | FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER; private final Runnable mProcessBatchedEventsRunnable = new Runnable() { @Override public void run() { Loading Loading @@ -379,6 +386,12 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } } void notifyAccessibilityButtonClicked() { if (mMagnificationGestureHandler != null) { mMagnificationGestureHandler.notifyShortcutTriggered(); } } private void enableFeatures() { resetStreamState(); Loading @@ -393,11 +406,14 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } if ((mEnabledFeatures & FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER) != 0 || (mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0) { || ((mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0) || ((mEnabledFeatures & FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER) != 0)) { final boolean detectControlGestures = (mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0; final boolean triggerable = (mEnabledFeatures & FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER) != 0; mMagnificationGestureHandler = new MagnificationGestureHandler( mContext, mAms, detectControlGestures); mContext, mAms, detectControlGestures, triggerable); addFirstEventHandler(mMagnificationGestureHandler); } Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +47 −12 Original line number Diff line number Diff line Loading @@ -781,6 +781,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mIsTouchExplorationEnabled = false; userState.mIsEnhancedWebAccessibilityEnabled = false; userState.mIsDisplayMagnificationEnabled = false; userState.mIsNavBarMagnificationEnabled = false; userState.mIsAutoclickEnabled = false; userState.mEnabledServices.clear(); } Loading Loading @@ -831,6 +832,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mIsTouchExplorationEnabled = touchExplorationEnabled; userState.mIsEnhancedWebAccessibilityEnabled = false; userState.mIsDisplayMagnificationEnabled = false; userState.mIsNavBarMagnificationEnabled = false; userState.mIsAutoclickEnabled = false; userState.mEnabledServices.clear(); userState.mEnabledServices.add(service); Loading Loading @@ -1152,6 +1154,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private void notifyAccessibilityButtonClickedLocked() { final UserState state = getCurrentUserStateLocked(); if (state.mIsNavBarMagnificationEnabled) { mMainHandler.obtainMessage( MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget(); } else { for (int i = state.mBoundServices.size() - 1; i >= 0; i--) { final Service service = state.mBoundServices.get(i); // TODO(b/34720082): Only notify a single user-defined service Loading @@ -1160,6 +1166,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } } } private void notifyAccessibilityButtonAvailabilityChangedLocked(boolean available) { final UserState state = getCurrentUserStateLocked(); Loading Loading @@ -1548,6 +1555,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (userState.mIsDisplayMagnificationEnabled) { flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER; } if (userState.mIsNavBarMagnificationEnabled) { flags |= AccessibilityInputFilter.FLAG_FEATURE_TRIGGERED_SCREEN_MAGNIFIER; } if (userHasMagnificationServicesLocked(userState)) { flags |= AccessibilityInputFilter.FLAG_FEATURE_CONTROL_SCREEN_MAGNIFIER; } Loading Loading @@ -1781,7 +1791,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { somethingChanged |= readTouchExplorationEnabledSettingLocked(userState); somethingChanged |= readHighTextContrastEnabledSettingLocked(userState); somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState); somethingChanged |= readDisplayMagnificationEnabledSettingLocked(userState); somethingChanged |= readMagnificationEnabledSettingsLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readAccessibilityShortcutSettingLocked(userState); return somethingChanged; Loading Loading @@ -1810,13 +1820,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } private boolean readDisplayMagnificationEnabledSettingLocked(UserState userState) { private boolean readMagnificationEnabledSettingsLocked(UserState userState) { final boolean displayMagnificationEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0, userState.mUserId) == 1; if (displayMagnificationEnabled != userState.mIsDisplayMagnificationEnabled) { final boolean navBarMagnificationEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 0, userState.mUserId) == 1; if ((displayMagnificationEnabled != userState.mIsDisplayMagnificationEnabled) || (navBarMagnificationEnabled != userState.mIsNavBarMagnificationEnabled)) { userState.mIsDisplayMagnificationEnabled = displayMagnificationEnabled; userState.mIsNavBarMagnificationEnabled = navBarMagnificationEnabled; return true; } return false; Loading Loading @@ -2018,8 +2034,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return; } if (userState.mIsDisplayMagnificationEnabled || userHasListeningMagnificationServicesLocked(userState)) { if (userState.mIsDisplayMagnificationEnabled || userState.mIsNavBarMagnificationEnabled || userHasListeningMagnificationServicesLocked(userState)) { // Initialize the magnification controller if necessary getMagnificationController(); mMagnificationController.register(); Loading Loading @@ -2241,6 +2257,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { pw.append(", touchExplorationEnabled=" + userState.mIsTouchExplorationEnabled); pw.append(", displayMagnificationEnabled=" + userState.mIsDisplayMagnificationEnabled); pw.append(", navBarMagnificationEnabled=" + userState.mIsNavBarMagnificationEnabled); pw.append(", autoclickEnabled=" + userState.mIsAutoclickEnabled); if (userState.mUiAutomationService != null) { pw.append(", "); Loading Loading @@ -2320,6 +2338,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public static final int MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS = 10; public static final int MSG_UPDATE_FINGERPRINT = 11; public static final int MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS = 12; public static final int MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER = 13; public MainHandler(Looper looper) { super(looper); Loading Loading @@ -2406,6 +2425,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } }); } break; case MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER: { synchronized (mLock) { if (mHasInputFilter && mInputFilter != null) { mInputFilter.notifyAccessibilityButtonClicked(); } } } } } Loading Loading @@ -4788,6 +4815,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public boolean mIsTextHighContrastEnabled; public boolean mIsEnhancedWebAccessibilityEnabled; public boolean mIsDisplayMagnificationEnabled; public boolean mIsNavBarMagnificationEnabled; public boolean mIsAutoclickEnabled; public boolean mIsPerformGesturesEnabled; public boolean mIsFilterKeyEventsEnabled; Loading Loading @@ -4856,6 +4884,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mIsTouchExplorationEnabled = false; mIsEnhancedWebAccessibilityEnabled = false; mIsDisplayMagnificationEnabled = false; mIsNavBarMagnificationEnabled = false; mIsAutoclickEnabled = false; mSoftKeyboardShowMode = 0; Loading Loading @@ -4888,6 +4917,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final Uri mDisplayMagnificationEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED); private final Uri mNavBarMagnificationEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED); private final Uri mAutoclickEnabledUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED); Loading Loading @@ -4927,6 +4959,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mDisplayMagnificationEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mNavBarMagnificationEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mAutoclickEnabledUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver(mEnabledAccessibilityServicesUri, Loading Loading @@ -4966,8 +5000,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (readTouchExplorationEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mDisplayMagnificationEnabledUri.equals(uri)) { if (readDisplayMagnificationEnabledSettingLocked(userState)) { } else if (mDisplayMagnificationEnabledUri.equals(uri) || mNavBarMagnificationEnabledUri.equals(uri)) { if (readMagnificationEnabledSettingsLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAutoclickEnabledUri.equals(uri)) { Loading