1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.plugins; 16 17 import android.annotation.IntegerRes; 18 import android.content.ComponentName; 19 import android.media.AudioManager; 20 import android.media.AudioSystem; 21 import android.os.Handler; 22 import android.os.VibrationEffect; 23 import android.util.SparseArray; 24 25 import com.android.systemui.plugins.VolumeDialogController.Callbacks; 26 import com.android.systemui.plugins.VolumeDialogController.State; 27 import com.android.systemui.plugins.VolumeDialogController.StreamState; 28 import com.android.systemui.plugins.annotations.DependsOn; 29 import com.android.systemui.plugins.annotations.ProvidesInterface; 30 31 /** 32 * Manages the VolumeDialog. 33 * 34 * Accessible through {@link PluginDependency} 35 */ 36 @ProvidesInterface(version = VolumeDialogController.VERSION) 37 @DependsOn(target = StreamState.class) 38 @DependsOn(target = State.class) 39 @DependsOn(target = Callbacks.class) 40 public interface VolumeDialogController { 41 int VERSION = 1; 42 setActiveStream(int stream)43 void setActiveStream(int stream); setStreamVolume(int stream, int userLevel)44 void setStreamVolume(int stream, int userLevel); setRingerMode(int ringerModeNormal, boolean external)45 void setRingerMode(int ringerModeNormal, boolean external); 46 hasVibrator()47 boolean hasVibrator(); vibrate(VibrationEffect effect)48 void vibrate(VibrationEffect effect); scheduleTouchFeedback()49 void scheduleTouchFeedback(); 50 getAudioManager()51 AudioManager getAudioManager(); 52 notifyVisible(boolean visible)53 void notifyVisible(boolean visible); 54 addCallback(Callbacks callbacks, Handler handler)55 void addCallback(Callbacks callbacks, Handler handler); removeCallback(Callbacks callbacks)56 void removeCallback(Callbacks callbacks); 57 userActivity()58 void userActivity(); getState()59 void getState(); 60 areCaptionsEnabled()61 boolean areCaptionsEnabled(); setCaptionsEnabled(boolean isEnabled)62 void setCaptionsEnabled(boolean isEnabled); 63 getCaptionsComponentState(boolean fromTooltip)64 void getCaptionsComponentState(boolean fromTooltip); 65 66 @ProvidesInterface(version = StreamState.VERSION) 67 public static final class StreamState { 68 public static final int VERSION = 1; 69 70 public boolean dynamic; 71 public int level; 72 public int levelMin; 73 public int levelMax; 74 public boolean muted; 75 public boolean muteSupported; 76 public @IntegerRes int name; 77 public String remoteLabel; 78 public boolean routedToBluetooth; 79 copy()80 public StreamState copy() { 81 final StreamState rt = new StreamState(); 82 rt.dynamic = dynamic; 83 rt.level = level; 84 rt.levelMin = levelMin; 85 rt.levelMax = levelMax; 86 rt.muted = muted; 87 rt.muteSupported = muteSupported; 88 rt.name = name; 89 rt.remoteLabel = remoteLabel; 90 rt.routedToBluetooth = routedToBluetooth; 91 return rt; 92 } 93 } 94 95 @ProvidesInterface(version = State.VERSION) 96 public static final class State { 97 public static final int VERSION = 1; 98 99 public static int NO_ACTIVE_STREAM = -1; 100 101 public final SparseArray<StreamState> states = new SparseArray<>(); 102 103 public int ringerModeInternal; 104 public int ringerModeExternal; 105 public int zenMode; 106 public ComponentName effectsSuppressor; 107 public String effectsSuppressorName; 108 public int activeStream = NO_ACTIVE_STREAM; 109 public boolean disallowAlarms; 110 public boolean disallowMedia; 111 public boolean disallowSystem; 112 public boolean disallowRinger; 113 copy()114 public State copy() { 115 final State rt = new State(); 116 for (int i = 0; i < states.size(); i++) { 117 rt.states.put(states.keyAt(i), states.valueAt(i).copy()); 118 } 119 rt.ringerModeExternal = ringerModeExternal; 120 rt.ringerModeInternal = ringerModeInternal; 121 rt.zenMode = zenMode; 122 if (effectsSuppressor != null) { 123 rt.effectsSuppressor = effectsSuppressor.clone(); 124 } 125 rt.effectsSuppressorName = effectsSuppressorName; 126 rt.activeStream = activeStream; 127 rt.disallowAlarms = disallowAlarms; 128 rt.disallowMedia = disallowMedia; 129 rt.disallowSystem = disallowSystem; 130 rt.disallowRinger = disallowRinger; 131 return rt; 132 } 133 134 @Override toString()135 public String toString() { 136 return toString(0); 137 } 138 toString(int indent)139 public String toString(int indent) { 140 final StringBuilder sb = new StringBuilder("{"); 141 if (indent > 0) sep(sb, indent); 142 for (int i = 0; i < states.size(); i++) { 143 if (i > 0) { 144 sep(sb, indent); 145 } 146 final int stream = states.keyAt(i); 147 final StreamState ss = states.valueAt(i); 148 sb.append(AudioSystem.streamToString(stream)).append(":").append(ss.level) 149 .append('[').append(ss.levelMin).append("..").append(ss.levelMax) 150 .append(']'); 151 if (ss.muted) sb.append(" [MUTED]"); 152 if (ss.dynamic) sb.append(" [DYNAMIC]"); 153 } 154 sep(sb, indent); sb.append("ringerModeExternal:").append(ringerModeExternal); 155 sep(sb, indent); sb.append("ringerModeInternal:").append(ringerModeInternal); 156 sep(sb, indent); sb.append("zenMode:").append(zenMode); 157 sep(sb, indent); sb.append("effectsSuppressor:").append(effectsSuppressor); 158 sep(sb, indent); sb.append("effectsSuppressorName:").append(effectsSuppressorName); 159 sep(sb, indent); sb.append("activeStream:").append(activeStream); 160 sep(sb, indent); sb.append("disallowAlarms:").append(disallowAlarms); 161 sep(sb, indent); sb.append("disallowMedia:").append(disallowMedia); 162 sep(sb, indent); sb.append("disallowSystem:").append(disallowSystem); 163 sep(sb, indent); sb.append("disallowRinger:").append(disallowRinger); 164 if (indent > 0) sep(sb, indent); 165 return sb.append('}').toString(); 166 } 167 sep(StringBuilder sb, int indent)168 private static void sep(StringBuilder sb, int indent) { 169 if (indent > 0) { 170 sb.append('\n'); 171 for (int i = 0; i < indent; i++) { 172 sb.append(' '); 173 } 174 } else { 175 sb.append(','); 176 } 177 } 178 } 179 180 @ProvidesInterface(version = Callbacks.VERSION) 181 public interface Callbacks { 182 int VERSION = 1; 183 onShowRequested(int reason, boolean keyguardLocked, int lockTaskModeState)184 void onShowRequested(int reason, boolean keyguardLocked, int lockTaskModeState); onDismissRequested(int reason)185 void onDismissRequested(int reason); onStateChanged(State state)186 void onStateChanged(State state); onLayoutDirectionChanged(int layoutDirection)187 void onLayoutDirectionChanged(int layoutDirection); onConfigurationChanged()188 void onConfigurationChanged(); onShowVibrateHint()189 void onShowVibrateHint(); onShowSilentHint()190 void onShowSilentHint(); onScreenOff()191 void onScreenOff(); onShowSafetyWarning(int flags)192 void onShowSafetyWarning(int flags); onAccessibilityModeChanged(Boolean showA11yStream)193 void onAccessibilityModeChanged(Boolean showA11yStream); onCaptionComponentStateChanged(Boolean isComponentEnabled, Boolean fromTooltip)194 void onCaptionComponentStateChanged(Boolean isComponentEnabled, Boolean fromTooltip); 195 } 196 } 197