Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -51155,6 +51155,7 @@ package android.view.accessibility { method public int getRecommendedTimeoutMillis(int, int); method public void interrupt(); method public static boolean isAccessibilityButtonSupported(); method public boolean isAudioDescriptionRequested(); method public boolean isEnabled(); method public boolean isTouchExplorationEnabled(); method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer); core/java/android/view/accessibility/AccessibilityManager.java +31 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,8 @@ public final class AccessibilityManager { public static final int STATE_FLAG_TRACE_A11Y_INTERACTION_CLIENT_ENABLED = 0x00000400; /** @hide */ public static final int STATE_FLAG_TRACE_A11Y_SERVICE_ENABLED = 0x00000800; /** @hide */ public static final int STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED = 0x00001000; /** @hide */ public static final int DALTONIZER_DISABLED = -1; Loading Loading @@ -244,6 +246,8 @@ public final class AccessibilityManager { @UnsupportedAppUsage(trackingBug = 123768939L) boolean mIsHighTextContrastEnabled; boolean mIsAudioDescriptionByDefaultRequested; // accessibility tracing state int mAccessibilityTracingState = 0; Loading Loading @@ -1293,15 +1297,19 @@ public final class AccessibilityManager { (stateFlags & STATE_FLAG_TOUCH_EXPLORATION_ENABLED) != 0; final boolean highTextContrastEnabled = (stateFlags & STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED) != 0; final boolean audioDescriptionEnabled = (stateFlags & STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED) != 0; final boolean wasEnabled = isEnabled(); final boolean wasTouchExplorationEnabled = mIsTouchExplorationEnabled; final boolean wasHighTextContrastEnabled = mIsHighTextContrastEnabled; // Ensure listeners get current state from isZzzEnabled() calls. mIsEnabled = enabled; mIsTouchExplorationEnabled = touchExplorationEnabled; mIsHighTextContrastEnabled = highTextContrastEnabled; mIsAudioDescriptionByDefaultRequested = audioDescriptionEnabled; if (wasEnabled != isEnabled()) { notifyAccessibilityStateChanged(); Loading Loading @@ -1678,6 +1686,29 @@ public final class AccessibilityManager { } } /** * Determines if users want to select sound track with audio description by default. * * Audio description, also referred to as a video description, described video, or * more precisely called a visual description, is a form of narration used to provide * information surrounding key visual elements in a media work for the benefit of * blind and visually impaired consumers. * * The method provides the preference value to content provider apps to select the * default sound track during playing a video or movie. * * @return {@code true} if the audio description is enabled, {@code false} otherwise. */ public boolean isAudioDescriptionRequested() { synchronized (mLock) { IAccessibilityManager service = getServiceLocked(); if (service == null) { return false; } return mIsAudioDescriptionByDefaultRequested; } } private IAccessibilityManager getServiceLocked() { if (mService == null) { tryConnectToServiceLocked(null); Loading core/java/android/view/accessibility/IAccessibilityManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -98,4 +98,6 @@ interface IAccessibilityManager { int getFocusStrokeWidth(); int getFocusColor(); boolean isAudioDescriptionByDefaultEnabled(); } services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +40 −0 Original line number Diff line number Diff line Loading @@ -2382,6 +2382,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub somethingChanged |= readTouchExplorationGrantedAccessibilityServicesLocked(userState); somethingChanged |= readTouchExplorationEnabledSettingLocked(userState); somethingChanged |= readHighTextContrastEnabledSettingLocked(userState); somethingChanged |= readAudioDescriptionEnabledSettingLocked(userState); somethingChanged |= readMagnificationEnabledSettingsLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readAccessibilityShortcutKeySettingLocked(userState); Loading Loading @@ -2454,6 +2455,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return false; } private boolean readAudioDescriptionEnabledSettingLocked(AccessibilityUserState userState) { final boolean audioDescriptionByDefaultEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT, 0, userState.mUserId) == 1; if (audioDescriptionByDefaultEnabled != userState.isAudioDescriptionByDefaultEnabledLocked()) { userState.setAudioDescriptionByDefaultEnabledLocked(audioDescriptionByDefaultEnabled); return true; } return false; } private void updateTouchExplorationLocked(AccessibilityUserState userState) { boolean touchExplorationEnabled = mUiAutomationManager.isTouchExplorationEnabledLocked(); boolean serviceHandlesDoubleTapEnabled = false; Loading Loading @@ -3418,6 +3432,23 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } /** * Gets the status of the audio description preference. * @return {@code true} if the audio description is enabled, {@code false} otherwise. */ @Override public boolean isAudioDescriptionByDefaultEnabled() { if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) { mTraceManager.logTrace(LOG_TAG + ".isAudioDescriptionByDefaultEnabled", FLAGS_ACCESSIBILITY_MANAGER); } synchronized (mLock) { final AccessibilityUserState userState = getCurrentUserStateLocked(); return userState.isAudioDescriptionByDefaultEnabledLocked(); } } @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; Loading Loading @@ -3805,6 +3836,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private final Uri mHighTextContrastUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED); private final Uri mAudioDescriptionByDefaultUri = Settings.Secure.getUriFor( Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT); private final Uri mAccessibilitySoftKeyboardModeUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE); Loading Loading @@ -3850,6 +3884,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mHighTextContrastUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mAudioDescriptionByDefaultUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mAccessibilitySoftKeyboardModeUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( Loading Loading @@ -3904,6 +3940,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (readHighTextContrastEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAudioDescriptionByDefaultUri.equals(uri)) { if (readAudioDescriptionEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAccessibilitySoftKeyboardModeUri.equals(uri) || mShowImeWithHardKeyboardUri.equals(uri)) { userState.reconcileSoftKeyboardModeWithSettingsLocked(); Loading services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +15 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ class AccessibilityUserState { private String mTargetAssignedToAccessibilityButton; private boolean mBindInstantServiceAllowed; private boolean mIsAudioDescriptionByDefaultRequested; private boolean mIsAutoclickEnabled; private boolean mIsDisplayMagnificationEnabled; private boolean mIsFilterKeyEventsEnabled; Loading Loading @@ -411,6 +412,10 @@ class AccessibilityUserState { if (mIsTextHighContrastEnabled) { clientState |= AccessibilityManager.STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED; } if (mIsAudioDescriptionByDefaultRequested) { clientState |= AccessibilityManager.STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED; } clientState |= traceClientState; Loading Loading @@ -506,6 +511,8 @@ class AccessibilityUserState { pw.append(", magnificationModes=").append(String.valueOf(mMagnificationModes)); pw.append(", magnificationCapabilities=") .append(String.valueOf(mMagnificationCapabilities)); pw.append(", audioDescriptionByDefaultEnabled=") .append(String.valueOf(mIsAudioDescriptionByDefaultRequested)); pw.append("}"); pw.println(); pw.append(" shortcut key:{"); Loading Loading @@ -824,6 +831,14 @@ class AccessibilityUserState { mIsTextHighContrastEnabled = enabled; } public boolean isAudioDescriptionByDefaultEnabledLocked() { return mIsAudioDescriptionByDefaultRequested; } public void setAudioDescriptionByDefaultEnabledLocked(boolean enabled) { mIsAudioDescriptionByDefaultRequested = enabled; } public boolean isTouchExplorationEnabledLocked() { return mIsTouchExplorationEnabled; } Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -51155,6 +51155,7 @@ package android.view.accessibility { method public int getRecommendedTimeoutMillis(int, int); method public void interrupt(); method public static boolean isAccessibilityButtonSupported(); method public boolean isAudioDescriptionRequested(); method public boolean isEnabled(); method public boolean isTouchExplorationEnabled(); method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
core/java/android/view/accessibility/AccessibilityManager.java +31 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,8 @@ public final class AccessibilityManager { public static final int STATE_FLAG_TRACE_A11Y_INTERACTION_CLIENT_ENABLED = 0x00000400; /** @hide */ public static final int STATE_FLAG_TRACE_A11Y_SERVICE_ENABLED = 0x00000800; /** @hide */ public static final int STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED = 0x00001000; /** @hide */ public static final int DALTONIZER_DISABLED = -1; Loading Loading @@ -244,6 +246,8 @@ public final class AccessibilityManager { @UnsupportedAppUsage(trackingBug = 123768939L) boolean mIsHighTextContrastEnabled; boolean mIsAudioDescriptionByDefaultRequested; // accessibility tracing state int mAccessibilityTracingState = 0; Loading Loading @@ -1293,15 +1297,19 @@ public final class AccessibilityManager { (stateFlags & STATE_FLAG_TOUCH_EXPLORATION_ENABLED) != 0; final boolean highTextContrastEnabled = (stateFlags & STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED) != 0; final boolean audioDescriptionEnabled = (stateFlags & STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED) != 0; final boolean wasEnabled = isEnabled(); final boolean wasTouchExplorationEnabled = mIsTouchExplorationEnabled; final boolean wasHighTextContrastEnabled = mIsHighTextContrastEnabled; // Ensure listeners get current state from isZzzEnabled() calls. mIsEnabled = enabled; mIsTouchExplorationEnabled = touchExplorationEnabled; mIsHighTextContrastEnabled = highTextContrastEnabled; mIsAudioDescriptionByDefaultRequested = audioDescriptionEnabled; if (wasEnabled != isEnabled()) { notifyAccessibilityStateChanged(); Loading Loading @@ -1678,6 +1686,29 @@ public final class AccessibilityManager { } } /** * Determines if users want to select sound track with audio description by default. * * Audio description, also referred to as a video description, described video, or * more precisely called a visual description, is a form of narration used to provide * information surrounding key visual elements in a media work for the benefit of * blind and visually impaired consumers. * * The method provides the preference value to content provider apps to select the * default sound track during playing a video or movie. * * @return {@code true} if the audio description is enabled, {@code false} otherwise. */ public boolean isAudioDescriptionRequested() { synchronized (mLock) { IAccessibilityManager service = getServiceLocked(); if (service == null) { return false; } return mIsAudioDescriptionByDefaultRequested; } } private IAccessibilityManager getServiceLocked() { if (mService == null) { tryConnectToServiceLocked(null); Loading
core/java/android/view/accessibility/IAccessibilityManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -98,4 +98,6 @@ interface IAccessibilityManager { int getFocusStrokeWidth(); int getFocusColor(); boolean isAudioDescriptionByDefaultEnabled(); }
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +40 −0 Original line number Diff line number Diff line Loading @@ -2382,6 +2382,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub somethingChanged |= readTouchExplorationGrantedAccessibilityServicesLocked(userState); somethingChanged |= readTouchExplorationEnabledSettingLocked(userState); somethingChanged |= readHighTextContrastEnabledSettingLocked(userState); somethingChanged |= readAudioDescriptionEnabledSettingLocked(userState); somethingChanged |= readMagnificationEnabledSettingsLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); somethingChanged |= readAccessibilityShortcutKeySettingLocked(userState); Loading Loading @@ -2454,6 +2455,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return false; } private boolean readAudioDescriptionEnabledSettingLocked(AccessibilityUserState userState) { final boolean audioDescriptionByDefaultEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT, 0, userState.mUserId) == 1; if (audioDescriptionByDefaultEnabled != userState.isAudioDescriptionByDefaultEnabledLocked()) { userState.setAudioDescriptionByDefaultEnabledLocked(audioDescriptionByDefaultEnabled); return true; } return false; } private void updateTouchExplorationLocked(AccessibilityUserState userState) { boolean touchExplorationEnabled = mUiAutomationManager.isTouchExplorationEnabledLocked(); boolean serviceHandlesDoubleTapEnabled = false; Loading Loading @@ -3418,6 +3432,23 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } /** * Gets the status of the audio description preference. * @return {@code true} if the audio description is enabled, {@code false} otherwise. */ @Override public boolean isAudioDescriptionByDefaultEnabled() { if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) { mTraceManager.logTrace(LOG_TAG + ".isAudioDescriptionByDefaultEnabled", FLAGS_ACCESSIBILITY_MANAGER); } synchronized (mLock) { final AccessibilityUserState userState = getCurrentUserStateLocked(); return userState.isAudioDescriptionByDefaultEnabledLocked(); } } @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; Loading Loading @@ -3805,6 +3836,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private final Uri mHighTextContrastUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED); private final Uri mAudioDescriptionByDefaultUri = Settings.Secure.getUriFor( Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT); private final Uri mAccessibilitySoftKeyboardModeUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE); Loading Loading @@ -3850,6 +3884,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mHighTextContrastUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mAudioDescriptionByDefaultUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mAccessibilitySoftKeyboardModeUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( Loading Loading @@ -3904,6 +3940,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (readHighTextContrastEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAudioDescriptionByDefaultUri.equals(uri)) { if (readAudioDescriptionEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); } } else if (mAccessibilitySoftKeyboardModeUri.equals(uri) || mShowImeWithHardKeyboardUri.equals(uri)) { userState.reconcileSoftKeyboardModeWithSettingsLocked(); Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +15 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ class AccessibilityUserState { private String mTargetAssignedToAccessibilityButton; private boolean mBindInstantServiceAllowed; private boolean mIsAudioDescriptionByDefaultRequested; private boolean mIsAutoclickEnabled; private boolean mIsDisplayMagnificationEnabled; private boolean mIsFilterKeyEventsEnabled; Loading Loading @@ -411,6 +412,10 @@ class AccessibilityUserState { if (mIsTextHighContrastEnabled) { clientState |= AccessibilityManager.STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED; } if (mIsAudioDescriptionByDefaultRequested) { clientState |= AccessibilityManager.STATE_FLAG_AUDIO_DESCRIPTION_BY_DEFAULT_ENABLED; } clientState |= traceClientState; Loading Loading @@ -506,6 +511,8 @@ class AccessibilityUserState { pw.append(", magnificationModes=").append(String.valueOf(mMagnificationModes)); pw.append(", magnificationCapabilities=") .append(String.valueOf(mMagnificationCapabilities)); pw.append(", audioDescriptionByDefaultEnabled=") .append(String.valueOf(mIsAudioDescriptionByDefaultRequested)); pw.append("}"); pw.println(); pw.append(" shortcut key:{"); Loading Loading @@ -824,6 +831,14 @@ class AccessibilityUserState { mIsTextHighContrastEnabled = enabled; } public boolean isAudioDescriptionByDefaultEnabledLocked() { return mIsAudioDescriptionByDefaultRequested; } public void setAudioDescriptionByDefaultEnabledLocked(boolean enabled) { mIsAudioDescriptionByDefaultRequested = enabled; } public boolean isTouchExplorationEnabledLocked() { return mIsTouchExplorationEnabled; } Loading