CdmaSubscriptionSourceManager.java revision 0825495a331bb44df395a0cdb79fab85e68db5d5
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 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int subscriptionSource = Settings.Secure.getInt(mContext.getContentResolver(), 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Settings.Secure.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