/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.volume; import android.content.Context; import android.media.AudioManager; import android.media.MediaMetadata; import android.media.VolumeProvider; import android.media.session.MediaController.PlaybackInfo; import android.media.session.PlaybackState; import android.telephony.TelephonyManager; import android.view.View; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Objects; /** * Static helpers for the volume dialog. */ class Util { // Note: currently not shown (only used in the text footer) private static final SimpleDateFormat HMMAA = new SimpleDateFormat("h:mm aa", Locale.US); private static int[] AUDIO_MANAGER_FLAGS = new int[] { AudioManager.FLAG_SHOW_UI, AudioManager.FLAG_VIBRATE, AudioManager.FLAG_PLAY_SOUND, AudioManager.FLAG_ALLOW_RINGER_MODES, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE, AudioManager.FLAG_SHOW_VIBRATE_HINT, AudioManager.FLAG_SHOW_SILENT_HINT, AudioManager.FLAG_FROM_KEY, AudioManager.FLAG_SHOW_UI_WARNINGS, }; private static String[] AUDIO_MANAGER_FLAG_NAMES = new String[] { "SHOW_UI", "VIBRATE", "PLAY_SOUND", "ALLOW_RINGER_MODES", "REMOVE_SOUND_AND_VIBRATE", "SHOW_VIBRATE_HINT", "SHOW_SILENT_HINT", "FROM_KEY", "SHOW_UI_WARNINGS", }; public static String logTag(Class c) { final String tag = "vol." + c.getSimpleName(); return tag.length() < 23 ? tag : tag.substring(0, 23); } public static String ringerModeToString(int ringerMode) { switch (ringerMode) { case AudioManager.RINGER_MODE_SILENT: return "RINGER_MODE_SILENT"; case AudioManager.RINGER_MODE_VIBRATE: return "RINGER_MODE_VIBRATE"; case AudioManager.RINGER_MODE_NORMAL: return "RINGER_MODE_NORMAL"; default: return "RINGER_MODE_UNKNOWN_" + ringerMode; } } public static String mediaMetadataToString(MediaMetadata metadata) { return metadata.getDescription().toString(); } public static String playbackInfoToString(PlaybackInfo info) { if (info == null) return null; final String type = playbackInfoTypeToString(info.getPlaybackType()); final String vc = volumeProviderControlToString(info.getVolumeControl()); return String.format("PlaybackInfo[vol=%s,max=%s,type=%s,vc=%s],atts=%s", info.getCurrentVolume(), info.getMaxVolume(), type, vc, info.getAudioAttributes()); } public static String playbackInfoTypeToString(int type) { switch (type) { case PlaybackInfo.PLAYBACK_TYPE_LOCAL: return "LOCAL"; case PlaybackInfo.PLAYBACK_TYPE_REMOTE: return "REMOTE"; default: return "UNKNOWN_" + type; } } public static String playbackStateStateToString(int state) { switch (state) { case PlaybackState.STATE_NONE: return "STATE_NONE"; case PlaybackState.STATE_STOPPED: return "STATE_STOPPED"; case PlaybackState.STATE_PAUSED: return "STATE_PAUSED"; case PlaybackState.STATE_PLAYING: return "STATE_PLAYING"; default: return "UNKNOWN_" + state; } } public static String volumeProviderControlToString(int control) { switch (control) { case VolumeProvider.VOLUME_CONTROL_ABSOLUTE: return "VOLUME_CONTROL_ABSOLUTE"; case VolumeProvider.VOLUME_CONTROL_FIXED: return "VOLUME_CONTROL_FIXED"; case VolumeProvider.VOLUME_CONTROL_RELATIVE: return "VOLUME_CONTROL_RELATIVE"; default: return "VOLUME_CONTROL_UNKNOWN_" + control; } } public static String playbackStateToString(PlaybackState playbackState) { if (playbackState == null) return null; return playbackStateStateToString(playbackState.getState()) + " " + playbackState; } public static String audioManagerFlagsToString(int value) { return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES); } private static String bitFieldToString(int value, int[] values, String[] names) { if (value == 0) return ""; final StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { if ((value & values[i]) != 0) { if (sb.length() > 0) sb.append(','); sb.append(names[i]); } value &= ~values[i]; } if (value != 0) { if (sb.length() > 0) sb.append(','); sb.append("UNKNOWN_").append(value); } return sb.toString(); } public static String getShortTime(long millis) { return HMMAA.format(new Date(millis)); } private static CharSequence emptyToNull(CharSequence str) { return str == null || str.length() == 0 ? null : str; } public static boolean setText(TextView tv, CharSequence text) { if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false; tv.setText(text); return true; } public static final void setVisOrGone(View v, boolean vis) { if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return; v.setVisibility(vis ? View.VISIBLE : View.GONE); } public static final void setVisOrInvis(View v, boolean vis) { if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return; v.setVisibility(vis ? View.VISIBLE : View.INVISIBLE); } public static boolean isVoiceCapable(Context context) { final TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephony != null && telephony.isVoiceCapable(); } }