1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.example.android.musicplayer;
18
19import android.content.Context;
20import android.media.AudioManager;
21
22/**
23 * Convenience class to deal with audio focus. This class deals with everything related to audio
24 * focus: it can request and abandon focus, and will intercept focus change events and deliver
25 * them to a MusicFocusable interface (which, in our case, is implemented by {@link MusicService}).
26 *
27 * This class can only be used on SDK level 8 and above, since it uses API features that are not
28 * available on previous SDK's.
29 */
30public class AudioFocusHelper implements AudioManager.OnAudioFocusChangeListener {
31    AudioManager mAM;
32    MusicFocusable mFocusable;
33
34    public AudioFocusHelper(Context ctx, MusicFocusable focusable) {
35        mAM = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
36        mFocusable = focusable;
37    }
38
39    /** Requests audio focus. Returns whether request was successful or not. */
40    public boolean requestFocus() {
41        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
42            mAM.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
43    }
44
45    /** Abandons audio focus. Returns whether request was successful or not. */
46    public boolean abandonFocus() {
47        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAM.abandonAudioFocus(this);
48    }
49
50    /**
51     * Called by AudioManager on audio focus changes. We implement this by calling our
52     * MusicFocusable appropriately to relay the message.
53     */
54    public void onAudioFocusChange(int focusChange) {
55        if (mFocusable == null) return;
56        switch (focusChange) {
57            case AudioManager.AUDIOFOCUS_GAIN:
58                mFocusable.onGainedAudioFocus();
59                break;
60            case AudioManager.AUDIOFOCUS_LOSS:
61            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
62                mFocusable.onLostAudioFocus(false);
63                break;
64            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
65                mFocusable.onLostAudioFocus(true);
66                break;
67             default:
68        }
69    }
70}
71