• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settingslib.volume;
18 
19 import android.content.Context;
20 import android.media.AudioManager;
21 import android.media.MediaMetadata;
22 import android.media.VolumeProvider;
23 import android.media.session.MediaController.PlaybackInfo;
24 import android.media.session.PlaybackState;
25 import android.telephony.TelephonyManager;
26 import android.widget.TextView;
27 
28 import java.util.Objects;
29 
30 /**
31  * Static helpers for the volume dialog.
32  */
33 public class Util {
34 
35     private static final int[] AUDIO_MANAGER_FLAGS = new int[]{
36             AudioManager.FLAG_SHOW_UI,
37             AudioManager.FLAG_VIBRATE,
38             AudioManager.FLAG_PLAY_SOUND,
39             AudioManager.FLAG_ALLOW_RINGER_MODES,
40             AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE,
41             AudioManager.FLAG_SHOW_VIBRATE_HINT,
42             AudioManager.FLAG_SHOW_SILENT_HINT,
43             AudioManager.FLAG_FROM_KEY,
44             AudioManager.FLAG_SHOW_UI_WARNINGS,
45     };
46 
47     private static final String[] AUDIO_MANAGER_FLAG_NAMES = new String[]{
48             "SHOW_UI",
49             "VIBRATE",
50             "PLAY_SOUND",
51             "ALLOW_RINGER_MODES",
52             "REMOVE_SOUND_AND_VIBRATE",
53             "SHOW_VIBRATE_HINT",
54             "SHOW_SILENT_HINT",
55             "FROM_KEY",
56             "SHOW_UI_WARNINGS",
57     };
58 
59     /**
60      * Extract log tag from {@code c}
61      */
logTag(Class<?> c)62     public static String logTag(Class<?> c) {
63         final String tag = "vol." + c.getSimpleName();
64         return tag.length() < 23 ? tag : tag.substring(0, 23);
65     }
66 
67     /**
68      * Convert media metadata to string
69      */
mediaMetadataToString(MediaMetadata metadata)70     public static String mediaMetadataToString(MediaMetadata metadata) {
71         if (metadata == null) return null;
72         return metadata.getDescription().toString();
73     }
74 
75     /**
76      * Convert playback info to string
77      */
playbackInfoToString(PlaybackInfo info)78     public static String playbackInfoToString(PlaybackInfo info) {
79         if (info == null) return null;
80         final String type = playbackInfoTypeToString(info.getPlaybackType());
81         final String vc = volumeProviderControlToString(info.getVolumeControl());
82         return String.format("PlaybackInfo[vol=%s,max=%s,type=%s,vc=%s],atts=%s",
83                 info.getCurrentVolume(), info.getMaxVolume(), type, vc, info.getAudioAttributes());
84     }
85 
86     /**
87      * Convert type of playback info to string
88      */
playbackInfoTypeToString(int type)89     public static String playbackInfoTypeToString(int type) {
90         switch (type) {
91             case PlaybackInfo.PLAYBACK_TYPE_LOCAL:
92                 return "LOCAL";
93             case PlaybackInfo.PLAYBACK_TYPE_REMOTE:
94                 return "REMOTE";
95             default:
96                 return "UNKNOWN_" + type;
97         }
98     }
99 
100     /**
101      * Convert state of playback info to string
102      */
playbackStateStateToString(int state)103     public static String playbackStateStateToString(int state) {
104         switch (state) {
105             case PlaybackState.STATE_NONE:
106                 return "STATE_NONE";
107             case PlaybackState.STATE_STOPPED:
108                 return "STATE_STOPPED";
109             case PlaybackState.STATE_PAUSED:
110                 return "STATE_PAUSED";
111             case PlaybackState.STATE_PLAYING:
112                 return "STATE_PLAYING";
113             default:
114                 return "UNKNOWN_" + state;
115         }
116     }
117 
118     /**
119      * Convert volume provider control to string
120      */
volumeProviderControlToString(int control)121     public static String volumeProviderControlToString(int control) {
122         switch (control) {
123             case VolumeProvider.VOLUME_CONTROL_ABSOLUTE:
124                 return "VOLUME_CONTROL_ABSOLUTE";
125             case VolumeProvider.VOLUME_CONTROL_FIXED:
126                 return "VOLUME_CONTROL_FIXED";
127             case VolumeProvider.VOLUME_CONTROL_RELATIVE:
128                 return "VOLUME_CONTROL_RELATIVE";
129             default:
130                 return "VOLUME_CONTROL_UNKNOWN_" + control;
131         }
132     }
133 
134     /**
135      * Convert {@link PlaybackState} to string
136      */
playbackStateToString(PlaybackState playbackState)137     public static String playbackStateToString(PlaybackState playbackState) {
138         if (playbackState == null) return null;
139         return playbackStateStateToString(playbackState.getState()) + " " + playbackState;
140     }
141 
142     /**
143      * Convert audio manager flags to string
144      */
audioManagerFlagsToString(int value)145     public static String audioManagerFlagsToString(int value) {
146         return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES);
147     }
148 
bitFieldToString(int value, int[] values, String[] names)149     protected static String bitFieldToString(int value, int[] values, String[] names) {
150         if (value == 0) return "";
151         final StringBuilder sb = new StringBuilder();
152         for (int i = 0; i < values.length; i++) {
153             if ((value & values[i]) != 0) {
154                 if (sb.length() > 0) sb.append(',');
155                 sb.append(names[i]);
156             }
157             value &= ~values[i];
158         }
159         if (value != 0) {
160             if (sb.length() > 0) sb.append(',');
161             sb.append("UNKNOWN_").append(value);
162         }
163         return sb.toString();
164     }
165 
emptyToNull(CharSequence str)166     private static CharSequence emptyToNull(CharSequence str) {
167         return str == null || str.length() == 0 ? null : str;
168     }
169 
170     /**
171      * Set text for specific {@link TextView}
172      */
setText(TextView tv, CharSequence text)173     public static boolean setText(TextView tv, CharSequence text) {
174         if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false;
175         tv.setText(text);
176         return true;
177     }
178 
179     /**
180      * Return {@code true} if it is voice capable
181      */
isVoiceCapable(Context context)182     public static boolean isVoiceCapable(Context context) {
183         final TelephonyManager telephony =
184                 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
185         return telephony != null && telephony.isVoiceCapable();
186     }
187 }
188