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