Home | History | Annotate | Download | only in telephony
      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 
     59     public PhoneStateIntentReceiver() {
     60         super();
     61         mFilter = new IntentFilter();
     62     }
     63 
     64     public PhoneStateIntentReceiver(Context context, Handler target) {
     65         this();
     66         setContext(context);
     67         setTarget(target);
     68     }
     69 
     70     public void setContext(Context c) {
     71         mContext = c;
     72     }
     73 
     74     public void setTarget(Handler h) {
     75         mTarget = h;
     76     }
     77 
     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 
     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      */
     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      */
    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 
    123     public void notifyPhoneCallState(int eventWhat) {
    124         mWants |= NOTIF_PHONE;
    125         mPhoneStateEventWhat = eventWhat;
    126         mFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    127     }
    128 
    129     public boolean getNotifyPhoneCallState() {
    130         return ((mWants & NOTIF_PHONE) != 0);
    131     }
    132 
    133     public void notifyServiceState(int eventWhat) {
    134         mWants |= NOTIF_SERVICE;
    135         mServiceStateEventWhat = eventWhat;
    136         mFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
    137     }
    138 
    139     public boolean getNotifyServiceState() {
    140         return ((mWants & NOTIF_SERVICE) != 0);
    141     }
    142 
    143     public void notifySignalStrength (int eventWhat) {
    144         mWants |= NOTIF_SIGNAL;
    145         mAsuEventWhat = eventWhat;
    146         mFilter.addAction(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED);
    147     }
    148 
    149     public boolean getNotifySignalStrength() {
    150         return ((mWants & NOTIF_SIGNAL) != 0);
    151     }
    152 
    153     public void registerIntent() {
    154         mContext.registerReceiver(this, mFilter);
    155     }
    156 
    157     public void unregisterIntent() {
    158         mContext.unregisterReceiver(this);
    159     }
    160 
    161     @Override
    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