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