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