package me.barrasso.android.volume.media.conditions;
import static android.media.AudioManager.*;
import android.media.AudioManager;
/**
* Similar to a {@link com.android.internal.util.Predicate} that checks
* the order of the system ringer mode transition.
*/
public class RingerModeTransition {
public RingerModeTransition() { }
/**
* @return An ordered list of the ringer modes, from
* highest to lowest (volumes [1], [0], [0] again).
*/
public int[] apply(AudioManager manager) {
// The algorithm here is to go from volume 0 (again) => 0 => 1,
// and with each change, record the ringer modes.
final int[] MODES = new int[3];
MODES[0] = RINGER_MODE_NORMAL;
final int STREAM = STREAM_RING;
final int MODE = manager.getRingerMode();
final int startVolume = manager.getStreamVolume(STREAM);
// API quirk: volume must be decremented from 1 to get ringer mode change
manager.setStreamVolume(STREAM, 1, FLAG_SHOW_UI);
manager.setRingerMode(RINGER_MODE_NORMAL);
manager.adjustStreamVolume(STREAM, ADJUST_LOWER, FLAG_SHOW_UI & FLAG_ALLOW_RINGER_MODES);
manager.adjustStreamVolume(STREAM, ADJUST_LOWER, FLAG_SHOW_UI & FLAG_ALLOW_RINGER_MODES);
MODES[2] = manager.getRingerMode();
manager.adjustStreamVolume(STREAM, ADJUST_RAISE, FLAG_SHOW_UI & FLAG_ALLOW_RINGER_MODES);
MODES[1] = manager.getRingerMode();
// There are two possible ways the device may work. It may have a silent/vibrate
// mode or it may have distinct silent and vibrate modes.
manager.setStreamVolume(STREAM, startVolume, 0);
manager.setRingerMode(MODE);
return MODES;
}
}