10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.BroadcastReceiver;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Intent;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.IntentFilter;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.TelephonyManager;
2899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *                            DO NOT USE THIS CLASS:
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      Use android.telephony.TelephonyManager and PhoneStateListener instead.
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville@Deprecated
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class PhoneStateIntentReceiver extends BroadcastReceiver {
40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "PhoneStatIntentReceiver";
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG = false;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int NOTIF_PHONE    = 1 << 0;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int NOTIF_SERVICE  = 1 << 1;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int NOTIF_SIGNAL   = 1 << 2;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    PhoneConstants.State mPhoneState = PhoneConstants.State.IDLE;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    ServiceState mServiceState = new ServiceState();
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SignalStrength mSignalStrength = new SignalStrength();
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Context mContext;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Handler mTarget;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private IntentFilter mFilter;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mWants;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mPhoneStateEventWhat;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mServiceStateEventWhat;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mAsuEventWhat;
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneStateIntentReceiver() {
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super();
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFilter = new IntentFilter();
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneStateIntentReceiver(Context context, Handler target) {
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this();
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setContext(context);
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setTarget(target);
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setContext(Context c) {
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext = c;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setTarget(Handler h) {
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mTarget = h;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.State getPhoneState() {
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((mWants & NOTIF_PHONE) == 0) {
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ("client must call notifyPhoneCallState(int)");
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPhoneState;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceState getServiceState() {
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((mWants & NOTIF_SERVICE) == 0) {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ("client must call notifyServiceState(int)");
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mServiceState;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns current signal strength in as an asu 0..31
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Throws RuntimeException if client has not called notifySignalStrength()
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getSignalStrengthLevelAsu() {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: use new SignalStrength instead of asu
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((mWants & NOTIF_SIGNAL) == 0) {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ("client must call notifySignalStrength(int)");
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSignalStrength.getAsuLevel();
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return current signal strength in "dBm", ranging from -113 - -51dBm
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or -1 if unknown
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return signal strength in dBm, -1 if not yet updated
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Throws RuntimeException if client has not called notifySignalStrength()
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getSignalStrengthDbm() {
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((mWants & NOTIF_SIGNAL) == 0) {
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ("client must call notifySignalStrength(int)");
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSignalStrength.getDbm();
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyPhoneCallState(int eventWhat) {
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWants |= NOTIF_PHONE;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhoneStateEventWhat = eventWhat;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getNotifyPhoneCallState() {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((mWants & NOTIF_PHONE) != 0);
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyServiceState(int eventWhat) {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWants |= NOTIF_SERVICE;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateEventWhat = eventWhat;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getNotifyServiceState() {
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((mWants & NOTIF_SERVICE) != 0);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifySignalStrength (int eventWhat) {
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWants |= NOTIF_SIGNAL;
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mAsuEventWhat = eventWhat;
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mFilter.addAction(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED);
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getNotifySignalStrength() {
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((mWants & NOTIF_SIGNAL) != 0);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerIntent() {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext.registerReceiver(this, mFilter);
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterIntent() {
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext.unregisterReceiver(this);
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void onReceive(Context context, Intent intent) {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String action = intent.getAction();
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED.equals(action)) {
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mSignalStrength = SignalStrength.newFromBundle(intent.getExtras());
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mTarget != null && getNotifySignalStrength()) {
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    Message message = Message.obtain(mTarget, mAsuEventWhat);
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mTarget.sendMessage(message);
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
17499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                if (DBG) Rlog.d(LOG_TAG, "onReceiveIntent: ACTION_PHONE_STATE_CHANGED, state="
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                               + intent.getStringExtra(PhoneConstants.STATE_KEY));
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String phoneState = intent.getStringExtra(PhoneConstants.STATE_KEY);
177cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhoneState = Enum.valueOf(
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        PhoneConstants.State.class, phoneState);
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mTarget != null && getNotifyPhoneCallState()) {
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    Message message = Message.obtain(mTarget,
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mPhoneStateEventWhat);
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mTarget.sendMessage(message);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) {
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mServiceState = ServiceState.newFromBundle(intent.getExtras());
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mTarget != null && getNotifyServiceState()) {
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    Message message = Message.obtain(mTarget,
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mServiceStateEventWhat);
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mTarget.sendMessage(message);
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (Exception ex) {
19599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG, "[PhoneStateIntentRecv] caught " + ex);
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ex.printStackTrace();
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
201