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.util.SparseArray; 23 24 import com.android.systemui.plugins.VolumeDialogController.Callbacks; 25 import com.android.systemui.plugins.VolumeDialogController.State; 26 import com.android.systemui.plugins.VolumeDialogController.StreamState; 27 import com.android.systemui.plugins.annotations.DependsOn; 28 import com.android.systemui.plugins.annotations.ProvidesInterface; 29 30 /** 31 * Manages the VolumeDialog. 32 * 33 * Accessible through {@link PluginDependency} 34 */ 35 @ProvidesInterface(version = VolumeDialogController.VERSION) 36 @DependsOn(target = StreamState.class) 37 @DependsOn(target = State.class) 38 @DependsOn(target = Callbacks.class) 39 public interface VolumeDialogController { 40 int VERSION = 1; 41 setActiveStream(int stream)42 void setActiveStream(int stream); setStreamVolume(int stream, int userLevel)43 void setStreamVolume(int stream, int userLevel); setRingerMode(int ringerModeNormal, boolean external)44 void setRingerMode(int ringerModeNormal, boolean external); 45 hasVibrator()46 boolean hasVibrator(); vibrate()47 void vibrate(); 48 getAudioManager()49 AudioManager getAudioManager(); 50 notifyVisible(boolean visible)51 void notifyVisible(boolean visible); 52 addCallback(Callbacks callbacks, Handler handler)53 void addCallback(Callbacks callbacks, Handler handler); removeCallback(Callbacks callbacks)54 void removeCallback(Callbacks callbacks); 55 userActivity()56 void userActivity(); getState()57 void getState(); 58 59 @ProvidesInterface(version = StreamState.VERSION) 60 public static final class StreamState { 61 public static final int VERSION = 1; 62 63 public boolean dynamic; 64 public int level; 65 public int levelMin; 66 public int levelMax; 67 public boolean muted; 68 public boolean muteSupported; 69 public @IntegerRes int name; 70 public String remoteLabel; 71 public boolean routedToBluetooth; 72 copy()73 public StreamState copy() { 74 final StreamState rt = new StreamState(); 75 rt.dynamic = dynamic; 76 rt.level = level; 77 rt.levelMin = levelMin; 78 rt.levelMax = levelMax; 79 rt.muted = muted; 80 rt.muteSupported = muteSupported; 81 rt.name = name; 82 rt.remoteLabel = remoteLabel; 83 rt.routedToBluetooth = routedToBluetooth; 84 return rt; 85 } 86 } 87 88 @ProvidesInterface(version = State.VERSION) 89 public static final class State { 90 public static final int VERSION = 1; 91 92 public static int NO_ACTIVE_STREAM = -1; 93 94 public final SparseArray<StreamState> states = new SparseArray<>(); 95 96 public int ringerModeInternal; 97 public int ringerModeExternal; 98 public int zenMode; 99 public ComponentName effectsSuppressor; 100 public String effectsSuppressorName; 101 public int activeStream = NO_ACTIVE_STREAM; 102 copy()103 public State copy() { 104 final State rt = new State(); 105 for (int i = 0; i < states.size(); i++) { 106 rt.states.put(states.keyAt(i), states.valueAt(i).copy()); 107 } 108 rt.ringerModeExternal = ringerModeExternal; 109 rt.ringerModeInternal = ringerModeInternal; 110 rt.zenMode = zenMode; 111 if (effectsSuppressor != null) { 112 rt.effectsSuppressor = effectsSuppressor.clone(); 113 } 114 rt.effectsSuppressorName = effectsSuppressorName; 115 rt.activeStream = activeStream; 116 return rt; 117 } 118 119 @Override toString()120 public String toString() { 121 return toString(0); 122 } 123 toString(int indent)124 public String toString(int indent) { 125 final StringBuilder sb = new StringBuilder("{"); 126 if (indent > 0) sep(sb, indent); 127 for (int i = 0; i < states.size(); i++) { 128 if (i > 0) { 129 sep(sb, indent); 130 } 131 final int stream = states.keyAt(i); 132 final StreamState ss = states.valueAt(i); 133 sb.append(AudioSystem.streamToString(stream)).append(":").append(ss.level) 134 .append('[').append(ss.levelMin).append("..").append(ss.levelMax) 135 .append(']'); 136 if (ss.muted) sb.append(" [MUTED]"); 137 if (ss.dynamic) sb.append(" [DYNAMIC]"); 138 } 139 sep(sb, indent); sb.append("ringerModeExternal:").append(ringerModeExternal); 140 sep(sb, indent); sb.append("ringerModeInternal:").append(ringerModeInternal); 141 sep(sb, indent); sb.append("zenMode:").append(zenMode); 142 sep(sb, indent); sb.append("effectsSuppressor:").append(effectsSuppressor); 143 sep(sb, indent); sb.append("effectsSuppressorName:").append(effectsSuppressorName); 144 sep(sb, indent); sb.append("activeStream:").append(activeStream); 145 if (indent > 0) sep(sb, indent); 146 return sb.append('}').toString(); 147 } 148 sep(StringBuilder sb, int indent)149 private static void sep(StringBuilder sb, int indent) { 150 if (indent > 0) { 151 sb.append('\n'); 152 for (int i = 0; i < indent; i++) { 153 sb.append(' '); 154 } 155 } else { 156 sb.append(','); 157 } 158 } 159 } 160 161 @ProvidesInterface(version = Callbacks.VERSION) 162 public interface Callbacks { 163 int VERSION = 1; 164 onShowRequested(int reason)165 void onShowRequested(int reason); onDismissRequested(int reason)166 void onDismissRequested(int reason); onStateChanged(State state)167 void onStateChanged(State state); onLayoutDirectionChanged(int layoutDirection)168 void onLayoutDirectionChanged(int layoutDirection); onConfigurationChanged()169 void onConfigurationChanged(); onShowVibrateHint()170 void onShowVibrateHint(); onShowSilentHint()171 void onShowSilentHint(); onScreenOff()172 void onScreenOff(); onShowSafetyWarning(int flags)173 void onShowSafetyWarning(int flags); onAccessibilityModeChanged(Boolean showA11yStream)174 void onAccessibilityModeChanged(Boolean showA11yStream); 175 } 176 } 177