blob: 4e770aeb861e973018f9f6722ae7ee13b5cbd975 [file] [log] [blame]
/*
* 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();
}
}