1 /*
2  * Copyright (C) 2006 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 
17 package com.android.internal.telephony;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.os.Handler;
24 import android.os.Message;
25 import android.telephony.ServiceState;
26 import android.telephony.SignalStrength;
27 import android.telephony.TelephonyManager;
28 import android.telephony.Rlog;
29 
30 /**
31  *
32  *                            DO NOT USE THIS CLASS:
33  *
34  *      Use android.telephony.TelephonyManager and PhoneStateListener instead.
35  *
36  *
37  */
38 @Deprecated
39 public final class PhoneStateIntentReceiver extends BroadcastReceiver {
40     private static final String LOG_TAG = "PhoneStatIntentReceiver";
41     private static final boolean DBG = false;
42 
43     private static final int NOTIF_PHONE    = 1 << 0;
44     private static final int NOTIF_SERVICE  = 1 << 1;
45     private static final int NOTIF_SIGNAL   = 1 << 2;
46 
47     PhoneConstants.State mPhoneState = PhoneConstants.State.IDLE;
48     ServiceState mServiceState = new ServiceState();
49     SignalStrength mSignalStrength = new SignalStrength();
50 
51     private Context mContext;
52     private Handler mTarget;
53     private IntentFilter mFilter;
54     private int mWants;
55     private int mPhoneStateEventWhat;
56     private int mServiceStateEventWhat;
57     private int mAsuEventWhat;
58 
PhoneStateIntentReceiver()59     public PhoneStateIntentReceiver() {
60         super();
61         mFilter = new IntentFilter();
62     }
63 
PhoneStateIntentReceiver(Context context, Handler target)64     public PhoneStateIntentReceiver(Context context, Handler target) {
65         this();
66         setContext(context);
67         setTarget(target);
68     }
69 
setContext(Context c)70     public void setContext(Context c) {
71         mContext = c;
72     }
73 
setTarget(Handler h)74     public void setTarget(Handler h) {
75         mTarget = h;
76     }
77 
getPhoneState()78     public PhoneConstants.State getPhoneState() {
79         if ((mWants & NOTIF_PHONE) == 0) {
80             throw new RuntimeException
81                 ("client must call notifyPhoneCallState(int)");
82         }
83         return mPhoneState;
84     }
85 
getServiceState()86     public ServiceState getServiceState() {
87         if ((mWants & NOTIF_SERVICE) == 0) {
88             throw new RuntimeException
89                 ("client must call notifyServiceState(int)");
90         }
91         return mServiceState;
92     }
93 
94     /**
95      * Returns current signal strength in as an asu 0..31
96      *
97      * Throws RuntimeException if client has not called notifySignalStrength()
98      */
getSignalStrengthLevelAsu()99     public int getSignalStrengthLevelAsu() {
100         // TODO: use new SignalStrength instead of asu
101         if ((mWants & NOTIF_SIGNAL) == 0) {
102             throw new RuntimeException
103                 ("client must call notifySignalStrength(int)");
104         }
105         return mSignalStrength.getAsuLevel();
106     }
107 
108     /**
109      * Return current signal strength in "dBm", ranging from -113 - -51dBm
110      * or -1 if unknown
111      *
112      * @return signal strength in dBm, -1 if not yet updated
113      * Throws RuntimeException if client has not called notifySignalStrength()
114      */
getSignalStrengthDbm()115     public int getSignalStrengthDbm() {
116         if ((mWants & NOTIF_SIGNAL) == 0) {
117             throw new RuntimeException
118                 ("client must call notifySignalStrength(int)");
119         }
120         return mSignalStrength.getDbm();
121     }
122 
notifyPhoneCallState(int eventWhat)123     public void notifyPhoneCallState(int eventWhat) {
124         mWants |= NOTIF_PHONE;
125         mPhoneStateEventWhat = eventWhat;
126         mFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
127     }
128 
getNotifyPhoneCallState()129     public boolean getNotifyPhoneCallState() {
130         return ((mWants & NOTIF_PHONE) != 0);
131     }
132 
notifyServiceState(int eventWhat)133     public void notifyServiceState(int eventWhat) {
134         mWants |= NOTIF_SERVICE;
135         mServiceStateEventWhat = eventWhat;
136         mFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
137     }
138 
getNotifyServiceState()139     public boolean getNotifyServiceState() {
140         return ((mWants & NOTIF_SERVICE) != 0);
141     }
142 
notifySignalStrength(int eventWhat)143     public void notifySignalStrength (int eventWhat) {
144         mWants |= NOTIF_SIGNAL;
145         mAsuEventWhat = eventWhat;
146         mFilter.addAction(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED);
147     }
148 
getNotifySignalStrength()149     public boolean getNotifySignalStrength() {
150         return ((mWants & NOTIF_SIGNAL) != 0);
151     }
152 
registerIntent()153     public void registerIntent() {
154         mContext.registerReceiver(this, mFilter);
155     }
156 
unregisterIntent()157     public void unregisterIntent() {
158         mContext.unregisterReceiver(this);
159     }
160 
161     @Override
onReceive(Context context, Intent intent)162     public void onReceive(Context context, Intent intent) {
163         String action = intent.getAction();
164 
165         try {
166             if (TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED.equals(action)) {
167                 mSignalStrength = SignalStrength.newFromBundle(intent.getExtras());
168 
169                 if (mTarget != null && getNotifySignalStrength()) {
170                     Message message = Message.obtain(mTarget, mAsuEventWhat);
171                     mTarget.sendMessage(message);
172                 }
173             } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
174                 if (DBG) Rlog.d(LOG_TAG, "onReceiveIntent: ACTION_PHONE_STATE_CHANGED, state="
175                                + intent.getStringExtra(PhoneConstants.STATE_KEY));
176                 String phoneState = intent.getStringExtra(PhoneConstants.STATE_KEY);
177                 mPhoneState = Enum.valueOf(
178                         PhoneConstants.State.class, phoneState);
179 
180                 if (mTarget != null && getNotifyPhoneCallState()) {
181                     Message message = Message.obtain(mTarget,
182                             mPhoneStateEventWhat);
183                     mTarget.sendMessage(message);
184                 }
185             } else if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) {
186                 mServiceState = ServiceState.newFromBundle(intent.getExtras());
187 
188                 if (mTarget != null && getNotifyServiceState()) {
189                     Message message = Message.obtain(mTarget,
190                             mServiceStateEventWhat);
191                     mTarget.sendMessage(message);
192                 }
193             }
194         } catch (Exception ex) {
195             Rlog.e(LOG_TAG, "[PhoneStateIntentRecv] caught " + ex);
196             ex.printStackTrace();
197         }
198     }
199 
200 }
201