package me.barrasso.android.volume.utils;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.RemoteControlClient;
import android.provider.Settings;
import android.service.notification.NotificationListenerService;
import android.view.KeyEvent;
import me.barrasso.android.volume.LogUtils;
import me.barrasso.android.volume.media.VolumePanelInfo;
import me.barrasso.android.volume.popup.BlackberryVolumePanel;
import me.barrasso.android.volume.popup.CircleVolumePanel;
import me.barrasso.android.volume.popup.HeadsUpVolumePanel;
import me.barrasso.android.volume.popup.InvisibleVolumePanel;
import me.barrasso.android.volume.popup.OppoVolumePanel;
import me.barrasso.android.volume.popup.ParanoidVolumePanel;
import me.barrasso.android.volume.popup.StatusBarPlusVolumePanel;
import me.barrasso.android.volume.popup.StatusBarVolumePanel;
import me.barrasso.android.volume.popup.UberVolumePanel;
import me.barrasso.android.volume.popup.VolumeBarPanel;
import me.barrasso.android.volume.popup.VolumePanel;
import me.barrasso.android.volume.popup.WPVolumePanel;
import me.barrasso.android.volume.popup.iOSVolumePanel;
import java.lang.reflect.Field;
import java.util.Set;
import java.util.HashSet;
/**
* Constants and related methods to make referencing data more convenient.
*/
public final class Constants {
/** True if we play by Google's FUCKED UP rules (they won't even give a reason)! */
public static final boolean AGGRESSIVE_COPYRIGHT = true;
private static Set<VolumePanelInfo> VOLUME_PANELS() {
// Add all VolumePanel subclasses here for them to be referenced.
// NOTE: once order is set, it should remain so to prevent issues
// with XML/ resource arrays.
final Set<VolumePanelInfo> VOLUME_PANELS = new HashSet<>();
VOLUME_PANELS.add(InvisibleVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(StatusBarVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(HeadsUpVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(VolumeBarPanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(ParanoidVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(UberVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(StatusBarPlusVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(OppoVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(BlackberryVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(CircleVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(WPVolumePanel.VOLUME_PANEL_INFO);
VOLUME_PANELS.add(iOSVolumePanel.VOLUME_PANEL_INFO);
return VOLUME_PANELS;
}
/** @return A {@link Set} of all {@link VolumePanelInfo}. */
public static Set<VolumePanelInfo> getVolumePanelInfoSet() {
return VOLUME_PANELS();
}
/** @return The info for a given VolumePanel subclass name. */
@SuppressWarnings("unchecked")
public static VolumePanelInfo<? extends VolumePanel> getInfoForName(String name) {
Set<VolumePanelInfo> infos = VOLUME_PANELS();
for (VolumePanelInfo<? extends VolumePanel> info : infos)
if (info.prefName.equals(name)) return info;
return StatusBarVolumePanel.VOLUME_PANEL_INFO;
}
/** @return The info for a given VolumePanel subclass. */
@SuppressWarnings("unchecked")
public static VolumePanelInfo getInfoForClass(Class<? extends VolumePanel> pClass) {
Set<VolumePanelInfo> infos = VOLUME_PANELS();
for (VolumePanelInfo<? extends VolumePanel> info : infos)
if (info.clazz.equals(pClass)) return info;
return null;
}
/**
* {@link android.content.SharedPreferences} key for a String that
* corresponds to the full class name of the current volume panel.
*/
public static final String PREF_VOLUME_PANEL = VolumePanel.class.getSimpleName();
/**
* True if the user opts to display a Notification to enter foreground.
*/
public static final String PREF_FOREGROUND = "service_foreground";
public static final String PREF_REPORTING = "anonymous_reporting";
public static final String PREF_CHANGELOG = "changelog";
public static final String PREF_DISABLED_BUTTONS = "VolumeService_disabledButtons";
public static final String PREF_BLACKLIST = "VolumeService_blacklist";
/**
* Preference key for the "Send debug log" item.
*/
public static final String PREF_DEBUG_LOG = "debug_log";
public static final int RINGER_MODE_DEFAULT = 2;
public static final int RINGER_MODE_SILENT = AudioManager.RINGER_MODE_SILENT; // 0
@Deprecated public static final int RINGER_MODE_VIBRATE = AudioManager.RINGER_MODE_VIBRATE; // 1
@Deprecated public static final int RINGER_MODE_RING = 3;
@Deprecated public static final int RINGER_MODE_RING_VIBRATE = 4;
// Volume key events; nothing more, nothing less.
public static final int[] VOLUME_KEY_EVENTS = new int[] {
KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_MUTE
};
public static final String MIUI_SERVICE_NAME = "miui.os.servicemanager";
public static final String MIUI_SERVICE_DESCRIPTOR = "android.os.IMiuiServiceManager";
// Constants for AlarmManager and knowing when a system alarm is set
public static final String ALARM_SET_EXTRA = "alarmSet";
private static final String CHANGED_FIELD = "ACTION_ALARM_CHANGED";
private static final String ACTION_ALARM_CHANGED_DEFAULT = "android.intent.action.ALARM_CHANGED";
public static final String ACTION_ALARM_CHANGED;
static {
String mAction = ACTION_ALARM_CHANGED_DEFAULT;
try {
final Field mField = Intent.class.getDeclaredField(CHANGED_FIELD);
if (mField != null) {
mField.setAccessible(true);
final String mActionValue = (String) mField.get(null);
if (mActionValue != null) mAction = mActionValue;
}
} catch (Throwable t) {
mAction = ACTION_ALARM_CHANGED_DEFAULT;
}
ACTION_ALARM_CHANGED = mAction;
}
// Package name for Sony Xperia theme manager
public static final String SEMC_UXP = "com.sonyericsson.uxp";
// ========== AudioManager ==========
/**
* @hide Broadcast intent when the volume for a particular stream type changes.
* Includes the stream, the new volume and previous volumes
*
* @see #EXTRA_VOLUME_STREAM_TYPE
* @see #EXTRA_VOLUME_STREAM_VALUE
* @see #EXTRA_PREV_VOLUME_STREAM_VALUE
*/
public static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION";
/**
* @hide Broadcast intent when the master volume changes.
* Includes the new volume
*
* @see #EXTRA_MASTER_VOLUME_VALUE
* @see #EXTRA_PREV_MASTER_VOLUME_VALUE
*/
public static final String MASTER_VOLUME_CHANGED_ACTION =
"android.media.MASTER_VOLUME_CHANGED_ACTION";
/**
* @hide Broadcast intent when the master mute state changes.
* Includes the the new volume
*
* @see #EXTRA_MASTER_VOLUME_MUTED
*/
public static final String MASTER_MUTE_CHANGED_ACTION =
"android.media.MASTER_MUTE_CHANGED_ACTION";
/**
* @hide The stream type for the volume changed intent.
*/
public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";
/**
* @hide The volume associated with the stream for the volume changed intent.
*/
public static final String EXTRA_VOLUME_STREAM_VALUE =
"android.media.EXTRA_VOLUME_STREAM_VALUE";
/**
* @hide The previous volume associated with the stream for the volume changed intent.
*/
public static final String EXTRA_PREV_VOLUME_STREAM_VALUE =
"android.media.EXTRA_PREV_VOLUME_STREAM_VALUE";
/**
* @hide The new master volume value for the master volume changed intent.
* Value is integer between 0 and 100 inclusive.
*/
public static final String EXTRA_MASTER_VOLUME_VALUE =
"android.media.EXTRA_MASTER_VOLUME_VALUE";
/**
* @hide The previous master volume value for the master volume changed intent.
* Value is integer between 0 and 100 inclusive.
*/
public static final String EXTRA_PREV_MASTER_VOLUME_VALUE =
"android.media.EXTRA_PREV_MASTER_VOLUME_VALUE";
/**
* @hide The new master volume mute state for the master mute changed intent.
* Value is boolean
*/
public static final String EXTRA_MASTER_VOLUME_MUTED =
"android.media.EXTRA_MASTER_VOLUME_MUTED";
/**
* Sticky broadcast intent action indicating that the bluetoooth SCO audio
* connection state has changed. The intent contains on extra {@link #EXTRA_SCO_AUDIO_STATE}
* indicating the new state which is either {@link #SCO_AUDIO_STATE_DISCONNECTED}
* or {@link #SCO_AUDIO_STATE_CONNECTED}
*
* @deprecated Use {@link #ACTION_SCO_AUDIO_STATE_UPDATED} instead
*/
public static final String ACTION_SCO_AUDIO_STATE_CHANGED =
"android.media.SCO_AUDIO_STATE_CHANGED";
/**
* Sticky broadcast intent action indicating that the bluetoooth SCO audio
* connection state has been updated.
* <p>This intent has two extras:
* <ul>
* <li> {@link #EXTRA_SCO_AUDIO_STATE} - The new SCO audio state. </li>
* <li> {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}- The previous SCO audio state. </li>
* </ul>
* <p> EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE can be any of:
* <ul>
* <li> {@link #SCO_AUDIO_STATE_DISCONNECTED}, </li>
* <li> {@link #SCO_AUDIO_STATE_CONNECTING} or </li>
* <li> {@link #SCO_AUDIO_STATE_CONNECTED}, </li>
* </ul>
*/
public static final String ACTION_SCO_AUDIO_STATE_UPDATED =
"android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
/**
* Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} or
* {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the new bluetooth SCO connection state.
*/
public static final String EXTRA_SCO_AUDIO_STATE =
"android.media.extra.SCO_AUDIO_STATE";
/**
* Extra for intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the previous
* bluetooth SCO connection state.
*/
public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE =
"android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
/**
* Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
* indicating that the SCO audio channel is not established
*/
public static final int SCO_AUDIO_STATE_DISCONNECTED = 0;
/**
* Value for extra {@link #EXTRA_SCO_AUDIO_STATE} or {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}
* indicating that the SCO audio channel is established
*/
public static final int SCO_AUDIO_STATE_CONNECTED = 1;
/**
* Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
* indicating that the SCO audio channel is being established
*/
public static final int SCO_AUDIO_STATE_CONNECTING = 2;
/**
* Value for extra EXTRA_SCO_AUDIO_STATE indicating that
* there was an error trying to obtain the state
*/
public static final int SCO_AUDIO_STATE_ERROR = -1;
// Found in ParanoidAndroid... maybe elsewhere?
public static final String ACTION_VOLUMEPANEL_SHOWN = "android.view.volumepanel.SHOWN";
public static final String ACTION_VOLUMEPANEL_HIDDEN = "android.view.volumepanel.HIDDEN";
// Oppo (probably not others)
private static final String ACTION_MEDIA_VOLUME_MODE_CHANGED = "action_media_volume_mode_changed";
private static final String ACTION_SKIN_CHANGED = "android.intent.action.SKIN_CHANGED";
private static final String ACTION_SYSTEM_VOLUME_MODE_CHANGED = "action_system_volume_mode_changed";
/**
* Bluetooth Headset volume. This is used internally, changing this value will
* not change the volume. See AudioManager.
*/
public static final String VOLUME_BLUETOOTH_SCO = "volume_bluetooth_sco";
/**
* Master volume (float in the range 0.0f to 1.0f).
* @hide
*/
public static final String VOLUME_MASTER = "volume_master";
/**
* Master volume mute (int 1 = mute, 0 = not muted).
*
* @hide
*/
public static final String VOLUME_MASTER_MUTE = "volume_master_mute";
/**
* Whether the notifications should use the ring volume (value of 1) or
* a separate notification volume (value of 0). In most cases, users
* will have this enabled so the notification and ringer volumes will be
* the same. However, power users can disable this and use the separate
* notification volume control.
* <p>
* Note: This is a one-off setting that will be removed in the future
* when there is profile support. For this reason, it is kept hidden
* from the public APIs.
*
* @hide
* @deprecated
*/
@Deprecated
public static final String NOTIFICATIONS_USE_RING_VOLUME =
"notifications_use_ring_volume";
/**
* Volume Adjust Sounds Enable, This is the noise made when using volume hard buttons
* Defaults to 1 - sounds enabled
* @hide
*/
public static final String VOLUME_ADJUST_SOUNDS_ENABLED = "volume_adjust_sounds_enabled";
/**
* Boolean value whether to link ringtone and notification volumes
*
* @hide
*/
public static final String VOLUME_LINK_NOTIFICATION = "volume_link_notification";
/**
* Indicates to VolumePanel that the volume slider should be disabled as user
* cannot change the stream volume
* @hide
*/
public static final int FLAG_FIXED_VOLUME = 1 << 5; // android.media.AudioManager
// From Android L Preview
public static final String SYSTEMUI_VOLUME_CONTROLLER = "systemui_volume_controller";
public static final String ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
// Zen Mode from Settings.Global
public static final String ZEN_MODE = "zen_mode";
public static final int ZENMODE_ALL = 0;
public static final int ZENMODE_PRIORITY = 1;
public static final int ZENMODE_NONE = 2;
public static final int ZEN_MODE_OFF = 0;
public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
public static final int ZEN_MODE_NO_INTERRUPTIONS = 2;
public int getZenModeListenerInterruptionFilter(int mZenMode) {
switch (mZenMode) {
case ZEN_MODE_OFF:
return NotificationListenerService.INTERRUPTION_FILTER_ALL;
case ZEN_MODE_IMPORTANT_INTERRUPTIONS:
return NotificationListenerService.INTERRUPTION_FILTER_PRIORITY;
case ZEN_MODE_NO_INTERRUPTIONS:
return NotificationListenerService.INTERRUPTION_FILTER_NONE;
default:
return NotificationListenerService.INTERRUPTION_FILTER_NONE;
}
}
private static int zenModeFromListenerInterruptionFilter(int listenerInterruptionFilter) {
switch (listenerInterruptionFilter) {
case NotificationListenerService.INTERRUPTION_FILTER_ALL:
return ZEN_MODE_OFF;
case NotificationListenerService.INTERRUPTION_FILTER_PRIORITY:
return ZEN_MODE_IMPORTANT_INTERRUPTIONS;
case NotificationListenerService.INTERRUPTION_FILTER_NONE:
return ZEN_MODE_NO_INTERRUPTIONS;
default:
return ZEN_MODE_OFF;
}
}
public static String zenModeToString(int mode) {
if (mode == ZEN_MODE_IMPORTANT_INTERRUPTIONS) return "ZEN_MODE_IMPORTANT_INTERRUPTIONS";
if (mode == ZEN_MODE_NO_INTERRUPTIONS) return "ZEN_MODE_NO_INTERRUPTIONS";
return "ZEN_MODE_OFF";
}
/**
* Persisted safe headphone volume management state by AudioService
* @hide
*/
public static final String AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state"; // Settings.Global
/**
* Safe headset volume warning option (found on CyanogenMod ROMS)
* @hide
*/
public static final String SAFE_HEADSET_VOLUME = "safe_headset_volume";
// mSafeMediaVolumeState indicates whether the media volume is limited over headphones.
// It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected
// or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or
// SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it
// can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume()
// (when user opts out).
public static final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0; // From AudioService
public static final int SAFE_MEDIA_VOLUME_DISABLED = 1;
public static final int SAFE_MEDIA_VOLUME_INACTIVE = 2;
public static final int SAFE_MEDIA_VOLUME_ACTIVE = 3;
// HTC-specific action when the device is about to turn off.
/** @see {@link android.content.Intent#ACTION_SHUTDOWN} */
public static final String ACTION_QUICKBOOT_OFF = "android.intent.action.QUICKBOOT_POWEROFF";
/**
* Persistent store for the system default media button event receiver.
*/
private static String MEDIA_BUTTON_RECEIVER = null;
public static String getMediaButtonReceiver() {
try {
Field field = Settings.System.class.getDeclaredField("MEDIA_BUTTON_RECEIVER");
if (null != field) {
field.setAccessible(true);
String mbr = (String) field.get(null);
MEDIA_BUTTON_RECEIVER = mbr;
return MEDIA_BUTTON_RECEIVER;
}
} catch (Throwable t) {
LogUtils.LOGE("Constants", "getMediaButtonReceiver()", t);
}
MEDIA_BUTTON_RECEIVER = "media_button_receiver";
return MEDIA_BUTTON_RECEIVER;
}
private static String ENABLED_NOTIFICATION_LISTENERS = null;
public static String getEnabledNotificationListeners() {
try {
Field field = Settings.Secure.class.getDeclaredField("ENABLED_NOTIFICATION_LISTENERS");
if (null != field) {
field.setAccessible(true);
String mbr = (String) field.get(null);
ENABLED_NOTIFICATION_LISTENERS = mbr;
return ENABLED_NOTIFICATION_LISTENERS;
}
} catch (Throwable t) {
LogUtils.LOGE("Constants", "getEnabledNotificationListeners()", t);
}
ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
return ENABLED_NOTIFICATION_LISTENERS;
}
public static final String KEY_VIBRATE = "vibrate_when_ringing"; // Settings.System
public static final String KEY_RING_VOLUME = "ring_volume"; // Settings.System
/** Intents used to represent media events. */
public static IntentFilter MEDIA_ACTION_FILTER() {
final IntentFilter MEDIA_ACTION_FILTER = new IntentFilter();
MEDIA_ACTION_FILTER.addAction("com.android.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.android.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.android.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.android.music.queuechanged");
MEDIA_ACTION_FILTER.addAction("com.android.music.musicservicecommand.togglepause");
MEDIA_ACTION_FILTER.addAction("com.android.music.musicservicecommand.pause");
MEDIA_ACTION_FILTER.addAction("com.android.music.musicservicecommand.previous");
MEDIA_ACTION_FILTER.addAction("com.android.music.musicservicecommand.next");
MEDIA_ACTION_FILTER.addAction("com.android.music.musicservicecommand");
MEDIA_ACTION_FILTER.addAction("com.android.music.togglepause");
MEDIA_ACTION_FILTER.addAction("com.android.music.pause");
MEDIA_ACTION_FILTER.addAction("com.android.music.previous");
MEDIA_ACTION_FILTER.addAction("com.android.music.next");
MEDIA_ACTION_FILTER.addAction("com.android.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.htc.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.htc.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.android.music.metachanged");
MEDIA_ACTION_FILTER.addAction("fm.last.android.metachanged");
MEDIA_ACTION_FILTER.addAction("com.sec.android.app.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.amazon.mp3.metachanged");
MEDIA_ACTION_FILTER.addAction("com.amazon.mp3.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.miui.player.metachanged");
MEDIA_ACTION_FILTER.addAction("com.miui.player.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.miui.player.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.real.IMP.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.real.IMP.metachanged");
MEDIA_ACTION_FILTER.addAction("com.real.IMP.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.real.RealPlayer.metachanged");
MEDIA_ACTION_FILTER.addAction("com.real.RealPlayer.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.real.RealPlayer.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.rdio.android.metachanged");
MEDIA_ACTION_FILTER.addAction("com.rdio.android.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.andrew.apollo.metachanged");
MEDIA_ACTION_FILTER.addAction("net.jjc1138.android.scrobbler.action.MUSIC_STATUS");
MEDIA_ACTION_FILTER.addAction("com.adam.aslfms.notify.playstatechanged");
MEDIA_ACTION_FILTER.addAction("gonemad.dashclock.music.metachanged");
MEDIA_ACTION_FILTER.addAction("gonemad.dashclock.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("gonemad.dashclock.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.mog.android.action.PLAY_OR_PAUSE_ACTION");
MEDIA_ACTION_FILTER.addAction("com.mog.android.action.ANNOUNCE_PLAYBACK_INFO");
MEDIA_ACTION_FILTER.addAction("com.musixmatch.android.lyrify.service.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.musixmatch.android.lyrify.metachanged");
MEDIA_ACTION_FILTER.addAction("com.musixmatch.android.lyrify.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playbackcontrol.ACTION_PLAYBACK_PLAY");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playbackcontrol.ACTION_PLAYBACK_PAUSE");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playbackcontrol.ACTION_TRACK_STARTED");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playbackcontrol.ACTION_PAUSED");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.TRACK_COMPLETED");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.sonyericsson.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.MusicPlayer.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.MusicPlayer.metachanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.MusicPlayer.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.samsung.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.metachanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.metachanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.samsung.sec.android.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.MusicPlayer.metachanged");
MEDIA_ACTION_FILTER.addAction("com.samsung.MusicPlayer.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.samsung.MusicPlayer.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.spotify.mobile.android.playbackstatechanged");
MEDIA_ACTION_FILTER.addAction("com.spotify.mobile.android.metadatachanged");
MEDIA_ACTION_FILTER.addAction("com.nullsoft.winamp.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.nullsoft.winamp.metachanged");
MEDIA_ACTION_FILTER.addAction("com.nullsoft.winamp.playstatechanged");
// MEDIA_ACTION_FILTER.addAction("app.odesanmi.and.wpmusic.SERVICECLOSE");
// MEDIA_ACTION_FILTER.addAction("app.odesanmi.and.wpmusic.SERVICECHANGE");
// MEDIA_ACTION_FILTER.addAction("app.odesanmi.and.wpmusic.togglepause");
MEDIA_ACTION_FILTER.addAction("com.doubleTwist.androidPlayer.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.doubleTwist.androidPlayer.metachanged");
MEDIA_ACTION_FILTER.addAction("com.doubleTwist.androidPlayer.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerprotrial.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerprotrial.metachanged");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerprotrial.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerpro.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerpro.metachanged");
MEDIA_ACTION_FILTER.addAction("com.tbig.playerpro.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.AnotherMusicPlayer.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.AnotherMusicPlayer.metachanged");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.AnotherMusicPlayer.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.jrtstudio.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.lge.music.playstatechanged");
MEDIA_ACTION_FILTER.addAction("com.lge.music.metachanged");
MEDIA_ACTION_FILTER.addAction("com.lge.music.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("com.lge.music.endofplayback");
MEDIA_ACTION_FILTER.addAction("com.rhapsody.playstatechanged");
MEDIA_ACTION_FILTER.addAction("org.iii.romulus.meridian.playstatechanged");
MEDIA_ACTION_FILTER.addAction("org.iii.romulus.meridian.metachanged");
MEDIA_ACTION_FILTER.addAction("org.iii.romulus.meridian.playbackcomplete");
MEDIA_ACTION_FILTER.addAction("org.abrantix.rockon.rockonnggl.playstatechanged");
MEDIA_ACTION_FILTER.addAction("org.abrantix.rockon.rockonnggl.metachanged");
MEDIA_ACTION_FILTER.addAction("org.abrantix.rockon.rockonnggl.playbackcomplete");
return MEDIA_ACTION_FILTER;
}
public static boolean isRemoteControlPlaying(final int state) {
switch (state) {
case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS:
case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS:
case RemoteControlClient.PLAYSTATE_BUFFERING:
case RemoteControlClient.PLAYSTATE_FAST_FORWARDING:
case RemoteControlClient.PLAYSTATE_PLAYING:
case RemoteControlClient.PLAYSTATE_REWINDING:
return true;
}
return false;
}
public static int adjustIndex(final int index, final int max, final int direction) {
switch (direction) {
case AudioManager.ADJUST_LOWER:
return Math.max(index - 1, 0);
case AudioManager.ADJUST_RAISE:
return Math.min(index + 1, max);
case AudioManager.ADJUST_SAME:
return index;
default:
return 0;
}
}
/*
* AudioPolicyService methods
*/
/* modes for setPhoneState, must match AudioSystem.h audio_mode */
public static final int MODE_INVALID = -2;
public static final int MODE_CURRENT = -1;
public static final int MODE_NORMAL = 0;
public static final int MODE_RINGTONE = 1;
public static final int MODE_IN_CALL = 2;
public static final int MODE_IN_COMMUNICATION = 3;
public static final int NUM_MODES = 4;
//
// audio device definitions: must be kept in sync with values in system/core/audio.h
//
// reserved bits
public static final int DEVICE_BIT_IN = 0x80000000;
public static final int DEVICE_BIT_DEFAULT = 0x40000000;
// output devices, be sure to update AudioManager.java also
public static final int DEVICE_OUT_EARPIECE = 0x1;
public static final int DEVICE_OUT_SPEAKER = 0x2;
public static final int DEVICE_OUT_WIRED_HEADSET = 0x4;
public static final int DEVICE_OUT_WIRED_HEADPHONE = 0x8;
public static final int DEVICE_OUT_BLUETOOTH_SCO = 0x10;
public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20;
public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40;
public static final int DEVICE_OUT_BLUETOOTH_A2DP = 0x80;
public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100;
public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200;
public static final int DEVICE_OUT_AUX_DIGITAL = 0x400;
public static final int DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800;
public static final int DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000;
public static final int DEVICE_OUT_USB_ACCESSORY = 0x2000;
public static final int DEVICE_OUT_USB_DEVICE = 0x4000;
public static final int DEVICE_OUT_REMOTE_SUBMIX = 0x8000;
public static final int DEVICE_OUT_DEFAULT = DEVICE_BIT_DEFAULT;
public static final int DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE |
DEVICE_OUT_SPEAKER |
DEVICE_OUT_WIRED_HEADSET |
DEVICE_OUT_WIRED_HEADPHONE |
DEVICE_OUT_BLUETOOTH_SCO |
DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
DEVICE_OUT_BLUETOOTH_SCO_CARKIT |
DEVICE_OUT_BLUETOOTH_A2DP |
DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER |
DEVICE_OUT_AUX_DIGITAL |
DEVICE_OUT_ANLG_DOCK_HEADSET |
DEVICE_OUT_DGTL_DOCK_HEADSET |
DEVICE_OUT_USB_ACCESSORY |
DEVICE_OUT_USB_DEVICE |
DEVICE_OUT_REMOTE_SUBMIX |
DEVICE_OUT_DEFAULT);
public static final int DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP |
DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER);
public static final int DEVICE_OUT_ALL_SCO = (DEVICE_OUT_BLUETOOTH_SCO |
DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
DEVICE_OUT_BLUETOOTH_SCO_CARKIT);
public static final int DEVICE_OUT_ALL_USB = (DEVICE_OUT_USB_ACCESSORY |
DEVICE_OUT_USB_DEVICE);
// input devices
public static final int DEVICE_IN_COMMUNICATION = DEVICE_BIT_IN | 0x1;
public static final int DEVICE_IN_AMBIENT = DEVICE_BIT_IN | 0x2;
public static final int DEVICE_IN_BUILTIN_MIC = DEVICE_BIT_IN | 0x4;
public static final int DEVICE_IN_BLUETOOTH_SCO_HEADSET = DEVICE_BIT_IN | 0x8;
public static final int DEVICE_IN_WIRED_HEADSET = DEVICE_BIT_IN | 0x10;
public static final int DEVICE_IN_AUX_DIGITAL = DEVICE_BIT_IN | 0x20;
public static final int DEVICE_IN_VOICE_CALL = DEVICE_BIT_IN | 0x40;
public static final int DEVICE_IN_BACK_MIC = DEVICE_BIT_IN | 0x80;
public static final int DEVICE_IN_REMOTE_SUBMIX = DEVICE_BIT_IN | 0x100;
public static final int DEVICE_IN_ANLG_DOCK_HEADSET = DEVICE_BIT_IN | 0x200;
public static final int DEVICE_IN_DGTL_DOCK_HEADSET = DEVICE_BIT_IN | 0x400;
public static final int DEVICE_IN_USB_ACCESSORY = DEVICE_BIT_IN | 0x800;
public static final int DEVICE_IN_USB_DEVICE = DEVICE_BIT_IN | 0x1000;
public static final int DEVICE_IN_DEFAULT = DEVICE_BIT_IN | DEVICE_BIT_DEFAULT;
public static final int DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION |
DEVICE_IN_AMBIENT |
DEVICE_IN_BUILTIN_MIC |
DEVICE_IN_BLUETOOTH_SCO_HEADSET |
DEVICE_IN_WIRED_HEADSET |
DEVICE_IN_AUX_DIGITAL |
DEVICE_IN_VOICE_CALL |
DEVICE_IN_BACK_MIC |
DEVICE_IN_REMOTE_SUBMIX |
DEVICE_IN_ANLG_DOCK_HEADSET |
DEVICE_IN_DGTL_DOCK_HEADSET |
DEVICE_IN_USB_ACCESSORY |
DEVICE_IN_USB_DEVICE |
DEVICE_IN_DEFAULT);
public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET;
// device states, must match AudioSystem::device_connection_state
public static final int DEVICE_STATE_UNAVAILABLE = 0;
public static final int DEVICE_STATE_AVAILABLE = 1;
private static final int NUM_DEVICE_STATES = 1;
public static final String DEVICE_OUT_EARPIECE_NAME = "earpiece";
public static final String DEVICE_OUT_SPEAKER_NAME = "speaker";
public static final String DEVICE_OUT_WIRED_HEADSET_NAME = "headset";
public static final String DEVICE_OUT_WIRED_HEADPHONE_NAME = "headphone";
public static final String DEVICE_OUT_BLUETOOTH_SCO_NAME = "bt_sco";
public static final String DEVICE_OUT_BLUETOOTH_SCO_HEADSET_NAME = "bt_sco_hs";
public static final String DEVICE_OUT_BLUETOOTH_SCO_CARKIT_NAME = "bt_sco_carkit";
public static final String DEVICE_OUT_BLUETOOTH_A2DP_NAME = "bt_a2dp";
public static final String DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES_NAME = "bt_a2dp_hp";
public static final String DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER_NAME = "bt_a2dp_spk";
public static final String DEVICE_OUT_AUX_DIGITAL_NAME = "aux_digital";
public static final String DEVICE_OUT_ANLG_DOCK_HEADSET_NAME = "analog_dock";
public static final String DEVICE_OUT_DGTL_DOCK_HEADSET_NAME = "digital_dock";
public static final String DEVICE_OUT_USB_ACCESSORY_NAME = "usb_accessory";
public static final String DEVICE_OUT_USB_DEVICE_NAME = "usb_device";
public static final String DEVICE_OUT_REMOTE_SUBMIX_NAME = "remote_submix";
public static String getDeviceName(int device)
{
switch(device) {
case DEVICE_OUT_EARPIECE:
return DEVICE_OUT_EARPIECE_NAME;
case DEVICE_OUT_SPEAKER:
return DEVICE_OUT_SPEAKER_NAME;
case DEVICE_OUT_WIRED_HEADSET:
return DEVICE_OUT_WIRED_HEADSET_NAME;
case DEVICE_OUT_WIRED_HEADPHONE:
return DEVICE_OUT_WIRED_HEADPHONE_NAME;
case DEVICE_OUT_BLUETOOTH_SCO:
return DEVICE_OUT_BLUETOOTH_SCO_NAME;
case DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
return DEVICE_OUT_BLUETOOTH_SCO_HEADSET_NAME;
case DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
return DEVICE_OUT_BLUETOOTH_SCO_CARKIT_NAME;
case DEVICE_OUT_BLUETOOTH_A2DP:
return DEVICE_OUT_BLUETOOTH_A2DP_NAME;
case DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES:
return DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES_NAME;
case DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER:
return DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER_NAME;
case DEVICE_OUT_AUX_DIGITAL:
return DEVICE_OUT_AUX_DIGITAL_NAME;
case DEVICE_OUT_ANLG_DOCK_HEADSET:
return DEVICE_OUT_ANLG_DOCK_HEADSET_NAME;
case DEVICE_OUT_DGTL_DOCK_HEADSET:
return DEVICE_OUT_DGTL_DOCK_HEADSET_NAME;
case DEVICE_OUT_USB_ACCESSORY:
return DEVICE_OUT_USB_ACCESSORY_NAME;
case DEVICE_OUT_USB_DEVICE:
return DEVICE_OUT_USB_DEVICE_NAME;
case DEVICE_OUT_REMOTE_SUBMIX:
return DEVICE_OUT_REMOTE_SUBMIX_NAME;
case DEVICE_OUT_DEFAULT:
default:
return "";
}
}
// From DeskClock
public static class Alarm {
// This action triggers the AlarmReceiver as well as the AlarmKlaxon. It
// is a public action used in the manifest for receiving Alarm broadcasts
// from the alarm manager.
public static final String ALARM_ALERT_ACTION = "com.android.deskclock.ALARM_ALERT";
// A public action sent by AlarmKlaxon when the alarm has stopped sounding
// for any reason (e.g. because it has been dismissed from AlarmAlertFullScreen,
// or killed due to an incoming phone call, etc).
public static final String ALARM_DONE_ACTION = "com.android.deskclock.ALARM_DONE";
// AlarmAlertFullScreen listens for this broadcast intent, so that other applications
// can snooze the alarm (after ALARM_ALERT_ACTION and before ALARM_DONE_ACTION).
public static final String ALARM_SNOOZE_ACTION = "com.android.deskclock.ALARM_SNOOZE";
// AlarmAlertFullScreen listens for this broadcast intent, so that other applications
// can dismiss the alarm (after ALARM_ALERT_ACTION and before ALARM_DONE_ACTION).
public static final String ALARM_DISMISS_ACTION = "com.android.deskclock.ALARM_DISMISS";
// A public action sent by AlarmAlertFullScreen when a snoozed alarm was dismissed due
// to it handling ALARM_DISMISS_ACTION cancelled
public static final String ALARM_SNOOZE_CANCELLED = "com.android.deskclock.ALARM_SNOOZE_CANCELLED";
// A broadcast sent every time the next alarm time is set in the system
public static final String NEXT_ALARM_TIME_SET = "com.android.deskclock.NEXT_ALARM_TIME_SET";
// This is a private action used by the AlarmKlaxon to update the UI to
// show the alarm has been killed.
public static final String ALARM_KILLED = "alarm_killed";
// Extra in the ALARM_KILLED intent to indicate to the user how long the
// alarm played before being killed.
public static final String ALARM_KILLED_TIMEOUT = "alarm_killed_timeout";
// Extra in the ALARM_KILLED intent to indicate when alarm was replaced
public static final String ALARM_REPLACED = "alarm_replaced";
// This string is used to indicate a silent alarm in the db.
public static final String ALARM_ALERT_SILENT = "silent";
// This intent is sent from the notification when the user cancels the
// snooze alert.
public static final String CANCEL_SNOOZE = "cancel_snooze";
// This string is used when passing an Alarm object through an intent.
public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";
// This extra is the raw Alarm object data. It is used in the
// AlarmManagerService to avoid a ClassNotFoundException when filling in
// the Intent extras.
public static final String ALARM_RAW_DATA = "intent.extra.alarm_raw";
private static final String PREF_SNOOZE_IDS = "snooze_ids";
private static final String PREF_SNOOZE_TIME = "snooze_time";
private final static String DM12 = "E h:mm aa";
private final static String DM24 = "E kk:mm";
private final static String M12 = "h:mm aa";
// Shared with DigitalClock
final static String M24 = "kk:mm";
final static int INVALID_ALARM_ID = -1;
}
}