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