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