AudioManager.java revision 098d580cc2bb6c0891c756a4e5230c6c6b0d2376
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType;
21f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.app.PendingIntent;
22d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
24f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Triviimport android.content.Intent;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
28d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport android.os.Looper;
29d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport android.os.Message;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
3186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.os.SystemClock;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
35d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Triviimport android.view.KeyEvent;
3686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.view.VolumePanel;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Triviimport java.util.HashMap;
39d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioManager provides access to volume and ringer mode control.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use <code>Context.getSystemService(Context.AUDIO_SERVICE)</code> to get
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an instance of this class.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AudioManager {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
4986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    private long mVolumeKeyUpTime;
50cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood    private final boolean mUseMasterVolume;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String TAG = "AudioManager";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent, a hint for applications that audio is about to become
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 'noisy' due to a change in audio outputs. For example, this intent may
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be sent when a wired headset is unplugged, or when an A2DP audio
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sink is disconnected, and the audio system is about to automatically
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * switch audio route to the speaker. Applications that are controlling
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * audio streams may consider pausing, reducing volume or some other action
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on receipt of this intent so as not to surprise the user with audio
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the speaker.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sticky broadcast intent action indicating that the ringer mode has
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changed. Includes the new ringer mode.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_RINGER_MODE
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The new ringer mode.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RINGER_MODE_CHANGED_ACTION
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RINGER_MODE_NORMAL
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RINGER_MODE_SILENT
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RINGER_MODE_VIBRATE
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent action indicating that the vibrate setting has
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changed. Includes the vibrate type and its new setting.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VIBRATE_TYPE
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VIBRATE_SETTING
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
930dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String VIBRATE_SETTING_CHANGED_ACTION =
940dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.VIBRATE_SETTING_CHANGED";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide Broadcast intent when the volume for a particular stream type changes.
989ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent     * Includes the stream, the new volume and previous volumes
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VOLUME_STREAM_TYPE
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VOLUME_STREAM_VALUE
1029ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent     * @see #EXTRA_PREV_VOLUME_STREAM_VALUE
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION";
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1080dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @hide Broadcast intent when the master volume changes.
1090dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * Includes the new volume
1100dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     *
1110dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @see #EXTRA_MASTER_VOLUME_VALUE
1120dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @see #EXTRA_PREV_MASTER_VOLUME_VALUE
1130dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     */
1140dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1150dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String MASTER_VOLUME_CHANGED_ACTION =
1160dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.MASTER_VOLUME_CHANGED_ACTION";
1170dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood
1180dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    /**
1190dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @hide Broadcast intent when the master mute state changes.
1200dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * Includes the the new volume
1210dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     *
1220dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @see #EXTRA_MASTER_VOLUME_MUTED
1230dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     */
1240dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1250dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String MASTER_MUTE_CHANGED_ACTION =
1260dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.MASTER_MUTE_CHANGED_ACTION";
1270dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood
1280dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The new vibrate setting for a particular type.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_SETTING_CHANGED_ACTION
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VIBRATE_TYPE
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_SETTING_ON
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_SETTING_OFF
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_SETTING_ONLY_SILENT
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The vibrate type whose setting has changed.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_SETTING_CHANGED_ACTION
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_TYPE_NOTIFICATION
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #VIBRATE_TYPE_RINGER
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide The stream type for the volume changed intent.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide The volume associated with the stream for the volume changed intent.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_VOLUME_STREAM_VALUE =
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "android.media.EXTRA_VOLUME_STREAM_VALUE";
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent    /**
1609ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent     * @hide The previous volume associated with the stream for the volume changed intent.
1619ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent     */
1629ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent    public static final String EXTRA_PREV_VOLUME_STREAM_VALUE =
1639ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent        "android.media.EXTRA_PREV_VOLUME_STREAM_VALUE";
1640dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood
1650dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    /**
1660dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @hide The new master volume value for the master volume changed intent.
1670dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * Value is integer between 0 and 100 inclusive.
1680dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     */
1690dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String EXTRA_MASTER_VOLUME_VALUE =
1700dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.EXTRA_MASTER_VOLUME_VALUE";
1710dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood
1720dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    /**
1730dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @hide The previous master volume value for the master volume changed intent.
1740dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * Value is integer between 0 and 100 inclusive.
1750dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     */
1760dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String EXTRA_PREV_MASTER_VOLUME_VALUE =
1770dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.EXTRA_PREV_MASTER_VOLUME_VALUE";
1780dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood
1790dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    /**
1800dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * @hide The new master volume mute state for the master mute changed intent.
1810dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     * Value is boolean
1820dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood     */
1830dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood    public static final String EXTRA_MASTER_VOLUME_MUTED =
1840dc37cce9d564ae43883c8dc8672b9266b881e63Mike Lockwood        "android.media.EXTRA_MASTER_VOLUME_MUTED";
1859ce379aef155e0c21b5d82d8dc713c62792e4f30Eric Laurent
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for phone calls */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for system sounds */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for the phone ring */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_RING = AudioSystem.STREAM_RING;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for music playback */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for alarms */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The audio stream for notifications */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide The audio stream for phone calls when connected to bluetooth */
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STREAM_BLUETOOTH_SCO = AudioSystem.STREAM_BLUETOOTH_SCO;
200a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    /** @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */
201a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public static final int STREAM_SYSTEM_ENFORCED = AudioSystem.STREAM_SYSTEM_ENFORCED;
202a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    /** The audio stream for DTMF Tones */
203a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public static final int STREAM_DTMF = AudioSystem.STREAM_DTMF;
204a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    /** @hide The audio stream for text to speech (TTS) */
205a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public static final int STREAM_TTS = AudioSystem.STREAM_TTS;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Number of audio streams */
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated Use AudioSystem.getNumStreamTypes() instead
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int NUM_STREAMS = AudioSystem.NUM_STREAMS;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**  @hide Default volume index values for audio streams */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4,  // STREAM_VOICE_CALL
2169d85d5adf90e7363304e2d4a22d60a2114bb7ab9Eric Laurent        7,  // STREAM_SYSTEM
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5,  // STREAM_RING
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        11, // STREAM_MUSIC
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6,  // STREAM_ALARM
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5,  // STREAM_NOTIFICATION
221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        7,  // STREAM_BLUETOOTH_SCO
2229d85d5adf90e7363304e2d4a22d60a2114bb7ab9Eric Laurent        7,  // STREAM_SYSTEM_ENFORCED
223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        11, // STREAM_DTMF
224a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        11  // STREAM_TTS
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Increase the ringer volume.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADJUST_RAISE = 1;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decrease the ringer volume.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADJUST_LOWER = -1;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maintain the previous ringer volume. This may be useful when needing to
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * show the volume toast without actually modifying the volume.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ADJUST_SAME = 0;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Flags should be powers of 2!
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show a toast containing the current volume.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRingerMode(int)
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SHOW_UI = 1 << 0;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether to include ringer modes as possible options when changing volume.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, if true and volume level is 0 and the volume is adjusted
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with {@link #ADJUST_LOWER}, then the ringer mode may switch the silent or
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vibrate mode.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * By default this is on for the ring stream. If this flag is included,
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this behavior will be present regardless of the stream type being
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * affected by the ringer mode.
273105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_ALLOW_RINGER_MODES = 1 << 1;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether to play a sound when changing the volume.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this is given to {@link #adjustVolume(int, int)} or
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #adjustSuggestedStreamVolume(int, int, int)}, it may be ignored
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in some cases (for example, the decided stream type is not
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link AudioManager#STREAM_RING}, or the volume is being adjusted
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * downward).
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_PLAY_SOUND = 1 << 2;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes any sounds/vibrate that may be in the queue, or are playing (related to
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing volume).
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 1 << 3;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether to vibrate if going into the vibrate ringer mode.
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_VIBRATE = 1 << 4;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ringer mode that will be silent and will not vibrate. (This overrides the
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vibrate setting.)
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRingerMode(int)
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getRingerMode()
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RINGER_MODE_SILENT = 0;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ringer mode that will be silent and will vibrate. (This will cause the
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * phone ringer to always vibrate, but the notification vibrate to only
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vibrate if set.)
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRingerMode(int)
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getRingerMode()
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RINGER_MODE_VIBRATE = 1;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ringer mode that may be audible and may vibrate. It will be audible if
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the volume before changing out of this mode was audible. It will vibrate
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if the vibrate setting is on.
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRingerMode(int)
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getRingerMode()
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RINGER_MODE_NORMAL = 2;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33472668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent    // maximum valid ringer mode value. Values must start from 0 and be contiguous.
33572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent    private static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL;
33672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate type that corresponds to the ringer.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #shouldVibrate(int)
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VIBRATE_TYPE_RINGER = 0;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate type that corresponds to notifications.
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #shouldVibrate(int)
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VIBRATE_TYPE_NOTIFICATION = 1;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate setting that suggests to never vibrate.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VIBRATE_SETTING_OFF = 0;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate setting that suggests to vibrate when possible.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VIBRATE_SETTING_ON = 1;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate setting that suggests to only vibrate when in the vibrate ringer
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mode.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VIBRATE_SETTING_ONLY_SILENT = 2;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Suggests using the default stream type. This may not be used in all
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * places a stream type is needed.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int USE_DEFAULT_STREAM_TYPE = Integer.MIN_VALUE;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static IAudioService sService;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AudioManager(Context context) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
393cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood        mUseMasterVolume = mContext.getResources().getBoolean(
394cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                com.android.internal.R.bool.config_useMasterVolume);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static IAudioService getService()
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = IAudioService.Stub.asInterface(b);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     * @hide
40986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     */
410ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    public void preDispatchKeyEvent(KeyEvent event, int stream) {
41186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        /*
41286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato         * If the user hits another key within the play sound delay, then
41386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato         * cancel the sound
41486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato         */
415ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        int keyCode = event.getKeyCode();
41686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        if (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_VOLUME_UP
41786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                && keyCode != KeyEvent.KEYCODE_VOLUME_MUTE
41886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                && mVolumeKeyUpTime + VolumePanel.PLAY_SOUND_DELAY
41986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                        > SystemClock.uptimeMillis()) {
42086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            /*
42186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato             * The user has hit another key during the delay (e.g., 300ms)
42286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato             * since the last volume key up, so cancel any sounds.
42386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato             */
424cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood            if (mUseMasterVolume) {
4258dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood                adjustMasterVolume(ADJUST_SAME, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
426cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood            } else {
427cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                adjustSuggestedStreamVolume(ADJUST_SAME,
42886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                        stream, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
429cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood            }
43086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        }
43186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    }
43286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
43386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    /**
43486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     * @hide
43586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     */
436ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    public void handleKeyDown(KeyEvent event, int stream) {
437ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        int keyCode = event.getKeyCode();
43886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        switch (keyCode) {
43986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            case KeyEvent.KEYCODE_VOLUME_UP:
44086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            case KeyEvent.KEYCODE_VOLUME_DOWN:
44186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                /*
44286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 * Adjust the volume in on key down since it is more
44386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 * responsive to the user.
44486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 */
445402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent                int flags = FLAG_SHOW_UI | FLAG_VIBRATE;
446cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                if (mUseMasterVolume) {
447cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    adjustMasterVolume(
448cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            keyCode == KeyEvent.KEYCODE_VOLUME_UP
449cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                                    ? ADJUST_RAISE
4508dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood                                    : ADJUST_LOWER,
4518dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood                            flags);
452cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                } else {
453cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    adjustSuggestedStreamVolume(
454cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            keyCode == KeyEvent.KEYCODE_VOLUME_UP
455cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                                    ? ADJUST_RAISE
456cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                                    : ADJUST_LOWER,
457cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            stream,
458cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            flags);
459402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent                }
46086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                break;
46186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            case KeyEvent.KEYCODE_VOLUME_MUTE:
462ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                if (event.getRepeatCount() == 0) {
463ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                    if (mUseMasterVolume) {
464ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                        setMasterMute(!isMasterMute());
465ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                    } else {
466ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                        // TODO: Actually handle MUTE.
467ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                    }
468ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                }
46986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                break;
47086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        }
47186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    }
47286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
47386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    /**
47486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     * @hide
47586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato     */
476ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    public void handleKeyUp(KeyEvent event, int stream) {
477ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        int keyCode = event.getKeyCode();
47886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        switch (keyCode) {
47986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            case KeyEvent.KEYCODE_VOLUME_UP:
48086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato            case KeyEvent.KEYCODE_VOLUME_DOWN:
48186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                /*
48286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 * Play a sound. This is done on key up since we don't want the
48386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 * sound to play when a user holds down volume down to mute.
48486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                 */
485cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                if (mUseMasterVolume) {
486cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
4878dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood                        adjustMasterVolume(ADJUST_SAME, FLAG_PLAY_SOUND);
488cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    }
489cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                } else {
490cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    int flags = FLAG_PLAY_SOUND;
491cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                    adjustSuggestedStreamVolume(
492cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            ADJUST_SAME,
493cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            stream,
494cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood                            flags);
495402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent                }
49625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent
49786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                mVolumeKeyUpTime = SystemClock.uptimeMillis();
49886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                break;
49986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        }
50086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    }
50186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
50286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    /**
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjusts the volume of a particular stream by one step in a direction.
504fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
505fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
506fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream type to adjust. One of {@link #STREAM_VOICE_CALL},
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #STREAM_SYSTEM}, {@link #STREAM_RING}, {@link #STREAM_MUSIC} or
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #STREAM_ALARM}
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction to adjust the volume. One of
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_SAME}.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags One or more flags.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void adjustStreamVolume(int streamType, int direction, int flags) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5214767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
5224767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustMasterVolume(direction, flags);
5234767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
5244767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustStreamVolume(streamType, direction, flags);
5254767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in adjustStreamVolume", e);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjusts the volume of the most relevant stream. For example, if a call is
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * active, it will have the highest priority regardless of if the in-call
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * screen is showing. Another example, if music is playing in the background
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and a call is not active, the music stream will be adjusted.
536fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
537fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
538fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction to adjust the volume. One of
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_SAME}.
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags One or more flags.
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustSuggestedStreamVolume(int, int, int)
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void adjustVolume(int direction, int flags) {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5514767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
5524767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustMasterVolume(direction, flags);
5534767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
5544767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustVolume(direction, flags);
5554767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in adjustVolume", e);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjusts the volume of the most relevant stream, or the given fallback
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stream.
564fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
565fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
566fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction to adjust the volume. One of
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #ADJUST_SAME}.
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param suggestedStreamType The stream type that will be used if there
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            isn't a relevant stream. {@link #USE_DEFAULT_STREAM_TYPE} is valid here.
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags One or more flags.
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustVolume(int, int)
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #adjustStreamVolume(int, int, int)
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5814767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
5824767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustMasterVolume(direction, flags);
5834767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
5844767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags);
5854767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
587cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood            Log.e(TAG, "Dead object in adjustSuggestedStreamVolume", e);
588cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood        }
589cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood    }
590cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood
591cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood    /**
592cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood     * Adjusts the master volume for the device's audio amplifier.
593cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood     * <p>
594cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood     *
5956c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang     * @param steps The number of volume steps to adjust. A positive
5966c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang     *            value will raise the volume.
5978dc1dabd254249b7ddb8743e88fdb96580ffc585Mike Lockwood     * @param flags One or more flags.
598e3f5979307fa52898459d9d09ee11bc1d65a4f7fJason Simmons     * @hide
599cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood     */
6006c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang    public void adjustMasterVolume(int steps, int flags) {
601cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood        IAudioService service = getService();
602cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood        try {
6036c798970ccb8759d1e613b57111daa8da0ab44c7Lei Zhang            service.adjustMasterVolume(steps, flags);
604cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood        } catch (RemoteException e) {
605cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood            Log.e(TAG, "Dead object in adjustMasterVolume", e);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current ringtone mode.
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current ringtone mode, one of {@link #RINGER_MODE_NORMAL},
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRingerMode(int)
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRingerMode() {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return service.getRingerMode();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in getRingerMode", e);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return RINGER_MODE_NORMAL;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     * Checks valid ringer mode values.
62872668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     *
62972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     * @return true if the ringer mode indicated is valid, false otherwise.
63072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     *
63172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     * @see #setRingerMode(int)
63272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     * @hide
63372668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent     */
63472668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent    public static boolean isValidRingerMode(int ringerMode) {
63572668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent        if (ringerMode < 0 || ringerMode > RINGER_MODE_MAX) {
63672668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent            return false;
63772668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent        }
63872668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent        return true;
63972668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent    }
64072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent
64172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent    /**
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum volume index for a particular stream.
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream type whose maximum volume index is returned.
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The maximum valid volume index for the stream.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStreamVolume(int)
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStreamMaxVolume(int streamType) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6514767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
6524767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                return service.getMasterMaxVolume();
6534767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
6544767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                return service.getStreamMaxVolume(streamType);
6554767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in getStreamMaxVolume", e);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current volume index for a particular stream.
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream type whose volume index is returned.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current volume index for the stream.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStreamMaxVolume(int)
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStreamVolume(int, int, int)
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStreamVolume(int streamType) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6734767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
6744767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                return service.getMasterVolume();
6754767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
6764767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                return service.getStreamVolume(streamType);
6774767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in getStreamVolume", e);
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
68525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     * Get last audible volume before stream was muted.
68625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     *
68725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     * @hide
68825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     */
68925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    public int getLastAudibleStreamVolume(int streamType) {
69025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        IAudioService service = getService();
69125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        try {
6924767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
693ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood                return service.getLastAudibleMasterVolume();
6944767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
6954767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                return service.getLastAudibleStreamVolume(streamType);
6964767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
69725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        } catch (RemoteException e) {
69825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent            Log.e(TAG, "Dead object in getLastAudibleStreamVolume", e);
69925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent            return 0;
70025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        }
70125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    }
70225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent
70325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    /**
7046d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent     * Get the stream type whose volume is driving the UI sounds volume.
7056d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent     * UI sounds are screen lock/unlock, camera shutter, key clicks...
7066d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent     * @hide
7076d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent     */
7086d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent    public int getMasterStreamType() {
7096d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent        IAudioService service = getService();
7106d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent        try {
7116d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent            return service.getMasterStreamType();
7126d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent        } catch (RemoteException e) {
7136d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent            Log.e(TAG, "Dead object in getMasterStreamType", e);
7146d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent            return STREAM_RING;
7156d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent        }
7166d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent    }
7176d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent
7186d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent    /**
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the ringer mode.
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Silent mode will mute the volume and will not vibrate. Vibrate mode will
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * mute the volume and vibrate. Normal mode will be audible and may vibrate
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * according to user settings.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL},
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getRingerMode()
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRingerMode(int ringerMode) {
73072668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent        if (!isValidRingerMode(ringerMode)) {
73172668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent            return;
73272668b2c040b581b298b069f3b5af5ed7f212d89Eric Laurent        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.setRingerMode(ringerMode);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setRingerMode", e);
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the volume index for a particular stream.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream whose volume index should be set.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The volume index to set. See
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #getStreamMaxVolume(int)} for the largest valid value.
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags One or more flags.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStreamMaxVolume(int)
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStreamVolume(int)
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStreamVolume(int streamType, int index, int flags) {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7544767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            if (mUseMasterVolume) {
7554767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.setMasterVolume(index, flags);
7564767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            } else {
7574767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood                service.setStreamVolume(streamType, index, flags);
7584767690f09ea3447b8c5c32fb28d27650aa18e00Mike Lockwood            }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setStreamVolume", e);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
765fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * Returns the maximum volume index for master volume.
766fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     *
767fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @hide
768fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     */
769fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    public int getMasterMaxVolume() {
770fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        IAudioService service = getService();
771fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        try {
772fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return service.getMasterMaxVolume();
773fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        } catch (RemoteException e) {
774fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            Log.e(TAG, "Dead object in getMasterMaxVolume", e);
775fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return 0;
776fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        }
777fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    }
778fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood
779fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    /**
780fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * Returns the current volume index for master volume.
781fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     *
782fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @return The current volume index for master volume.
783fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @hide
784fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     */
785fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    public int getMasterVolume() {
786fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        IAudioService service = getService();
787fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        try {
788fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return service.getMasterVolume();
789fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        } catch (RemoteException e) {
790fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            Log.e(TAG, "Dead object in getMasterVolume", e);
791fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return 0;
792fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        }
793fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    }
794fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood
795fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    /**
796fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * Get last audible volume before master volume was muted.
797fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     *
798fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @hide
799fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     */
800fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    public int getLastAudibleMasterVolume() {
801fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        IAudioService service = getService();
802fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        try {
803fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return service.getLastAudibleMasterVolume();
804fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        } catch (RemoteException e) {
805fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            Log.e(TAG, "Dead object in getLastAudibleMasterVolume", e);
806fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            return 0;
807fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        }
808fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    }
809fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood
810fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    /**
811fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * Sets the volume index for master volume.
812fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     *
813fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @param index The volume index to set. See
814fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     *            {@link #getMasterMaxVolume(int)} for the largest valid value.
815fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @param flags One or more flags.
816fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @see #getMasterMaxVolume(int)
817fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @see #getMasterVolume(int)
818fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     * @hide
819fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood     */
820fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    public void setMasterVolume(int index, int flags) {
821fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        IAudioService service = getService();
822fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        try {
823fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            service.setMasterVolume(index, flags);
824fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        } catch (RemoteException e) {
825fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood            Log.e(TAG, "Dead object in setMasterVolume", e);
826fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood        }
827fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    }
828fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood
829fa7b06147c2d0f0c64fa334ed5a971cbad7cdbe5Mike Lockwood    /**
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Solo or unsolo a particular stream. All other streams are muted.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The solo command is protected against client process death: if a process
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with an active solo request on a stream dies, all streams that were muted
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because of this request will be unmuted automatically.
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The solo requests for a given stream are cumulative: the AudioManager
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can receive several solo requests from one or more clients and the stream
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be unsoloed only when the same number of unsolo requests are received.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For a better user experience, applications MUST unsolo a soloed stream
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in onPause() and solo is again in onResume() if appropriate.
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream to be soloed/unsoloed.
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state The required solo state: true for solo ON, false for solo OFF
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStreamSolo(int streamType, boolean state) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.setStreamSolo(streamType, state, mICallBack);
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setStreamSolo", e);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mute or unmute an audio stream.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The mute command is protected against client process death: if a process
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with an active mute request on a stream dies, this stream will be unmuted
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * automatically.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The mute requests for a given stream are cumulative: the AudioManager
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can receive several mute requests from one or more clients and the stream
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be unmuted only when the same number of unmute requests are received.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For a better user experience, applications MUST unmute a muted stream
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in onPause() and mute is again in onResume() if appropriate.
868fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
869fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
870fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param streamType The stream to be muted/unmuted.
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state The required mute state: true for mute ON, false for mute OFF
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStreamMute(int streamType, boolean state) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.setStreamMute(streamType, state, mICallBack);
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setStreamMute", e);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     * get stream mute state.
88625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     *
88725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     * @hide
88825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent     */
88925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    public boolean isStreamMute(int streamType) {
89025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        IAudioService service = getService();
89125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        try {
89225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent            return service.isStreamMute(streamType);
89325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        } catch (RemoteException e) {
89425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent            Log.e(TAG, "Dead object in isStreamMute", e);
89525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent            return false;
89625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        }
89725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    }
89825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent
89925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent    /**
900ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     * set master mute state.
901ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     *
902ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     * @hide
903ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     */
904ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    public void setMasterMute(boolean state) {
9050273af55cf68d54d26d154b44d105d40fed79701Justin Koh        setMasterMute(state, FLAG_SHOW_UI);
9060273af55cf68d54d26d154b44d105d40fed79701Justin Koh    }
9070273af55cf68d54d26d154b44d105d40fed79701Justin Koh
9080273af55cf68d54d26d154b44d105d40fed79701Justin Koh    /**
9090273af55cf68d54d26d154b44d105d40fed79701Justin Koh     * set master mute state with optional flags.
9100273af55cf68d54d26d154b44d105d40fed79701Justin Koh     *
9110273af55cf68d54d26d154b44d105d40fed79701Justin Koh     * @hide
9120273af55cf68d54d26d154b44d105d40fed79701Justin Koh     */
9130273af55cf68d54d26d154b44d105d40fed79701Justin Koh    public void setMasterMute(boolean state, int flags) {
914ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        IAudioService service = getService();
915ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        try {
9160273af55cf68d54d26d154b44d105d40fed79701Justin Koh            service.setMasterMute(state, flags, mICallBack);
917ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        } catch (RemoteException e) {
918ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood            Log.e(TAG, "Dead object in setMasterMute", e);
919ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        }
920ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    }
921ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood
922ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    /**
923ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     * get master mute state.
924ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     *
925ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     * @hide
926ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood     */
927ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    public boolean isMasterMute() {
928ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        IAudioService service = getService();
929ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        try {
930ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood            return service.isMasterMute();
931ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        } catch (RemoteException e) {
932ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood            Log.e(TAG, "Dead object in isMasterMute", e);
933ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood            return false;
934ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood        }
935ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    }
936ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood
937ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood    /**
938402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     * forces the stream controlled by hard volume keys
939402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     * specifying streamType == -1 releases control to the
940402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     * logic.
941402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     *
942402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     * @hide
943402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent     */
944402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent    public void forceVolumeControlStream(int streamType) {
94545c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent        IAudioService service = getService();
94645c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent        try {
94745c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent            service.forceVolumeControlStream(streamType, mICallBack);
94845c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent        } catch (RemoteException e) {
94945c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent            Log.e(TAG, "Dead object in forceVolumeControlStream", e);
95045c90cefd13a03b852bb4b8da4be218876cbbb32Eric Laurent        }
951402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent    }
952402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent
953402f7f29634a9f68e7929be828a927a3e2f5efe9Eric Laurent    /**
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether a particular type should vibrate according to user
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * settings and the current ringer mode.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This shouldn't be needed by most clients that use notifications to
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vibrate. The notification manager will not vibrate if the policy doesn't
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * allow it, so the client should always set a vibrate pattern and let the
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * notification manager control whether or not to actually vibrate.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vibrateType The type of vibrate. One of
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_RINGER}.
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the type should vibrate at the instant this method is
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         called.
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean shouldVibrate(int vibrateType) {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return service.shouldVibrate(vibrateType);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in shouldVibrate", e);
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether the user's vibrate setting for a vibrate type.
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This shouldn't be needed by most clients that want to vibrate, instead
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * see {@link #shouldVibrate(int)}.
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vibrateType The type of vibrate. One of
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_RINGER}.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The vibrate setting, one of {@link #VIBRATE_SETTING_ON},
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #VIBRATE_SETTING_OFF}, or
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #VIBRATE_SETTING_ONLY_SILENT}.
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVibrateSetting(int, int)
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #shouldVibrate(int)
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getVibrateSetting(int vibrateType) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return service.getVibrateSetting(vibrateType);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in getVibrateSetting", e);
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return VIBRATE_SETTING_OFF;
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the setting for when the vibrate type should vibrate.
1007fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
1008fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
1009fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vibrateType The type of vibrate. One of
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_TYPE_RINGER}.
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vibrateSetting The vibrate setting, one of
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_SETTING_ON},
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_SETTING_OFF}, or
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #VIBRATE_SETTING_ONLY_SILENT}.
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getVibrateSetting(int)
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #shouldVibrate(int)
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVibrateSetting(int vibrateType, int vibrateSetting) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.setVibrateSetting(vibrateType, vibrateSetting);
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setVibrateSetting", e);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the speakerphone on or off.
1032fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
1033fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
1034fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param on set <var>true</var> to turn on speakerphone;
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           <var>false</var> to turn it off
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSpeakerphoneOn(boolean on){
1040c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        IAudioService service = getService();
1041c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        try {
1042c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            service.setSpeakerphoneOn(on);
1043c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        } catch (RemoteException e) {
1044c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            Log.e(TAG, "Dead object in setSpeakerphoneOn", e);
1045a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the speakerphone is on or off.
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if speakerphone is on, false if it's off
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSpeakerphoneOn() {
1054c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        IAudioService service = getService();
1055c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        try {
1056c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            return service.isSpeakerphoneOn();
1057c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        } catch (RemoteException e) {
1058c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            Log.e(TAG, "Dead object in isSpeakerphoneOn", e);
1059a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return false;
1060a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10633def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    //====================================================================
10643def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    // Bluetooth SCO control
10653def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
10663def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * Sticky broadcast intent action indicating that the bluetoooth SCO audio
106795b88fbe744d8ce53b5f54f6fcd90c55094a8d14Eric Laurent     * connection state has changed. The intent contains on extra {@link #EXTRA_SCO_AUDIO_STATE}
10683def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * indicating the new state which is either {@link #SCO_AUDIO_STATE_DISCONNECTED}
10693def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * or {@link #SCO_AUDIO_STATE_CONNECTED}
10703def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     *
10713def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * @see #startBluetoothSco()
1072dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * @deprecated Use  {@link #ACTION_SCO_AUDIO_STATE_UPDATED} instead
10733def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
1074dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    @Deprecated
10753def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
10763def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public static final String ACTION_SCO_AUDIO_STATE_CHANGED =
10773def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            "android.media.SCO_AUDIO_STATE_CHANGED";
1078dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent
1079dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     /**
1080dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Sticky broadcast intent action indicating that the bluetoooth SCO audio
1081dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * connection state has been updated.
1082dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <p>This intent has two extras:
1083dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <ul>
1084dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> {@link #EXTRA_SCO_AUDIO_STATE} - The new SCO audio state. </li>
1085dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}- The previous SCO audio state. </li>
1086dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * </ul>
1087dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <p> EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE can be any of:
1088dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <ul>
1089dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> {@link #SCO_AUDIO_STATE_DISCONNECTED}, </li>
1090dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> {@link #SCO_AUDIO_STATE_CONNECTING} or </li>
1091dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> {@link #SCO_AUDIO_STATE_CONNECTED}, </li>
1092dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * </ul>
1093dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * @see #startBluetoothSco()
1094dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     */
1095dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1096dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    public static final String ACTION_SCO_AUDIO_STATE_UPDATED =
1097dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent            "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
1098dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent
10993def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
1100dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} or
1101dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the new bluetooth SCO connection state.
11023def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
11033def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public static final String EXTRA_SCO_AUDIO_STATE =
11043def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            "android.media.extra.SCO_AUDIO_STATE";
11053def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
11063def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
1107dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the previous
1108dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * bluetooth SCO connection state.
1109dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     */
1110dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE =
1111dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent            "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
1112dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent
1113dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    /**
1114dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
1115dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * indicating that the SCO audio channel is not established
11163def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
11173def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public static final int SCO_AUDIO_STATE_DISCONNECTED = 0;
11183def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
1119dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} or {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}
1120dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * indicating that the SCO audio channel is established
11213def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
11223def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public static final int SCO_AUDIO_STATE_CONNECTED = 1;
11233def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
1124dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
1125dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * indicating that the SCO audio channel is being established
1126dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     */
1127dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    public static final int SCO_AUDIO_STATE_CONNECTING = 2;
1128dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent    /**
1129dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * Value for extra EXTRA_SCO_AUDIO_STATE indicating that
11303def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * there was an error trying to obtain the state
11313def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
11323def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public static final int SCO_AUDIO_STATE_ERROR = -1;
11333def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
11343def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
11353def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
11363def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * Indicates if current platform supports use of SCO for off call use cases.
11373def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * Application wanted to use bluetooth SCO audio when the phone is not in call
11383def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * must first call thsi method to make sure that the platform supports this
11393def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * feature.
11403def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * @return true if bluetooth SCO can be used for audio when not in call
11413def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     *         false otherwise
11423def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * @see #startBluetoothSco()
11433def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    */
11443def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public boolean isBluetoothScoAvailableOffCall() {
11453def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        return mContext.getResources().getBoolean(
11463def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent               com.android.internal.R.bool.config_bluetooth_sco_off_call);
11473def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    }
11483def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
11493def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
11503def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * Start bluetooth SCO audio connection.
11513def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>Requires Permission:
11523def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
11533def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>This method can be used by applications wanting to send and received audio
11543def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * to/from a bluetooth SCO headset while the phone is not in call.
11553def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>As the SCO connection establishment can take several seconds,
11563def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * applications should not rely on the connection to be available when the method
1157dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * returns but instead register to receive the intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED}
11583def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * and wait for the state to be {@link #SCO_AUDIO_STATE_CONNECTED}.
1159dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <p>As the ACTION_SCO_AUDIO_STATE_UPDATED intent is sticky, the application can check the SCO
1160dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * audio state before calling startBluetoothSco() by reading the intent returned by the receiver
1161dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * registration. If the state is already CONNECTED, no state change will be received via the
1162dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * intent after calling startBluetoothSco(). It is however useful to call startBluetoothSco()
1163dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * so that the connection stays active in case the current initiator stops the connection.
1164dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <p>Unless the connection is already active as described above, the state will always
1165dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * transition from DISCONNECTED to CONNECTING and then either to CONNECTED if the connection
1166dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * succeeds or back to DISCONNECTED if the connection fails (e.g no headset is connected).
1167dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <p>When finished with the SCO connection or if the establishment fails, the application must
1168dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * call {@link #stopBluetoothSco()} to clear the request and turn down the bluetooth connection.
11693def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>Even if a SCO connection is established, the following restrictions apply on audio
11703def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * output streams so that they can be routed to SCO headset:
1171dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <ul>
1172dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> the stream type must be {@link #STREAM_VOICE_CALL} </li>
1173dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> the format must be mono </li>
1174dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> the sampling must be 16kHz or 8kHz </li>
1175dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * </ul>
11763def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>The following restrictions apply on input streams:
1177dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * <ul>
1178dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> the format must be mono </li>
1179dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     *   <li> the sampling must be 8kHz </li>
1180dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * </ul>
11813def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>Note that the phone application always has the priority on the usage of the SCO
11823def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * connection for telephony. If this method is called while the phone is in call
11833def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * it will be ignored. Similarly, if a call is received or sent while an application
11843def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * is using the SCO connection, the connection will be lost for the application and NOT
11853def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * returned automatically when the call ends.
11863def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * @see #stopBluetoothSco()
1187dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * @see #ACTION_SCO_AUDIO_STATE_UPDATED
11883def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
11893def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public void startBluetoothSco(){
11903def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        IAudioService service = getService();
11913def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        try {
11923def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            service.startBluetoothSco(mICallBack);
11933def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        } catch (RemoteException e) {
11943def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            Log.e(TAG, "Dead object in startBluetoothSco", e);
11953def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        }
11963def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    }
11973def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
11983def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    /**
11993def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * Stop bluetooth SCO audio connection.
12003def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>Requires Permission:
12013def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
12023def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * <p>This method must be called by applications having requested the use of
12033def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * bluetooth SCO audio with {@link #startBluetoothSco()}
1204dc03c61fe3cd8d0805480e48a974986439977a60Eric Laurent     * when finished with the SCO connection or if connection fails.
12053def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     * @see #startBluetoothSco()
12063def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent     */
12073def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    public void stopBluetoothSco(){
12083def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        IAudioService service = getService();
12093def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        try {
12103def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            service.stopBluetoothSco(mICallBack);
12113def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        } catch (RemoteException e) {
12123def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent            Log.e(TAG, "Dead object in stopBluetoothSco", e);
12133def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent        }
12143def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent    }
12153def1eec2baed0b8845ec32c871e249dc533a9d9Eric Laurent
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * Request use of Bluetooth SCO headset for communications.
1218fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
1219fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
1220fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1222a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @param on set <var>true</var> to use bluetooth SCO for communications;
1223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *               <var>false</var> to not use bluetooth SCO for communications
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBluetoothScoOn(boolean on){
1226c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        IAudioService service = getService();
1227c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        try {
1228c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            service.setBluetoothScoOn(on);
1229c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        } catch (RemoteException e) {
1230c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            Log.e(TAG, "Dead object in setBluetoothScoOn", e);
1231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * Checks whether communications use Bluetooth SCO.
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1237a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @return true if SCO is used for communications;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if otherwise
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isBluetoothScoOn() {
1241c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        IAudioService service = getService();
1242c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        try {
1243c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            return service.isBluetoothScoOn();
1244c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent        } catch (RemoteException e) {
1245c42ac9d4d03f62c3a1ba197a28a81fda44bd8b7fEric Laurent            Log.e(TAG, "Dead object in isBluetoothScoOn", e);
1246a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return false;
1247a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param on set <var>true</var> to route A2DP audio to/from Bluetooth
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           headset; <var>false</var> disable A2DP audio
1253a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @deprecated Do not use.
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1255a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public void setBluetoothA2dpOn(boolean on){
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether A2DP audio routing to the Bluetooth headset is on or off.
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if A2DP audio is being routed to/from Bluetooth headset;
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if otherwise
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isBluetoothA2dpOn() {
12658b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP,"")
1266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
1267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return false;
1268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } else {
1269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return true;
1270a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets audio routing to the wired headset on or off.
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param on set <var>true</var> to route audio to/from wired
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           headset; <var>false</var> disable wired headset audio
1278a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @deprecated Do not use.
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public void setWiredHeadsetOn(boolean on){
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1284497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent     * Checks whether a wired headset is connected or not.
1285497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent     * <p>This is not a valid indication that audio playback is
1286497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent     * actually over the wired headset as audio routing depends on other conditions.
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1288497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent     * @return true if a wired headset is connected.
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if otherwise
1290497b3fe7257d5bbee7762455c6988915bde21601Eric Laurent     * @deprecated Use only to check is a headset is connected or not.
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isWiredHeadsetOn() {
12938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"")
12946015a9715421a339c2b7bb63f9166504e3488179Eric Laurent                == AudioSystem.DEVICE_STATE_UNAVAILABLE &&
12958b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE,"")
1296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
1297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return false;
1298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } else {
1299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return true;
1300a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the microphone mute on or off.
1305fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
1306fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * This method should only be used by applications that replace the platform-wide
1307fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * management of audio settings or the main telephony application.
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param on set <var>true</var> to mute the microphone;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           <var>false</var> to turn mute off
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMicrophoneMute(boolean on){
1313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioSystem.muteMicrophone(on);
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the microphone mute is on or off.
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if microphone is muted, false if it's not
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isMicrophoneMute() {
1322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return AudioSystem.isMicrophoneMuted();
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the audio mode.
1327fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * <p>
1328fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * The audio mode encompasses audio routing AND the behavior of
1329fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * the telephony layer. Therefore this method should only be used by applications that
1330fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * replace the platform-wide management of audio settings or the main telephony application.
1331fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * In particular, the {@link #MODE_IN_CALL} mode should only be used by the telephony
1332fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * application when it places a phone call, as it will cause signals from the radio layer
1333fccb25d2074358c54d4c60eb321aeaa08a5de59aJean-Michel Trivi     * to feed the platform mixer.
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13358aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi     * @param mode  the requested audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE},
13368aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi     *              {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}).
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              Informs the HAL about the current audio state so that
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              it can route the audio appropriately.
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMode(int mode) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13439272b4b4a44fe1f33e3030810618194f817caaecEric Laurent            service.setMode(mode, mICallBack);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in setMode", e);
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current audio mode.
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13528aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi     * @return      the current audio mode ({@link #MODE_NORMAL}, {@link #MODE_RINGTONE},
13538aa798b244e32e227bad97d40ddfd7d3557030a3Jean-Michel Trivi     *              {@link #MODE_IN_CALL} or {@link #MODE_IN_COMMUNICATION}).
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              Returns the current current audio state from the HAL.
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMode() {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return service.getMode();
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in getMode", e);
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return MODE_INVALID;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* modes for setMode/getMode/setRoute/getRoute */
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Audio harware modes.
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invalid audio mode.
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MODE_INVALID            = AudioSystem.MODE_INVALID;
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Current audio mode. Used to apply audio routing to current mode.
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MODE_CURRENT            = AudioSystem.MODE_CURRENT;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Normal audio mode: not ringing and no call established.
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MODE_NORMAL             = AudioSystem.MODE_NORMAL;
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ringing audio mode. An incoming is being signaled.
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MODE_RINGTONE           = AudioSystem.MODE_RINGTONE;
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13878f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi     * In call audio mode. A telephony call is established.
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MODE_IN_CALL            = AudioSystem.MODE_IN_CALL;
13908f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi    /**
13918f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi     * In communication audio mode. An audio/video chat or VoIP call is established.
13928f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi     */
13938f677d66d9c3ba34c97e69b2bb9e161f129af0eeJean-Michel Trivi    public static final int MODE_IN_COMMUNICATION   = AudioSystem.MODE_IN_COMMUNICATION;
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Routing bits for setRouting/getRouting API */
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Routing audio output to earpiece
13984a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
13994a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_EARPIECE          = AudioSystem.ROUTE_EARPIECE;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14034a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * Routing audio output to speaker
14044a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14054a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_SPEAKER           = AudioSystem.ROUTE_SPEAKER;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated use {@link #ROUTE_BLUETOOTH_SCO}
14104a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14114a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated public static final int ROUTE_BLUETOOTH = AudioSystem.ROUTE_BLUETOOTH_SCO;
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Routing audio output to bluetooth SCO
14164a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14174a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_BLUETOOTH_SCO     = AudioSystem.ROUTE_BLUETOOTH_SCO;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Routing audio output to headset
14224a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14234a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_HEADSET           = AudioSystem.ROUTE_HEADSET;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Routing audio output to bluetooth A2DP
14284a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14294a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_BLUETOOTH_A2DP    = AudioSystem.ROUTE_BLUETOOTH_A2DP;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used for mask parameter of {@link #setRouting(int,int,int)}.
14344a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
14354a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn     * setBluetoothScoOn() methods instead.
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public static final int ROUTE_ALL               = AudioSystem.ROUTE_ALL;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the audio routing for a specified mode
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode   audio mode to change route. E.g., MODE_RINGTONE.
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param routes bit vector of routes requested, created from one or
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               more of ROUTE_xxx types. Set bits indicate that route should be on
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mask   bit vector of routes to change, created from one or more of
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ROUTE_xxx types. Unset bits indicate the route should be left unchanged
1447b9c9d260f21b321527c4622a123af9767630d94dEric Laurent     *
1448b9c9d260f21b321527c4622a123af9767630d94dEric Laurent     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
1449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * setBluetoothScoOn() methods instead.
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRouting(int mode, int routes, int mask) {
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current audio routing bit vector for a specified mode.
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode audio mode to get route (e.g., MODE_RINGTONE)
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an audio route bit vector that can be compared with ROUTE_xxx
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bits
1461b9c9d260f21b321527c4622a123af9767630d94dEric Laurent     * @deprecated   Do not query audio routing directly, use isSpeakerphoneOn(),
1462b9c9d260f21b321527c4622a123af9767630d94dEric Laurent     * isBluetoothScoOn(), isBluetoothA2dpOn() and isWiredHeadsetOn() methods instead.
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1464b9c9d260f21b321527c4622a123af9767630d94dEric Laurent    @Deprecated
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRouting(int mode) {
1466a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return -1;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether any music is active.
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if any music tracks are active.
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isMusicActive() {
147525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent        return AudioSystem.isStreamActive(STREAM_MUSIC, 0);
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets a generic audio configuration parameter. The use of these parameters
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are platform dependant, see libaudio
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Temporary interface - DO NOT USE
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: Replace with a more generic key:value get/set mechanism
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * param key   name of parameter to set. Must not be null.
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * param value value of parameter. Must not be null.
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @deprecated Use {@link #setPrameters(String)} instead
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1493a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    @Deprecated public void setParameter(String key, String value) {
1494a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        setParameters(key+"="+value);
1495a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
1496a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1497a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    /**
1498a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * Sets a variable number of parameter values to audio hardware.
1499a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *
1500a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @param keyValuePairs list of parameters key value pairs in the form:
1501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *    key1=value1;key2=value2;...
1502a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *
1503a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     */
1504a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public void setParameters(String keyValuePairs) {
1505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioSystem.setParameters(keyValuePairs);
1506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
1507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    /**
1509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * Sets a varaible number of parameter values to audio hardware.
1510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *
1511a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @param keys list of parameters
1512a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     * @return list of parameters key value pairs in the form:
1513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     *    key1=value1;key2=value2;...
1514a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent     */
1515a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public String getParameters(String keys) {
1516a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return AudioSystem.getParameters(keys);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* Sound effect identifiers */
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Keyboard and direction pad click sound
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_KEY_CLICK = 0;
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Focus has moved up
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_FOCUS_NAVIGATION_UP = 1;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Focus has moved down
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_FOCUS_NAVIGATION_DOWN = 2;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Focus has moved left
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_FOCUS_NAVIGATION_LEFT = 3;
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Focus has moved right
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_FOCUS_NAVIGATION_RIGHT = 4;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IME standard keypress sound
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_KEYPRESS_STANDARD = 5;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IME spacebar keypress sound
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_KEYPRESS_SPACEBAR = 6;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IME delete keypress sound
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_KEYPRESS_DELETE = 7;
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IME return_keypress sound
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_KEYPRESS_RETURN = 8;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide Number of sound effects
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NUM_SOUND_EFFECTS = 9;
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Plays a sound effect (Key clicks, lid open/close...)
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param effectType The type of sound effect. One of
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_KEY_CLICK},
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_UP},
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_DOWN},
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_LEFT},
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_RIGHT},
1578105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_STANDARD},
1579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_SPACEBAR},
1580105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_DELETE},
1581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_RETURN},
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: This version uses the UI settings to determine
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * whether sounds are heard or not.
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void  playSoundEffect(int effectType) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!querySoundEffectsEnabled()) {
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.playSoundEffect(effectType);
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in playSoundEffect"+e);
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Plays a sound effect (Key clicks, lid open/close...)
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param effectType The type of sound effect. One of
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_KEY_CLICK},
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_UP},
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_DOWN},
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_LEFT},
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #FX_FOCUS_NAVIGATION_RIGHT},
1610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_STANDARD},
1611105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_SPACEBAR},
1612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_DELETE},
1613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *            {@link #FX_KEYPRESS_RETURN},
1614a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent     * @param volume Sound effect volume.
1615a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent     * The volume value is a raw scalar so UI controls should be scaled logarithmically.
1616a2ef57dba9ac77d8eccacd646b2b8a8d99fe9d8bEric Laurent     * If a volume of -1 is specified, the AudioManager.STREAM_MUSIC stream volume minus 3dB will be used.
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: This version is for applications that have their own
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * settings panel for enabling and controlling volume.
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void  playSoundEffect(int effectType, float volume) {
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.playSoundEffectVolume(effectType, volume);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in playSoundEffect"+e);
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Settings has an in memory cache, so this is fast.
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean querySoundEffectsEnabled() {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0;
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  Load Sound effects.
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  This method must be called when sound effects are enabled.
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void loadSoundEffects() {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.loadSoundEffects();
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in loadSoundEffects"+e);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  Unload Sound effects.
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  This method can be called to free some memory when
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  sound effects are disabled.
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unloadSoundEffects() {
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IAudioService service = getService();
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service.unloadSoundEffects();
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Dead object in unloadSoundEffects"+e);
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16684050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent    /**
1669d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Used to indicate a gain of audio focus, or a request of audio focus, of unknown duration.
16707f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1671d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
1672d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1673d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public static final int AUDIOFOCUS_GAIN = 1;
1674d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1675d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Used to indicate a temporary gain or request of audio focus, anticipated to last a short
1676d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * amount of time. Examples of temporary changes are the playback of driving directions, or an
1677d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * event notification.
16787f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1679d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
1680d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1681d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2;
1682078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    /**
1683078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * Used to indicate a temporary request of audio focus, anticipated to last a short
1684983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     * amount of time, and where it is acceptable for other audio applications to keep playing
1685983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     * after having lowered their output level (also referred to as "ducking").
1686078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * Examples of temporary changes are the playback of driving directions where playback of music
1687078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * in the background is acceptable.
16887f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1689078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
1690078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     */
1691078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3;
1692078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    /**
1693078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * Used to indicate a loss of audio focus of unknown duration.
16947f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1695078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     */
1696078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    public static final int AUDIOFOCUS_LOSS = -1 * AUDIOFOCUS_GAIN;
1697078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    /**
1698078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * Used to indicate a transient loss of audio focus.
16997f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1700078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     */
1701078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    public static final int AUDIOFOCUS_LOSS_TRANSIENT = -1 * AUDIOFOCUS_GAIN_TRANSIENT;
1702078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    /**
1703078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     * Used to indicate a transient loss of audio focus where the loser of the audio focus can
1704983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     * lower its output volume if it wants to continue playing (also referred to as "ducking"), as
1705983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     * the new focus owner doesn't require others to be silent.
17067f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi     * @see OnAudioFocusChangeListener#onAudioFocusChange(int)
1707078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     */
1708078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi    public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK =
1709078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi            -1 * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
1710d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1711d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1712d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Interface definition for a callback to be invoked when the audio focus of the system is
1713d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * updated.
1714d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1715d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public interface OnAudioFocusChangeListener {
1716d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        /**
1717d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi         * Called on the listener to notify it the audio focus for this listener has been changed.
1718d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi         * The focusChange value indicates whether the focus was gained,
1719d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi         * whether the focus was lost, and whether that loss is transient, or whether the new focus
1720d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi         * holder will hold it for an unknown amount of time.
1721983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi         * When losing focus, listeners can use the focus change information to decide what
1722983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi         * behavior to adopt when losing focus. A music player could for instance elect to lower
1723983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi         * the volume of its music stream (duck) for transient focus losses, and pause otherwise.
1724983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi         * @param focusChange the type of focus change, one of {@link AudioManager#AUDIOFOCUS_GAIN},
1725078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi         *   {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT}
1726983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi         *   and {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}.
1727d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi         */
17287f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi        public void onAudioFocusChange(int focusChange);
1729d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1730d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1731d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1732d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Map to convert focus event listener IDs, as used in the AudioService audio focus stack,
1733d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * to actual listener objects.
1734d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
173530c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten    private final HashMap<String, OnAudioFocusChangeListener> mAudioFocusIdListenerMap =
1736d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            new HashMap<String, OnAudioFocusChangeListener>();
1737d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1738d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Lock to prevent concurrent changes to the list of focus listeners for this AudioManager
1739d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * instance.
1740d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1741d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    private final Object mFocusListenerLock = new Object();
1742d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1743d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    private OnAudioFocusChangeListener findFocusListener(String id) {
1744d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        return mAudioFocusIdListenerMap.get(id);
1745d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1746d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1747d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1748d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Handler for audio focus events coming from the audio service.
1749d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
175030c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten    private final FocusEventHandlerDelegate mAudioFocusEventHandlerDelegate =
1751d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            new FocusEventHandlerDelegate();
1752078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi
1753d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1754d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     * Helper class to handle the forwarding of audio focus events to the appropriate listener
1755d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1756d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    private class FocusEventHandlerDelegate {
1757d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        private final Handler mHandler;
1758d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1759d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        FocusEventHandlerDelegate() {
1760d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            Looper looper;
1761d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            if ((looper = Looper.myLooper()) == null) {
1762d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                looper = Looper.getMainLooper();
1763d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            }
1764d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1765d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            if (looper != null) {
1766d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                // implement the event handler delegate to receive audio focus events
1767d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                mHandler = new Handler(looper) {
1768d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                    @Override
1769d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                    public void handleMessage(Message msg) {
1770d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                        OnAudioFocusChangeListener listener = null;
1771d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                        synchronized(mFocusListenerLock) {
1772d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                            listener = findFocusListener((String)msg.obj);
1773d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                        }
1774d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                        if (listener != null) {
17757f7e67f1b60b7840011236097baad9df6dd74c20Jean-Michel Trivi                            listener.onAudioFocusChange(msg.what);
1776d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                        }
1777d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                    }
1778d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                };
1779d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            } else {
1780d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                mHandler = null;
1781d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            }
1782d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1783d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1784d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        Handler getHandler() {
1785d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            return mHandler;
1786d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1787d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1788d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
178930c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten    private final IAudioFocusDispatcher mAudioFocusDispatcher = new IAudioFocusDispatcher.Stub() {
1790d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1791d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        public void dispatchAudioFocusChange(int focusChange, String id) {
1792d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            Message m = mAudioFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id);
1793d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            mAudioFocusEventHandlerDelegate.getHandler().sendMessage(m);
1794d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1795d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1796d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    };
1797d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1798d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    private String getIdForAudioFocusListener(OnAudioFocusChangeListener l) {
1799d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        if (l == null) {
1800308e9a5d0975489982f93fd1f3728e6ed7a778d0Jean-Michel Trivi            return new String(this.toString());
1801d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        } else {
1802d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            return new String(this.toString() + l.toString());
1803d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1804d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1805d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1806d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
18075f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet     * @hide
180846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * Registers a listener to be called when audio focus changes. Calling this method is optional
180946b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * before calling {@link #requestAudioFocus(OnAudioFocusChangeListener, int, int)}, as it
181046b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * will register the listener as well if it wasn't registered already.
181146b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * @param l the listener to be notified of audio focus changes.
1812d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1813d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public void registerAudioFocusListener(OnAudioFocusChangeListener l) {
1814d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        synchronized(mFocusListenerLock) {
1815d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            if (mAudioFocusIdListenerMap.containsKey(getIdForAudioFocusListener(l))) {
1816d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi                return;
1817d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            }
1818d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            mAudioFocusIdListenerMap.put(getIdForAudioFocusListener(l), l);
1819d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1820d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1821d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1822d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
18235f53f0883a507b9d4b9b9891af560a64f746d149Xavier Ducrohet     * @hide
182446b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * Causes the specified listener to not be called anymore when focus is gained or lost.
182546b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * @param l the listener to unregister.
1826d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1827d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public void unregisterAudioFocusListener(OnAudioFocusChangeListener l) {
1828392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi
1829d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        // remove locally
1830d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        synchronized(mFocusListenerLock) {
1831d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            mAudioFocusIdListenerMap.remove(getIdForAudioFocusListener(l));
1832d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1833d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1834d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1835d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1836d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
183746b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * A failed focus change request.
1838d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1839d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public static final int AUDIOFOCUS_REQUEST_FAILED = 0;
1840d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
184146b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * A successful focus change request.
1842d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1843d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public static final int AUDIOFOCUS_REQUEST_GRANTED = 1;
1844d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1845d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1846d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
1847d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  Request audio focus.
184846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     *  Send a request to obtain the audio focus
1849d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  @param l the listener to be notified of audio focus changes
1850d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  @param streamType the main audio stream type affected by the focus request
1851d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request
1852d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *      is temporary, and focus will be abandonned shortly. Examples of transient requests are
1853078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     *      for the playback of driving directions, or notifications sounds.
1854983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     *      Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for
1855983ac2b8cff85dda1f55b0d7779a33248b3fa7cfJean-Michel Trivi     *      the previous focus owner to keep playing if it ducks its audio output.
1856078fd47e91d495175927d1a4a8b9aad039a7ba4eJean-Michel Trivi     *      Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such
1857d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *      as the playback of a song or a video.
1858d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
1859d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1860d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) {
1861d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        int status = AUDIOFOCUS_REQUEST_FAILED;
186255d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi        if ((durationHint < AUDIOFOCUS_GAIN) || (durationHint > AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK))
186355d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi        {
186455d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi            Log.e(TAG, "Invalid duration hint, audio focus request denied");
186555d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi            return status;
186655d1bb3483e17a11d122e68044e552d96ab55ff4Jean-Michel Trivi        }
1867d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        registerAudioFocusListener(l);
1868d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        //TODO protect request by permission check?
1869d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        IAudioService service = getService();
1870d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        try {
1871d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi            status = service.requestAudioFocus(streamType, durationHint, mICallBack,
18728f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi                    mAudioFocusDispatcher, getIdForAudioFocusListener(l),
18738f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi                    mContext.getPackageName() /* package name */);
1874d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        } catch (RemoteException e) {
18754dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            Log.e(TAG, "Can't call requestAudioFocus() on AudioService due to "+e);
1876d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1877d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        return status;
1878d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1879d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
18804dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    /**
18814dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * @hide
18824dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * Used internally by telephony package to request audio focus. Will cause the focus request
18834dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * to be associated with the "voice communication" identifier only used in AudioService
18844dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * to identify this use case.
18854dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * @param streamType use STREAM_RING for focus requests when ringing, VOICE_CALL for
18864dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     *    the establishment of the call
18874dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * @param durationHint the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so
18884dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     *    media applications resume after a call
18894dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     */
18904dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    public void requestAudioFocusForCall(int streamType, int durationHint) {
18914dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        IAudioService service = getService();
18924dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        try {
18934dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            service.requestAudioFocus(streamType, durationHint, mICallBack, null,
18944dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi                    AudioService.IN_VOICE_COMM_FOCUS_ID,
18954dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi                    "system" /* dump-friendly package name */);
18964dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        } catch (RemoteException e) {
18974dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            Log.e(TAG, "Can't call requestAudioFocusForCall() on AudioService due to "+e);
18984dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        }
18994dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    }
19004dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi
19014dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    /**
19024dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * @hide
19034dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * Used internally by telephony package to abandon audio focus, typically after a call or
19044dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * when ringing ends and the call is rejected or not answered.
19054dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     * Should match one or more calls to {@link #requestAudioFocusForCall(int, int)}.
19064dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi     */
19074dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    public void abandonAudioFocusForCall() {
19084dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        IAudioService service = getService();
19094dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        try {
19104dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            service.abandonAudioFocus(null, AudioService.IN_VOICE_COMM_FOCUS_ID);
19114dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        } catch (RemoteException e) {
19124dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            Log.e(TAG, "Can't call abandonAudioFocusForCall() on AudioService due to "+e);
19134dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi        }
19144dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi    }
1915d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1916d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    /**
191746b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     *  Abandon audio focus. Causes the previous focus owner, if any, to receive focus.
191846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     *  @param l the listener with which focus was requested.
1919d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     *  @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
1920d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi     */
1921d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    public int abandonAudioFocus(OnAudioFocusChangeListener l) {
1922d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        int status = AUDIOFOCUS_REQUEST_FAILED;
1923392a2bbb52688ebd25768a7784d9edca7f498110Jean-Michel Trivi        unregisterAudioFocusListener(l);
1924d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        IAudioService service = getService();
1925d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        try {
1926d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi            status = service.abandonAudioFocus(mAudioFocusDispatcher,
1927d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi                    getIdForAudioFocusListener(l));
1928d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        } catch (RemoteException e) {
19294dd3674e517051f130fef36d2eb201c68ff61094Jean-Michel Trivi            Log.e(TAG, "Can't call abandonAudioFocus() on AudioService due to "+e);
1930d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        }
1931d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi        return status;
1932d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi    }
1933d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1934d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi
1935d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    //====================================================================
1936d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    // Remote Control
1937d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    /**
193846b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * Register a component to be the sole receiver of MEDIA_BUTTON intents.
1939d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi     * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver}
1940d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi     *      that will receive the media button intent. This broadcast receiver must be declared
1941f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     *      in the application manifest. The package of the component must match that of
1942f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     *      the context you're registering from.
1943d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi     */
1944d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    public void registerMediaButtonEventReceiver(ComponentName eventReceiver) {
19458f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        if (eventReceiver == null) {
19468f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            return;
19478f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
1948f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        if (!eventReceiver.getPackageName().equals(mContext.getPackageName())) {
1949f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            Log.e(TAG, "registerMediaButtonEventReceiver() error: " +
1950f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi                    "receiver and context package names don't match");
1951f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            return;
1952f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        }
1953f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        // construct a PendingIntent for the media button and register it
1954f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
1955f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        //     the associated intent will be handled by the component being registered
1956f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        mediaButtonIntent.setComponent(eventReceiver);
1957f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        PendingIntent pi = PendingIntent.getBroadcast(mContext,
1958f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi                0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);
1959f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        registerMediaButtonIntent(pi, eventReceiver);
1960f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    }
1961f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi
1962f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    /**
1963f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     * @hide
1964f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     * no-op if (pi == null) or (eventReceiver == null)
1965f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     */
1966f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    public void registerMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {
1967f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        if ((pi == null) || (eventReceiver == null)) {
1968f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter");
1969f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            return;
1970f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        }
1971d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        IAudioService service = getService();
1972d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        try {
1973f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            // pi != null
1974f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            service.registerMediaButtonIntent(pi, eventReceiver);
1975d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        } catch (RemoteException e) {
1976f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            Log.e(TAG, "Dead object in registerMediaButtonIntent"+e);
1977d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        }
1978d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    }
1979d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi
1980d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    /**
198146b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * Unregister the receiver of MEDIA_BUTTON intents.
198246b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver}
198346b3a1808a8e6fc60079af3c2292fd784a7bb0fcJean-Michel Trivi     *      that was registered with {@link #registerMediaButtonEventReceiver(ComponentName)}.
1984d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi     */
1985d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) {
19868f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        if (eventReceiver == null) {
19878f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            return;
19888f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
1989f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        // construct a PendingIntent for the media button and unregister it
1990f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
1991f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        //     the associated intent will be handled by the component being registered
1992f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        mediaButtonIntent.setComponent(eventReceiver);
1993f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        PendingIntent pi = PendingIntent.getBroadcast(mContext,
1994f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi                0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);
1995f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        unregisterMediaButtonIntent(pi, eventReceiver);
1996f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    }
1997f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi
1998f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    /**
1999f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     * @hide
2000f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi     */
2001f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi    public void unregisterMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {
2002d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        IAudioService service = getService();
2003d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        try {
2004f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            service.unregisterMediaButtonIntent(pi, eventReceiver);
2005d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        } catch (RemoteException e) {
2006f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            Log.e(TAG, "Dead object in unregisterMediaButtonIntent"+e);
2007d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi        }
2008d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi    }
2009d327f21626217aa3c9c0cdb7a84a742c531e59a3Jean-Michel Trivi
2010178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi    /**
2011178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * Registers the remote control client for providing information to display on the remote
2012178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * controls.
2013466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi     * @param rcClient The remote control client from which remote controls will receive
2014466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi     *      information to display.
2015466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi     * @see RemoteControlClient
20168f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     */
20174426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    public void registerRemoteControlClient(RemoteControlClient rcClient) {
2018f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
20198f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            return;
20208f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
20218f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        IAudioService service = getService();
20228f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        try {
2023f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            service.registerRemoteControlClient(rcClient.getRcMediaIntent(),   /* mediaIntent   */
20244426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi                    rcClient.getIRemoteControlClient(),                        /* rcClient      */
20258f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi                    // used to match media button event receiver and audio focus
20264426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi                    mContext.getPackageName());                                /* packageName   */
20278f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        } catch (RemoteException e) {
20288f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            Log.e(TAG, "Dead object in registerRemoteControlClient"+e);
20298f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
20308f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    }
20318f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi
20328f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    /**
2033fcd693a21d862ea765006f8987b8dd4b125b28c5Jean-Michel Trivi     * Unregisters the remote control client that was providing information to display on the
2034466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi     * remote controls.
2035466ade5ad66e7bfb1814d5e5ac76a17f8a0bcd3aJean-Michel Trivi     * @param rcClient The remote control client to unregister.
20364426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi     * @see #registerRemoteControlClient(RemoteControlClient)
20378f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     */
20384426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    public void unregisterRemoteControlClient(RemoteControlClient rcClient) {
2039f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
20408f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            return;
20418f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
20428f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        IAudioService service = getService();
20438f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        try {
2044f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi            service.unregisterRemoteControlClient(rcClient.getRcMediaIntent(), /* mediaIntent   */
2045f0cff0456258478ba768097f73d4367ab67fd7a3Jean-Michel Trivi                    rcClient.getIRemoteControlClient());                       /* rcClient      */
20468f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        } catch (RemoteException e) {
20478f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            Log.e(TAG, "Dead object in unregisterRemoteControlClient"+e);
20488f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi        }
20498f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    }
20508f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi
205144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    /**
205244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @hide
205344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * Registers a remote control display that will be sent information by remote control clients.
205444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @param rcd
205544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     */
205644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) {
205744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        if (rcd == null) {
205844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            return;
205944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
206044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        IAudioService service = getService();
206144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        try {
206244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            service.registerRemoteControlDisplay(rcd);
206344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        } catch (RemoteException e) {
206444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            Log.e(TAG, "Dead object in registerRemoteControlDisplay " + e);
206544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
206644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    }
206744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi
206844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    /**
206944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @hide
207044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * Unregisters a remote control display that was sent information by remote control clients.
207144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @param rcd
207244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     */
207344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) {
207444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        if (rcd == null) {
207544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            return;
207644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
207744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        IAudioService service = getService();
207844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        try {
207944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            service.unregisterRemoteControlDisplay(rcd);
208044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        } catch (RemoteException e) {
208144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            Log.e(TAG, "Dead object in unregisterRemoteControlDisplay " + e);
208244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
208344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    }
208444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi
208544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    /**
208644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @hide
208744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * Sets the artwork size a remote control display expects when receiving bitmaps.
208844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @param rcd
208944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @param w the maximum width of the expected bitmap. Negative values indicate it is
209044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     *   useless to send artwork.
209144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     * @param h the maximum height of the expected bitmap. Negative values indicate it is
209244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     *   useless to send artwork.
209344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi     */
209444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    public void remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay rcd, int w, int h) {
209544413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        if (rcd == null) {
209644413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            return;
209744413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
209844413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        IAudioService service = getService();
209944413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        try {
210044413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            service.remoteControlDisplayUsesBitmapSize(rcd, w, h);
210144413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        } catch (RemoteException e) {
210244413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi            Log.e(TAG, "Dead object in remoteControlDisplayUsesBitmapSize " + e);
210344413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi        }
210444413e5b514a91806a4bb4c7780029ea43be6f81Jean-Michel Trivi    }
2105ced110ec5970c632f523dfc0350b6071461ea9bcNeel Parekh
21064426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    // FIXME remove because we are not using intents anymore between AudioService and RcDisplay
2107ced110ec5970c632f523dfc0350b6071461ea9bcNeel Parekh    /**
2108ced110ec5970c632f523dfc0350b6071461ea9bcNeel Parekh     * @hide
21098f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * Broadcast intent action indicating that the displays on the remote controls
21108f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * should be updated because a new remote control client is now active. If there is no
21118f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * {@link #EXTRA_REMOTE_CONTROL_CLIENT}, the remote control display should be cleared
21128f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * because there is no valid client to supply it with information.
21138f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     *
21148f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * @see #EXTRA_REMOTE_CONTROL_CLIENT
21158f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     */
21168f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    public static final String REMOTE_CONTROL_CLIENT_CHANGED =
21178f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi            "android.media.REMOTE_CONTROL_CLIENT_CHANGED";
21188f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi
21194426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    // FIXME remove because we are not using intents anymore between AudioService and RcDisplay
21208f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    /**
21218f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * @hide
2122178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * The IRemoteControlClientDispatcher monotonically increasing generation counter.
2123178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     *
2124178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * @see #REMOTE_CONTROL_CLIENT_CHANGED_ACTION
2125178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     */
2126178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi    public static final String EXTRA_REMOTE_CONTROL_CLIENT_GENERATION =
2127178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi            "android.media.EXTRA_REMOTE_CONTROL_CLIENT_GENERATION";
2128178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi
21294426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    // FIXME remove because we are not using intents anymore between AudioService and RcDisplay
2130178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi    /**
2131178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * @hide
2132178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * The name of the RemoteControlClient.
2133178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * This String is passed as the client name when calling methods from the
2134178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * IRemoteControlClientDispatcher interface.
21358f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     *
21368f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * @see #REMOTE_CONTROL_CLIENT_CHANGED_ACTION
21378f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     */
2138178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi    public static final String EXTRA_REMOTE_CONTROL_CLIENT_NAME =
2139178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi            "android.media.EXTRA_REMOTE_CONTROL_CLIENT_NAME";
21408f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi
21414426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    // FIXME remove because we are not using intents anymore between AudioService and RcDisplay
21428f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi    /**
21438f619182cb759718f64ab95fd6d61c16138f6952Jean-Michel Trivi     * @hide
2144178889eff7fa3361a5cb08d6d43846a1baf5216bJean-Michel Trivi     * The media button event receiver associated with the RemoteControlClient.
21450a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     * The {@link android.content.ComponentName} value of the event receiver can be retrieved with
21460a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     * {@link android.content.ComponentName#unflattenFromString(String)}
21470a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     *
21480a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     * @see #REMOTE_CONTROL_CLIENT_CHANGED_ACTION
21490a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     */
21500a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi    public static final String EXTRA_REMOTE_CONTROL_EVENT_RECEIVER =
21510a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi            "android.media.EXTRA_REMOTE_CONTROL_EVENT_RECEIVER";
21520a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi
21534426e42ac6107bf6b09f7c4cdad39eb161d8b9caJean-Michel Trivi    // FIXME remove because we are not using intents anymore between AudioService and RcDisplay
21540a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi    /**
21550a9faa8cf934ef38319cd945b600825c6bb88b9cJean-Michel Trivi     * @hide
2156b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi     * The flags describing what information has changed in the current remote control client.
2157b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi     *
2158b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi     * @see #REMOTE_CONTROL_CLIENT_CHANGED_ACTION
2159b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi     */
2160b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi    public static final String EXTRA_REMOTE_CONTROL_CLIENT_INFO_CHANGED =
2161b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi            "android.media.EXTRA_REMOTE_CONTROL_CLIENT_INFO_CHANGED";
2162b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi
2163b5f04d6dbf5106140df367ae07f0e7708e1b650eJean-Michel Trivi    /**
21644050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent     *  @hide
21654050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent     *  Reload audio settings. This method is called by Settings backup
21664050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent     *  agent when audio settings are restored and causes the AudioService
21674050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent     *  to read and apply restored settings.
21684050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent     */
21694050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent    public void reloadAudioSettings() {
21704050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent        IAudioService service = getService();
21714050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent        try {
21724050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent            service.reloadAudioSettings();
21734050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent        } catch (RemoteException e) {
21744050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent            Log.e(TAG, "Dead object in reloadAudioSettings"+e);
21754050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent        }
21764050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent    }
21774050c93601b3c3609b21cc1e18a29b64747e7fa9Eric Laurent
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     /**
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      * {@hide}
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      */
218130c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten     private final IBinder mICallBack = new Binder();
21827f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten
21837f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten    /**
21847f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     * Checks whether the phone is in silent mode, with or without vibrate.
21857f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     *
21867f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     * @return true if phone is in silent mode, with or without vibrate.
21877f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     *
21887f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     * @see #getRingerMode()
21897f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     *
21907f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     * @hide pending API Council approval
21917f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten     */
21927f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten    public boolean isSilentMode() {
21937f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten        int ringerMode = getRingerMode();
21947f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten        boolean silentMode =
21957f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten            (ringerMode == RINGER_MODE_SILENT) ||
21967f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten            (ringerMode == RINGER_MODE_VIBRATE);
21977f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten        return silentMode;
21987f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten    }
21997f9b1fa6719dde575f8ea9858313358733fbd6c9Glenn Kasten
22008b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    // This section re-defines new output device constants from AudioSystem, because the AudioSystem
22018b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    // class is not used by other parts of the framework, which instead use definitions and methods
22028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    // from AudioManager. AudioSystem is an internal class used by AudioManager and AudioService.
22038b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten
22048b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for the small speaker at the front of the device used
22058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  when placing calls.  Does not refer to an in-ear headphone without attached microphone,
22068b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  such as earbuds, earphones, or in-ear monitors (IEM). Those would be handled as a
22078b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  {@link #DEVICE_OUT_WIRED_HEADPHONE}.
22088b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22098b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_EARPIECE = AudioSystem.DEVICE_OUT_EARPIECE;
22108b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for the built-in speaker */
22118b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_SPEAKER = AudioSystem.DEVICE_OUT_SPEAKER;
22128b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for a wired headset with attached microphone */
22138b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_WIRED_HEADSET = AudioSystem.DEVICE_OUT_WIRED_HEADSET;
22148b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for a wired headphone without attached microphone */
22158b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_WIRED_HEADPHONE = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
22168b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for generic Bluetooth SCO, for voice */
22178b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_SCO = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO;
22188b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for Bluetooth SCO Headset Profile (HSP) and
22198b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  Hands-Free Profile (HFP), for voice
22208b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22218b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET =
22228b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
22238b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for Bluetooth SCO car audio, for voice */
22248b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT =
22258b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
22268b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for generic Bluetooth A2DP, for music */
22278b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_A2DP = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
22288b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for Bluetooth A2DP headphones, for music */
22298b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES =
22308b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
22318b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for Bluetooth A2DP external speaker, for music */
22328b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER =
22338b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
22348b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for S/PDIF or HDMI */
22358b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_AUX_DIGITAL = AudioSystem.DEVICE_OUT_AUX_DIGITAL;
22368b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for an analog wired headset attached via a
22378b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  docking station
22388b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22398b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_ANLG_DOCK_HEADSET = AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;
22408b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} The audio output device code for a digital wired headset attached via a
22418b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  docking station
22428b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22438b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_DGTL_DOCK_HEADSET = AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET;
224459f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent    /** {@hide} The audio output device code for a USB audio accessory. The accessory is in USB host
224559f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent     * mode and the Android device in USB device mode
224659f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent     */
224759f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent    public static final int DEVICE_OUT_USB_ACCESSORY = AudioSystem.DEVICE_OUT_USB_ACCESSORY;
224859f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent    /** {@hide} The audio output device code for a USB audio device. The device is in USB device
224959f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent     * mode and the Android device in USB host mode
225059f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent     */
225159f482764e346a5c5ac118ee1f7b24da645c2559Eric Laurent    public static final int DEVICE_OUT_USB_DEVICE = AudioSystem.DEVICE_OUT_USB_DEVICE;
22528b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /** {@hide} This is not used as a returned value from {@link #getDevicesForStream}, but could be
22538b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  used in the future in a set method to select whatever default device is chosen by the
22548b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *  platform-specific implementation.
22558b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22568b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public static final int DEVICE_OUT_DEFAULT = AudioSystem.DEVICE_OUT_DEFAULT;
22578b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten
22588b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    /**
22598b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * Return the enabled devices for the specified output stream type.
22608b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *
22618b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * @param streamType The stream type to query. One of
22628b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_VOICE_CALL},
22638b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_SYSTEM},
22648b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_RING},
22658b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_MUSIC},
22668b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_ALARM},
22678b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_NOTIFICATION},
22688b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #STREAM_DTMF}.
22698b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *
22708b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * @return The bit-mask "or" of audio output device codes for all enabled devices on this
22718b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *         stream. Zero or more of
22728b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_EARPIECE},
22738b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_SPEAKER},
22748b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_WIRED_HEADSET},
22758b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_WIRED_HEADPHONE},
22768b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_SCO},
22778b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_SCO_HEADSET},
22788b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_SCO_CARKIT},
22798b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_A2DP},
22808b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES},
22818b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER},
22828b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_AUX_DIGITAL},
22838b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_ANLG_DOCK_HEADSET},
22848b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_DGTL_DOCK_HEADSET}.
22858b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *            {@link #DEVICE_OUT_DEFAULT} is not used here.
22868b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *
22878b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * The implementation may support additional device codes beyond those listed, so
22888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * the application should ignore any bits which it does not recognize.
22898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * Note that the information may be imprecise when the implementation
22908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * cannot distinguish whether a particular device is enabled.
22918b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     *
22928b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     * {@hide}
22938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten     */
22948b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    public int getDevicesForStream(int streamType) {
22958b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        switch (streamType) {
22968b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_VOICE_CALL:
22978b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_SYSTEM:
22988b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_RING:
22998b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_MUSIC:
23008b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_ALARM:
23018b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_NOTIFICATION:
23028b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        case STREAM_DTMF:
23038b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            return AudioSystem.getDevicesForStream(streamType);
23048b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        default:
23058b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten            return 0;
23068b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten        }
23078b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten    }
23088b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten
2309098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey    /** {@hide} */
2310098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey    public IRingtonePlayer getRingtonePlayer() {
2311098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey        try {
2312098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey            return getService().getRingtonePlayer();
2313098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey        } catch (RemoteException e) {
2314098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey            return null;
2315098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey        }
2316098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey    }
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2318