View Javadoc

1   /***
2    *     Ambient - A music player for the Android platform
3    Copyright (C) 2007 Martin Vysny
4    
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, either version 3 of the License, or
8    (at your option) any later version.
9    
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14  
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  
19  package sk.baka.ambient;
20  
21  import sk.baka.ambient.playerservice.PlayerStateEnum;
22  import android.content.Context;
23  import android.telephony.PhoneStateListener;
24  import android.telephony.TelephonyManager;
25  
26  /***
27   * Handles the phone state events and reacts appropriately.
28   * 
29   * @author Martin Vysny
30   */
31  final class PhoneStateHandler extends PhoneStateListener {
32  
33  	/***
34  	 * The phone state retrieval object.
35  	 */
36  	private final TelephonyManager manager;
37  
38  	/***
39  	 * Creates new phone state handler. There should be at most one instance of
40  	 * the handler!
41  	 * 
42  	 * @param context
43  	 *            the context
44  	 */
45  	PhoneStateHandler(final AmbientApplication context) {
46  		super();
47  		this.app = context;
48  		manager = (TelephonyManager) context
49  				.getSystemService(Context.TELEPHONY_SERVICE);
50  		manager.listen(this, LISTEN_CALL_STATE);
51  	}
52  
53  	private final AmbientApplication app;
54  
55  	@Override
56  	public void onCallStateChanged(int state, String incomingNumber) {
57  		super.onCallStateChanged(state, incomingNumber);
58  		switch (state) {
59  		case TelephonyManager.CALL_STATE_OFFHOOK:
60  		case TelephonyManager.CALL_STATE_RINGING:
61  			callInitiated();
62  			break;
63  		case TelephonyManager.CALL_STATE_IDLE:
64  			callTerminated();
65  			break;
66  		}
67  	}
68  
69  	/***
70  	 * If <code>true</code> then the phone is active (ringing or picked up).
71  	 */
72  	private volatile boolean phoneActive = false;
73  
74  	/***
75  	 * The call is initiated, pause the playback if needed.
76  	 */
77  	private void callInitiated() {
78  		if (phoneActive)
79  			return;
80  		phoneActive = true;
81  		prevState = app.getPlaylist().getPlaybackState();
82  		if (prevState == PlayerStateEnum.Playing) {
83  			app.getPlaylist().pause();
84  		}
85  	}
86  
87  	/***
88  	 * The playback state when the phone was activated.
89  	 */
90  	private PlayerStateEnum prevState;
91  
92  	/***
93  	 * The call has ended, resume the playback if it was paused before.
94  	 */
95  	private void callTerminated() {
96  		if (!phoneActive)
97  			return;
98  		phoneActive = false;
99  		if (prevState == PlayerStateEnum.Playing) {
100 			app.getPlaylist().pause();
101 		}
102 	}
103 }