| /* |
| * Copyright (C) 2019 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.settingslib.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.widget.TextView; |
| |
| import java.util.Objects; |
| |
| /** |
| * Static helpers for the volume dialog. |
| */ |
| public class Util { |
| |
| private static final 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 final 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", |
| }; |
| |
| /** |
| * Extract log tag from {@code c} |
| */ |
| public static String logTag(Class<?> c) { |
| final String tag = "vol." + c.getSimpleName(); |
| return tag.length() < 23 ? tag : tag.substring(0, 23); |
| } |
| |
| /** |
| * Convert media metadata to string |
| */ |
| public static String mediaMetadataToString(MediaMetadata metadata) { |
| if (metadata == null) return null; |
| return metadata.getDescription().toString(); |
| } |
| |
| /** |
| * Convert playback info to string |
| */ |
| 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()); |
| } |
| |
| /** |
| * Convert type of playback info to string |
| */ |
| 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; |
| } |
| } |
| |
| /** |
| * Convert state of playback info to string |
| */ |
| 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; |
| } |
| } |
| |
| /** |
| * Convert volume provider control to string |
| */ |
| 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; |
| } |
| } |
| |
| /** |
| * Convert {@link PlaybackState} to string |
| */ |
| public static String playbackStateToString(PlaybackState playbackState) { |
| if (playbackState == null) return null; |
| return playbackStateStateToString(playbackState.getState()) + " " + playbackState; |
| } |
| |
| /** |
| * Convert audio manager flags to string |
| */ |
| public static String audioManagerFlagsToString(int value) { |
| return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES); |
| } |
| |
| protected 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(); |
| } |
| |
| private static CharSequence emptyToNull(CharSequence str) { |
| return str == null || str.length() == 0 ? null : str; |
| } |
| |
| /** |
| * Set text for specific {@link TextView} |
| */ |
| public static boolean setText(TextView tv, CharSequence text) { |
| if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false; |
| tv.setText(text); |
| return true; |
| } |
| |
| /** |
| * Return {@code true} if it is voice capable |
| */ |
| public static boolean isVoiceCapable(Context context) { |
| final TelephonyManager telephony = |
| (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); |
| return telephony != null && telephony.isVoiceCapable(); |
| } |
| } |