1782cd6711bc15e3f03456210b3543a67606d6591Jason Monk/*
2782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * Copyright (C) 2017 The Android Open Source Project
3782cd6711bc15e3f03456210b3543a67606d6591Jason Monk *
4782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * except in compliance with the License. You may obtain a copy of the License at
6782cd6711bc15e3f03456210b3543a67606d6591Jason Monk *
7782cd6711bc15e3f03456210b3543a67606d6591Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8782cd6711bc15e3f03456210b3543a67606d6591Jason Monk *
9782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * KIND, either express or implied. See the License for the specific language governing
12782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * permissions and limitations under the License.
13782cd6711bc15e3f03456210b3543a67606d6591Jason Monk */
14782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
15782cd6711bc15e3f03456210b3543a67606d6591Jason Monkpackage com.android.systemui.plugins;
16782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
17782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.annotation.IntegerRes;
18782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.content.ComponentName;
19782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.media.AudioManager;
20782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.media.AudioSystem;
21782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.os.Handler;
22ac55e01e1c8b67603134846c9b63002cc28aef48Julia Reynoldsimport android.os.VibrationEffect;
23782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport android.util.SparseArray;
24782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
25782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.plugins.VolumeDialogController.Callbacks;
26782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.plugins.VolumeDialogController.State;
27782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.plugins.VolumeDialogController.StreamState;
28782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.plugins.annotations.DependsOn;
29782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.plugins.annotations.ProvidesInterface;
30782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
31782cd6711bc15e3f03456210b3543a67606d6591Jason Monk/**
32782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * Manages the VolumeDialog.
33782cd6711bc15e3f03456210b3543a67606d6591Jason Monk *
34782cd6711bc15e3f03456210b3543a67606d6591Jason Monk * Accessible through {@link PluginDependency}
35782cd6711bc15e3f03456210b3543a67606d6591Jason Monk */
36782cd6711bc15e3f03456210b3543a67606d6591Jason Monk@ProvidesInterface(version = VolumeDialogController.VERSION)
37782cd6711bc15e3f03456210b3543a67606d6591Jason Monk@DependsOn(target = StreamState.class)
38782cd6711bc15e3f03456210b3543a67606d6591Jason Monk@DependsOn(target = State.class)
39782cd6711bc15e3f03456210b3543a67606d6591Jason Monk@DependsOn(target = Callbacks.class)
40782cd6711bc15e3f03456210b3543a67606d6591Jason Monkpublic interface VolumeDialogController {
41782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    int VERSION = 1;
42782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
43782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void setActiveStream(int stream);
44782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void setStreamVolume(int stream, int userLevel);
45782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void setRingerMode(int ringerModeNormal, boolean external);
46782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
47782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    boolean hasVibrator();
48ac55e01e1c8b67603134846c9b63002cc28aef48Julia Reynolds    void vibrate(VibrationEffect effect);
49ac55e01e1c8b67603134846c9b63002cc28aef48Julia Reynolds    void scheduleTouchFeedback();
50782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
51782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    AudioManager getAudioManager();
52782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
53782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void notifyVisible(boolean visible);
54782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
55782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void addCallback(Callbacks callbacks, Handler handler);
56782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void removeCallback(Callbacks callbacks);
57782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
58782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void userActivity();
59782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    void getState();
60782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
61782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    @ProvidesInterface(version = StreamState.VERSION)
62782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    public static final class StreamState {
63782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public static final int VERSION = 1;
64782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
65782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public boolean dynamic;
66782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int level;
67782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int levelMin;
68782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int levelMax;
69782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public boolean muted;
70782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public boolean muteSupported;
71782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public @IntegerRes int name;
72782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public String remoteLabel;
73782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public boolean routedToBluetooth;
74782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
75782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public StreamState copy() {
76782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            final StreamState rt = new StreamState();
77782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.dynamic = dynamic;
78782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.level = level;
79782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.levelMin = levelMin;
80782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.levelMax = levelMax;
81782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.muted = muted;
82782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.muteSupported = muteSupported;
83782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.name = name;
84782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.remoteLabel = remoteLabel;
85782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.routedToBluetooth = routedToBluetooth;
86782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            return rt;
87782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        }
88782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    }
89782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
90782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    @ProvidesInterface(version = State.VERSION)
91782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    public static final class State {
92782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public static final int VERSION = 1;
93782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
94782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public static int NO_ACTIVE_STREAM = -1;
95782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
96782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public final SparseArray<StreamState> states = new SparseArray<>();
97782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
98782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int ringerModeInternal;
99782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int ringerModeExternal;
100782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int zenMode;
101782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public ComponentName effectsSuppressor;
102782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public String effectsSuppressorName;
103782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public int activeStream = NO_ACTIVE_STREAM;
104925cde8f745c4cf946d0e215d306d2b134ca44deBeverly        public boolean disallowAlarms;
105925cde8f745c4cf946d0e215d306d2b134ca44deBeverly        public boolean disallowMedia;
106d696476fb31a203db38c7c31c347b27c8fda84efBeverly        public boolean disallowSystem;
107925cde8f745c4cf946d0e215d306d2b134ca44deBeverly        public boolean disallowRinger;
108782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
109782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public State copy() {
110782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            final State rt = new State();
111782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            for (int i = 0; i < states.size(); i++) {
112782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                rt.states.put(states.keyAt(i), states.valueAt(i).copy());
113782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            }
114782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.ringerModeExternal = ringerModeExternal;
115782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.ringerModeInternal = ringerModeInternal;
116782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.zenMode = zenMode;
117782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            if (effectsSuppressor != null) {
118782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                rt.effectsSuppressor = effectsSuppressor.clone();
119782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            }
120782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.effectsSuppressorName = effectsSuppressorName;
121782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            rt.activeStream = activeStream;
122925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            rt.disallowAlarms = disallowAlarms;
123925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            rt.disallowMedia = disallowMedia;
124d696476fb31a203db38c7c31c347b27c8fda84efBeverly            rt.disallowSystem = disallowSystem;
125925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            rt.disallowRinger = disallowRinger;
126782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            return rt;
127782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        }
128782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
129782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        @Override
130782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public String toString() {
131782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            return toString(0);
132782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        }
133782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
134782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        public String toString(int indent) {
135782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            final StringBuilder sb = new StringBuilder("{");
136782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            if (indent > 0) sep(sb, indent);
137782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            for (int i = 0; i < states.size(); i++) {
138782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                if (i > 0) {
139782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                    sep(sb, indent);
140782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                }
141782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                final int stream = states.keyAt(i);
142782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                final StreamState ss = states.valueAt(i);
143782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                sb.append(AudioSystem.streamToString(stream)).append(":").append(ss.level)
144782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                        .append('[').append(ss.levelMin).append("..").append(ss.levelMax)
145782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                        .append(']');
146782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                if (ss.muted) sb.append(" [MUTED]");
147782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                if (ss.dynamic) sb.append(" [DYNAMIC]");
148782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            }
149782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("ringerModeExternal:").append(ringerModeExternal);
150782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("ringerModeInternal:").append(ringerModeInternal);
151782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("zenMode:").append(zenMode);
152782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("effectsSuppressor:").append(effectsSuppressor);
153782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("effectsSuppressorName:").append(effectsSuppressorName);
154782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            sep(sb, indent); sb.append("activeStream:").append(activeStream);
155925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            sep(sb, indent); sb.append("disallowAlarms:").append(disallowAlarms);
156925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            sep(sb, indent); sb.append("disallowMedia:").append(disallowMedia);
157d696476fb31a203db38c7c31c347b27c8fda84efBeverly            sep(sb, indent); sb.append("disallowSystem:").append(disallowSystem);
158925cde8f745c4cf946d0e215d306d2b134ca44deBeverly            sep(sb, indent); sb.append("disallowRinger:").append(disallowRinger);
159782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            if (indent > 0) sep(sb, indent);
160782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            return sb.append('}').toString();
161782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        }
162782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
163782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        private static void sep(StringBuilder sb, int indent) {
164782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            if (indent > 0) {
165782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                sb.append('\n');
166782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                for (int i = 0; i < indent; i++) {
167782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                    sb.append(' ');
168782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                }
169782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            } else {
170782cd6711bc15e3f03456210b3543a67606d6591Jason Monk                sb.append(',');
171782cd6711bc15e3f03456210b3543a67606d6591Jason Monk            }
172782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        }
173782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    }
174782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
175782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    @ProvidesInterface(version = Callbacks.VERSION)
176782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    public interface Callbacks {
177782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        int VERSION = 1;
178782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
179782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onShowRequested(int reason);
180782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onDismissRequested(int reason);
181782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onStateChanged(State state);
182782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onLayoutDirectionChanged(int layoutDirection);
183782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onConfigurationChanged();
184782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onShowVibrateHint();
185782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onShowSilentHint();
186782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onScreenOff();
187782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onShowSafetyWarning(int flags);
188782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        void onAccessibilityModeChanged(Boolean showA11yStream);
189782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    }
190782cd6711bc15e3f03456210b3543a67606d6591Jason Monk}
191