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