CdmaSubscriptionSourceManager.java revision cbaa45bbf2cab852b6c9c3a887e9f803d4e857ea
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (c) 2011 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.cdma;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Settings;
2999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Class that handles the CDMA subscription source changed events from RIL
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CdmaSubscriptionSourceManager extends Handler {
35cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "CdmaSSM";
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 1;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int EVENT_GET_CDMA_SUBSCRIPTION_SOURCE     = 2;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int EVENT_RADIO_ON                         = 3;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int SUBSCRIPTION_SOURCE_UNKNOWN = -1;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int SUBSCRIPTION_FROM_RUIM      = 0; /* CDMA subscription from RUIM */
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int SUBSCRIPTION_FROM_NV        = 1; /* CDMA subscription from NV */
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int PREFERRED_CDMA_SUBSCRIPTION = SUBSCRIPTION_FROM_NV;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static CdmaSubscriptionSourceManager sInstance;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final Object sReferenceCountMonitor = new Object();
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static int sReferenceCount = 0;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ***** Instance Variables
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private CommandsInterface mCM;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Context mContext;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private RegistrantList mCdmaSubscriptionSourceChangedRegistrants = new RegistrantList();
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Type of CDMA subscription source
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private AtomicInteger mCdmaSubscriptionSource = new AtomicInteger(SUBSCRIPTION_FROM_NV);
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Constructor
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private CdmaSubscriptionSourceManager(Context context, CommandsInterface ci) {
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext = context;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM = ci;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForCdmaSubscriptionChanged(this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForOn(this, EVENT_RADIO_ON, null);
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int subscriptionSource = getDefaultCdmaSubscriptionSource();
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCdmaSubscriptionSource.set(subscriptionSource);
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This function creates a single instance of this class
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return object of type CdmaSubscriptionSourceManager
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static CdmaSubscriptionSourceManager getInstance(Context context,
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            CommandsInterface ci, Handler h, int what, Object obj) {
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized (sReferenceCountMonitor) {
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (null == sInstance) {
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sInstance = new CdmaSubscriptionSourceManager(context, ci);
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
78cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            CdmaSubscriptionSourceManager.sReferenceCount++;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sInstance.registerForCdmaSubscriptionSourceChanged(h, what, obj);
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sInstance;
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Unregisters for the registered event with RIL
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose(Handler h) {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCdmaSubscriptionSourceChangedRegistrants.remove(h);
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized (sReferenceCountMonitor) {
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sReferenceCount--;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (sReferenceCount <= 0) {
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.unregisterForCdmaSubscriptionChanged(this);
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.unregisterForOn(this);
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sInstance = null;
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * (non-Javadoc)
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @see android.os.Handler#handleMessage(android.os.Message)
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage(Message msg) {
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_CDMA_SUBSCRIPTION_SOURCE:
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            {
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("CDMA_SUBSCRIPTION_SOURCE event = " + msg.what);
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult) msg.obj;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleGetCdmaSubscriptionSource(ar);
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_ON: {
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.getCdmaSubscriptionSource(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_SOURCE));
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                super.handleMessage(msg);
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the current CDMA subscription source value
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return CDMA subscription source value
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaSubscriptionSource() {
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCdmaSubscriptionSource.get();
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets the default CDMA subscription source
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return Default CDMA subscription source from Settings DB if present.
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int getDefaultCdmaSubscriptionSource() {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Get the default value from the Settings
139b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown        int subscriptionSource = Settings.Global.getInt(mContext.getContentResolver(),
140b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                Settings.Global.CDMA_SUBSCRIPTION_MODE, PREFERRED_CDMA_SUBSCRIPTION);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return subscriptionSource;
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Clients automatically register for CDMA subscription source changed event
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * when they get an instance of this object.
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void registerForCdmaSubscriptionSourceChanged(Handler h, int what, Object obj) {
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant (h, what, obj);
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCdmaSubscriptionSourceChangedRegistrants.add(r);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handles the call to get the subscription source
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param ar AsyncResult object that contains the result of get CDMA
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *            subscription source call
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleGetCdmaSubscriptionSource(AsyncResult ar) {
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((ar.exception == null) && (ar.result != null)) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int newSubscriptionSource = ((int[]) ar.result)[0];
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (newSubscriptionSource != mCdmaSubscriptionSource.get()) {
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("Subscription Source Changed : " + mCdmaSubscriptionSource + " >> "
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        + newSubscriptionSource);
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCdmaSubscriptionSource.set(newSubscriptionSource);
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Notify registrants of the new CDMA subscription source
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCdmaSubscriptionSourceChangedRegistrants.notifyRegistrants(new AsyncResult(null,
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        null, null));
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // GET_CDMA_SUBSCRIPTION is returning Failure. Probably
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // because modem created GSM Phone. If modem created
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // GSMPhone, then PhoneProxy will trigger a change in
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Phone objects and this object will be destroyed.
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            logw("Unable to get CDMA Subscription Source, Exception: " + ar.exception
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ", result: " + ar.result);
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String s) {
183cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Rlog.d(LOG_TAG, s);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void logw(String s) {
187cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Rlog.w(LOG_TAG, s);
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
191