Loading packages/SystemUI/res/drawable/ic_volume_accessibility.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <!-- Copyright (C) 2017 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="32dp" android:height="32dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:fillColor="#FFFFFFFF" android:pathData="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1s-5.89,-0.3 -8.5,-1L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1l-0.5,-2zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/> </vector> No newline at end of file packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +32 −4 Original line number Diff line number Diff line Loading @@ -127,6 +127,7 @@ public class VolumeDialog implements TunerService.Tunable { private boolean mShowing; private boolean mExpanded; private boolean mShowA11yStream; private int mActiveStream; private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE; Loading Loading @@ -244,7 +245,6 @@ public class VolumeDialog implements TunerService.Tunable { if (!AudioSystem.isSingleVolume(mContext)) { addRow(AudioManager.STREAM_RING, R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true); addRow(AudioManager.STREAM_ALARM, R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, false); addRow(AudioManager.STREAM_VOICE_CALL, Loading @@ -253,6 +253,8 @@ public class VolumeDialog implements TunerService.Tunable { R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false); addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false); addRow(AudioManager.STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility, R.drawable.ic_volume_accessibility, true); } } else { addExistingRows(); Loading Loading @@ -307,11 +309,25 @@ public class VolumeDialog implements TunerService.Tunable { } private void addRow(int stream, int iconRes, int iconMuteRes, boolean important) { addRow(stream, iconRes, iconMuteRes, important, false); } private void addRow(int stream, int iconRes, int iconMuteRes, boolean important, boolean dynamic) { VolumeRow row = new VolumeRow(); initRow(row, stream, iconRes, iconMuteRes, important); int rowSize; int viewSize; if (mShowA11yStream && dynamic && (rowSize = mRows.size()) > 1 && (viewSize = mDialogRowsView.getChildCount()) > 1) { // A11y Stream should be the last in the list mDialogRowsView.addView(row.view, viewSize - 2); mRows.add(rowSize - 2, row); } else { mDialogRowsView.addView(row.view); mRows.add(row); } } private void addExistingRows() { int N = mRows.size(); Loading Loading @@ -592,6 +608,9 @@ public class VolumeDialog implements TunerService.Tunable { } private boolean shouldBeVisibleH(VolumeRow row, boolean isActive) { if (row.stream == AudioSystem.STREAM_ACCESSIBILITY) { return mShowA11yStream; } return mExpanded && row.view.getVisibility() == View.VISIBLE || (mExpanded && (row.important || isActive)) || !mExpanded && isActive; Loading Loading @@ -644,7 +663,8 @@ public class VolumeDialog implements TunerService.Tunable { if (!ss.dynamic) continue; mDynamic.put(stream, true); if (findRow(stream) == null) { addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true); addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true, true); } } Loading Loading @@ -1009,6 +1029,14 @@ public class VolumeDialog implements TunerService.Tunable { public void onShowSafetyWarning(int flags) { showSafetyWarningH(flags); } @Override public void onAccessibilityModeChanged(Boolean showA11yStream) { boolean show = showA11yStream == null ? false : showA11yStream; mShowA11yStream = show; updateRowsH(getActiveRow()); } }; private final ZenModePanel.Callback mZenPanelCallback = new ZenModePanel.Callback() { Loading packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java +27 −1 Original line number Diff line number Diff line Loading @@ -75,13 +75,13 @@ public class VolumeDialogController { STREAMS.put(AudioSystem.STREAM_BLUETOOTH_SCO, R.string.stream_bluetooth_sco); STREAMS.put(AudioSystem.STREAM_DTMF, R.string.stream_dtmf); STREAMS.put(AudioSystem.STREAM_MUSIC, R.string.stream_music); STREAMS.put(AudioSystem.STREAM_ACCESSIBILITY, R.string.stream_accessibility); STREAMS.put(AudioSystem.STREAM_NOTIFICATION, R.string.stream_notification); STREAMS.put(AudioSystem.STREAM_RING, R.string.stream_ring); STREAMS.put(AudioSystem.STREAM_SYSTEM, R.string.stream_system); STREAMS.put(AudioSystem.STREAM_SYSTEM_ENFORCED, R.string.stream_system_enforced); STREAMS.put(AudioSystem.STREAM_TTS, R.string.stream_tts); STREAMS.put(AudioSystem.STREAM_VOICE_CALL, R.string.stream_voice_call); STREAMS.put(AudioSystem.STREAM_ACCESSIBILITY, R.string.stream_accessibility); } private final HandlerThread mWorkerThread; Loading @@ -98,6 +98,7 @@ public class VolumeDialogController { private final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks(); private final Vibrator mVibrator; private final boolean mHasVibrator; private boolean mShowA11yStream; private boolean mDestroyed; private VolumePolicy mVolumePolicy; Loading Loading @@ -204,6 +205,7 @@ public class VolumeDialogController { pw.print(" mHasVibrator: "); pw.println(mHasVibrator); pw.print(" mRemoteStreams: "); pw.println(mMediaSessionsCallbacksW.mRemoteStreams .values()); pw.print(" mShowA11yStream: "); pw.println(mShowA11yStream); pw.println(); mMediaSessions.dump(pw); } Loading Loading @@ -301,6 +303,10 @@ public class VolumeDialogController { mCallbacks.onShowSafetyWarning(flags); } private void onAccessibilityModeChanged(Boolean showA11yStream) { mCallbacks.onAccessibilityModeChanged(showA11yStream); } private boolean checkRoutedToBluetoothW(int stream) { boolean changed = false; if (stream == AudioManager.STREAM_MUSIC) { Loading Loading @@ -570,13 +576,16 @@ public class VolumeDialogController { switch (mode) { case VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME: // "legacy" mode mShowA11yStream = false; break; case VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME: mShowA11yStream = true; break; default: Log.e(TAG, "Invalid accessibility mode " + mode); break; } mWorker.obtainMessage(W.ACCESSIBILITY_MODE_CHANGED, mShowA11yStream).sendToTarget(); } } Loading @@ -595,6 +604,7 @@ public class VolumeDialogController { private static final int NOTIFY_VISIBLE = 12; private static final int USER_ACTIVITY = 13; private static final int SHOW_SAFETY_WARNING = 14; private static final int ACCESSIBILITY_MODE_CHANGED = 15; W(Looper looper) { super(looper); Loading @@ -617,6 +627,7 @@ public class VolumeDialogController { case NOTIFY_VISIBLE: onNotifyVisibleW(msg.arg1 != 0); break; case USER_ACTIVITY: onUserActivityW(); break; case SHOW_SAFETY_WARNING: onShowSafetyWarningW(msg.arg1); break; case ACCESSIBILITY_MODE_CHANGED: onAccessibilityModeChanged((Boolean) msg.obj); } } } Loading Loading @@ -743,6 +754,19 @@ public class VolumeDialogController { }); } } @Override public void onAccessibilityModeChanged(Boolean showA11yStream) { boolean show = showA11yStream == null ? false : showA11yStream; for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { entry.getValue().post(new Runnable() { @Override public void run() { entry.getKey().onAccessibilityModeChanged(show); } }); } } } Loading Loading @@ -1004,6 +1028,7 @@ public class VolumeDialogController { .append('[').append(ss.levelMin).append("..").append(ss.levelMax) .append(']'); if (ss.muted) sb.append(" [MUTED]"); if (ss.dynamic) sb.append(" [DYNAMIC]"); } sep(sb, indent); sb.append("ringerModeExternal:").append(ringerModeExternal); sep(sb, indent); sb.append("ringerModeInternal:").append(ringerModeInternal); Loading Loading @@ -1037,6 +1062,7 @@ public class VolumeDialogController { void onShowSilentHint(); void onScreenOff(); void onShowSafetyWarning(int flags); void onAccessibilityModeChanged(Boolean showA11yStream); } public interface UserActivityListener { Loading services/core/java/com/android/server/audio/AudioService.java +1 −1 Original line number Diff line number Diff line Loading @@ -5932,7 +5932,7 @@ public class AudioService extends IAudioService.Stub * the whether any exposes the FLAG_ENABLE_ACCESSIBILITY_VOLUME flag * - set to false to listen to when accessibility services are started (e.g. "TalkBack started") */ private static final boolean USE_FLAG_ENABLE_ACCESSIBILITY_VOLUME = true; private static final boolean USE_FLAG_ENABLE_ACCESSIBILITY_VOLUME = false; private void initA11yMonitoring() { final AccessibilityManager accessibilityManager = Loading Loading
packages/SystemUI/res/drawable/ic_volume_accessibility.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <!-- Copyright (C) 2017 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="32dp" android:height="32dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:fillColor="#FFFFFFFF" android:pathData="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1s-5.89,-0.3 -8.5,-1L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1l-0.5,-2zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/> </vector> No newline at end of file
packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +32 −4 Original line number Diff line number Diff line Loading @@ -127,6 +127,7 @@ public class VolumeDialog implements TunerService.Tunable { private boolean mShowing; private boolean mExpanded; private boolean mShowA11yStream; private int mActiveStream; private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE; Loading Loading @@ -244,7 +245,6 @@ public class VolumeDialog implements TunerService.Tunable { if (!AudioSystem.isSingleVolume(mContext)) { addRow(AudioManager.STREAM_RING, R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true); addRow(AudioManager.STREAM_ALARM, R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, false); addRow(AudioManager.STREAM_VOICE_CALL, Loading @@ -253,6 +253,8 @@ public class VolumeDialog implements TunerService.Tunable { R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false); addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false); addRow(AudioManager.STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility, R.drawable.ic_volume_accessibility, true); } } else { addExistingRows(); Loading Loading @@ -307,11 +309,25 @@ public class VolumeDialog implements TunerService.Tunable { } private void addRow(int stream, int iconRes, int iconMuteRes, boolean important) { addRow(stream, iconRes, iconMuteRes, important, false); } private void addRow(int stream, int iconRes, int iconMuteRes, boolean important, boolean dynamic) { VolumeRow row = new VolumeRow(); initRow(row, stream, iconRes, iconMuteRes, important); int rowSize; int viewSize; if (mShowA11yStream && dynamic && (rowSize = mRows.size()) > 1 && (viewSize = mDialogRowsView.getChildCount()) > 1) { // A11y Stream should be the last in the list mDialogRowsView.addView(row.view, viewSize - 2); mRows.add(rowSize - 2, row); } else { mDialogRowsView.addView(row.view); mRows.add(row); } } private void addExistingRows() { int N = mRows.size(); Loading Loading @@ -592,6 +608,9 @@ public class VolumeDialog implements TunerService.Tunable { } private boolean shouldBeVisibleH(VolumeRow row, boolean isActive) { if (row.stream == AudioSystem.STREAM_ACCESSIBILITY) { return mShowA11yStream; } return mExpanded && row.view.getVisibility() == View.VISIBLE || (mExpanded && (row.important || isActive)) || !mExpanded && isActive; Loading Loading @@ -644,7 +663,8 @@ public class VolumeDialog implements TunerService.Tunable { if (!ss.dynamic) continue; mDynamic.put(stream, true); if (findRow(stream) == null) { addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true); addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true, true); } } Loading Loading @@ -1009,6 +1029,14 @@ public class VolumeDialog implements TunerService.Tunable { public void onShowSafetyWarning(int flags) { showSafetyWarningH(flags); } @Override public void onAccessibilityModeChanged(Boolean showA11yStream) { boolean show = showA11yStream == null ? false : showA11yStream; mShowA11yStream = show; updateRowsH(getActiveRow()); } }; private final ZenModePanel.Callback mZenPanelCallback = new ZenModePanel.Callback() { Loading
packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java +27 −1 Original line number Diff line number Diff line Loading @@ -75,13 +75,13 @@ public class VolumeDialogController { STREAMS.put(AudioSystem.STREAM_BLUETOOTH_SCO, R.string.stream_bluetooth_sco); STREAMS.put(AudioSystem.STREAM_DTMF, R.string.stream_dtmf); STREAMS.put(AudioSystem.STREAM_MUSIC, R.string.stream_music); STREAMS.put(AudioSystem.STREAM_ACCESSIBILITY, R.string.stream_accessibility); STREAMS.put(AudioSystem.STREAM_NOTIFICATION, R.string.stream_notification); STREAMS.put(AudioSystem.STREAM_RING, R.string.stream_ring); STREAMS.put(AudioSystem.STREAM_SYSTEM, R.string.stream_system); STREAMS.put(AudioSystem.STREAM_SYSTEM_ENFORCED, R.string.stream_system_enforced); STREAMS.put(AudioSystem.STREAM_TTS, R.string.stream_tts); STREAMS.put(AudioSystem.STREAM_VOICE_CALL, R.string.stream_voice_call); STREAMS.put(AudioSystem.STREAM_ACCESSIBILITY, R.string.stream_accessibility); } private final HandlerThread mWorkerThread; Loading @@ -98,6 +98,7 @@ public class VolumeDialogController { private final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks(); private final Vibrator mVibrator; private final boolean mHasVibrator; private boolean mShowA11yStream; private boolean mDestroyed; private VolumePolicy mVolumePolicy; Loading Loading @@ -204,6 +205,7 @@ public class VolumeDialogController { pw.print(" mHasVibrator: "); pw.println(mHasVibrator); pw.print(" mRemoteStreams: "); pw.println(mMediaSessionsCallbacksW.mRemoteStreams .values()); pw.print(" mShowA11yStream: "); pw.println(mShowA11yStream); pw.println(); mMediaSessions.dump(pw); } Loading Loading @@ -301,6 +303,10 @@ public class VolumeDialogController { mCallbacks.onShowSafetyWarning(flags); } private void onAccessibilityModeChanged(Boolean showA11yStream) { mCallbacks.onAccessibilityModeChanged(showA11yStream); } private boolean checkRoutedToBluetoothW(int stream) { boolean changed = false; if (stream == AudioManager.STREAM_MUSIC) { Loading Loading @@ -570,13 +576,16 @@ public class VolumeDialogController { switch (mode) { case VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME: // "legacy" mode mShowA11yStream = false; break; case VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME: mShowA11yStream = true; break; default: Log.e(TAG, "Invalid accessibility mode " + mode); break; } mWorker.obtainMessage(W.ACCESSIBILITY_MODE_CHANGED, mShowA11yStream).sendToTarget(); } } Loading @@ -595,6 +604,7 @@ public class VolumeDialogController { private static final int NOTIFY_VISIBLE = 12; private static final int USER_ACTIVITY = 13; private static final int SHOW_SAFETY_WARNING = 14; private static final int ACCESSIBILITY_MODE_CHANGED = 15; W(Looper looper) { super(looper); Loading @@ -617,6 +627,7 @@ public class VolumeDialogController { case NOTIFY_VISIBLE: onNotifyVisibleW(msg.arg1 != 0); break; case USER_ACTIVITY: onUserActivityW(); break; case SHOW_SAFETY_WARNING: onShowSafetyWarningW(msg.arg1); break; case ACCESSIBILITY_MODE_CHANGED: onAccessibilityModeChanged((Boolean) msg.obj); } } } Loading Loading @@ -743,6 +754,19 @@ public class VolumeDialogController { }); } } @Override public void onAccessibilityModeChanged(Boolean showA11yStream) { boolean show = showA11yStream == null ? false : showA11yStream; for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { entry.getValue().post(new Runnable() { @Override public void run() { entry.getKey().onAccessibilityModeChanged(show); } }); } } } Loading Loading @@ -1004,6 +1028,7 @@ public class VolumeDialogController { .append('[').append(ss.levelMin).append("..").append(ss.levelMax) .append(']'); if (ss.muted) sb.append(" [MUTED]"); if (ss.dynamic) sb.append(" [DYNAMIC]"); } sep(sb, indent); sb.append("ringerModeExternal:").append(ringerModeExternal); sep(sb, indent); sb.append("ringerModeInternal:").append(ringerModeInternal); Loading Loading @@ -1037,6 +1062,7 @@ public class VolumeDialogController { void onShowSilentHint(); void onScreenOff(); void onShowSafetyWarning(int flags); void onAccessibilityModeChanged(Boolean showA11yStream); } public interface UserActivityListener { Loading
services/core/java/com/android/server/audio/AudioService.java +1 −1 Original line number Diff line number Diff line Loading @@ -5932,7 +5932,7 @@ public class AudioService extends IAudioService.Stub * the whether any exposes the FLAG_ENABLE_ACCESSIBILITY_VOLUME flag * - set to false to listen to when accessibility services are started (e.g. "TalkBack started") */ private static final boolean USE_FLAG_ENABLE_ACCESSIBILITY_VOLUME = true; private static final boolean USE_FLAG_ENABLE_ACCESSIBILITY_VOLUME = false; private void initA11yMonitoring() { final AccessibilityManager accessibilityManager = Loading