Merge "DO NOT MERGE: Revert "LTE Changes for Telephony including Multiple PDN support and IPV6 support"" into honeycomb-mr1

This commit is contained in:
Wink Saville
2011-03-03 16:13:07 -08:00
committed by Android (Google) Code Review
43 changed files with 682 additions and 2570 deletions

View File

@ -221,32 +221,12 @@ public class ConnectivityManager
/** {@hide} */ /** {@hide} */
public static final int TYPE_DUMMY = 8; public static final int TYPE_DUMMY = 8;
/** {@hide} */ /** {@hide} */
public static final int TYPE_ETHERNET = 9; public static final int TYPE_ETHERNET = 9;
/** /** {@hide} TODO: Need to adjust this for WiMAX. */
* Over the air Adminstration. public static final int MAX_RADIO_TYPE = TYPE_DUMMY;
* {@hide} /** {@hide} TODO: Need to adjust this for WiMAX. */
*/ public static final int MAX_NETWORK_TYPE = TYPE_DUMMY;
public static final int TYPE_MOBILE_FOTA = 10;
/**
* IP Multimedia Subsystem
* {@hide}
*/
public static final int TYPE_MOBILE_IMS = 11;
/**
* Carrier Branded Services
* {@hide}
*/
public static final int TYPE_MOBILE_CBS = 12;
/** {@hide} */
public static final int MAX_RADIO_TYPE = TYPE_MOBILE_CBS;
/** {@hide} */
public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_CBS;
public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

View File

@ -437,8 +437,7 @@ public class MobileDataStateTracker implements NetworkStateTracker {
retValue = true; retValue = true;
break; break;
case Phone.APN_REQUEST_STARTED: case Phone.APN_REQUEST_STARTED:
// set IDLE here , avoid the following second FAILED not sent out // no need to do anything - we're already due some status update intents
mNetworkInfo.setDetailedState(DetailedState.IDLE, null, null);
retValue = true; retValue = true;
break; break;
case Phone.APN_REQUEST_FAILED: case Phone.APN_REQUEST_FAILED:
@ -547,12 +546,6 @@ public class MobileDataStateTracker implements NetworkStateTracker {
return Phone.APN_TYPE_DUN; return Phone.APN_TYPE_DUN;
case ConnectivityManager.TYPE_MOBILE_HIPRI: case ConnectivityManager.TYPE_MOBILE_HIPRI:
return Phone.APN_TYPE_HIPRI; return Phone.APN_TYPE_HIPRI;
case ConnectivityManager.TYPE_MOBILE_FOTA:
return Phone.APN_TYPE_FOTA;
case ConnectivityManager.TYPE_MOBILE_IMS:
return Phone.APN_TYPE_IMS;
case ConnectivityManager.TYPE_MOBILE_CBS:
return Phone.APN_TYPE_CBS;
default: default:
sloge("Error mapping networkType " + netType + " to apnType."); sloge("Error mapping networkType " + netType + " to apnType.");
return null; return null;

View File

@ -1723,14 +1723,6 @@ public final class Telephony {
public static final String TYPE = "type"; public static final String TYPE = "type";
public static final String INACTIVE_TIMER = "inactivetimer";
// Only if enabled try Data Connection.
public static final String ENABLED = "enabled";
// Rules apply based on class.
public static final String CLASS = "class";
/** /**
* The protocol to be used to connect to this APN. * The protocol to be used to connect to this APN.
* *

View File

@ -51,11 +51,6 @@
manager will disable alpha trasformation in animations where not manager will disable alpha trasformation in animations where not
strictly needed. --> strictly needed. -->
<bool name="config_sf_limitedAlpha">false</bool> <bool name="config_sf_limitedAlpha">false</bool>
<!-- Default value used to block data calls if ims is not
connected. If you use the ims apn DCT will block
any other apn from connecting until ims apn is connected-->
<bool name="ImsConnectedDefaultValue">false</bool>
<!-- Flag indicating whether the surface flinger is inefficient <!-- Flag indicating whether the surface flinger is inefficient
at performing a blur. Used by parts of the UI to turn off at performing a blur. Used by parts of the UI to turn off
@ -138,9 +133,6 @@
<item>"mobile_mms,2,0,2"</item> <item>"mobile_mms,2,0,2"</item>
<item>"mobile_supl,3,0,2"</item> <item>"mobile_supl,3,0,2"</item>
<item>"mobile_hipri,5,0,3"</item> <item>"mobile_hipri,5,0,3"</item>
<item>"mobile_fota,8,0,2"</item>
<item>"mobile_ims,9,0,2"</item>
<item>"mobile_cbs,10,0,2"</item>
</string-array> </string-array>
<!-- This string array should be overridden by the device to present a list of radio <!-- This string array should be overridden by the device to present a list of radio

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 B

View File

@ -246,16 +246,6 @@ public class PhoneStatusBarPolicy {
R.drawable.stat_sys_data_fully_out_3g, R.drawable.stat_sys_data_fully_out_3g,
R.drawable.stat_sys_data_fully_inandout_3g } R.drawable.stat_sys_data_fully_inandout_3g }
}; };
private static final int[][] sDataNetType_4g = {
{ R.drawable.stat_sys_data_connected_4g,
R.drawable.stat_sys_data_in_4g,
R.drawable.stat_sys_data_out_4g,
R.drawable.stat_sys_data_inandout_4g },
{ R.drawable.stat_sys_data_fully_connected_4g,
R.drawable.stat_sys_data_fully_in_4g,
R.drawable.stat_sys_data_fully_out_4g,
R.drawable.stat_sys_data_fully_inandout_4g }
};
private static final int[][] sDataNetType_e = { private static final int[][] sDataNetType_e = {
{ R.drawable.stat_sys_data_connected_e, { R.drawable.stat_sys_data_connected_e,
R.drawable.stat_sys_data_in_e, R.drawable.stat_sys_data_in_e,
@ -680,12 +670,9 @@ public class PhoneStatusBarPolicy {
case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
mDataIconList = sDataNetType_3g[mInetCondition]; mDataIconList = sDataNetType_3g[mInetCondition];
break; break;
case TelephonyManager.NETWORK_TYPE_LTE: // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
mDataIconList = sDataNetType_4g[mInetCondition];
break;
default: default:
mDataIconList = sDataNetType_g[mInetCondition]; mDataIconList = sDataNetType_g[mInetCondition];
break; break;

View File

@ -428,14 +428,10 @@ public class NetworkController extends BroadcastReceiver {
case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
mDataTypeIconId = R.drawable.stat_sys_signal_3g; mDataTypeIconId = R.drawable.stat_sys_signal_3g;
break; break;
case TelephonyManager.NETWORK_TYPE_LTE: // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
mDataTypeIconId = R.drawable.stat_sys_signal_4g;
break;
default: default:
mDataIconList = TelephonyIcons.DATA_G[mInetCondition]; mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
mDataTypeIconId = R.drawable.stat_sys_signal_gprs; mDataTypeIconId = R.drawable.stat_sys_signal_gprs;

View File

@ -124,18 +124,5 @@ class TelephonyIcons {
R.drawable.stat_sys_data_fully_inandout_1x } R.drawable.stat_sys_data_fully_inandout_1x }
}; };
// LTE and eHRPD
static final int[][] DATA_4G = {
{ R.drawable.stat_sys_data_connected_4g,
R.drawable.stat_sys_data_in_4g,
R.drawable.stat_sys_data_out_4g,
R.drawable.stat_sys_data_inandout_4g },
{ R.drawable.stat_sys_data_fully_connected_4g,
R.drawable.stat_sys_data_fully_in_4g,
R.drawable.stat_sys_data_fully_out_4g,
R.drawable.stat_sys_data_fully_inandout_4g }
};
} }

View File

@ -696,10 +696,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// TODO - move this into the MobileDataStateTracker // TODO - move this into the MobileDataStateTracker
int usedNetworkType = networkType; int usedNetworkType = networkType;
if(networkType == ConnectivityManager.TYPE_MOBILE) { if(networkType == ConnectivityManager.TYPE_MOBILE) {
usedNetworkType = convertFeatureToNetworkType(feature); if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
if (usedNetworkType < 0) { usedNetworkType = ConnectivityManager.TYPE_MOBILE_MMS;
Slog.e(TAG, "Can't match any netTracker!"); } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
usedNetworkType = networkType; usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
} }
} }
NetworkStateTracker network = mNetTrackers[usedNetworkType]; NetworkStateTracker network = mNetTrackers[usedNetworkType];
@ -843,9 +848,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// TODO - move to MobileDataStateTracker // TODO - move to MobileDataStateTracker
int usedNetworkType = networkType; int usedNetworkType = networkType;
if (networkType == ConnectivityManager.TYPE_MOBILE) { if (networkType == ConnectivityManager.TYPE_MOBILE) {
usedNetworkType = convertFeatureToNetworkType(feature); if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
if (usedNetworkType < 0) { usedNetworkType = ConnectivityManager.TYPE_MOBILE_MMS;
usedNetworkType = networkType; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
} }
} }
tracker = mNetTrackers[usedNetworkType]; tracker = mNetTrackers[usedNetworkType];
@ -2163,24 +2174,4 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private void loge(String s) { private void loge(String s) {
Slog.e(TAG, s); Slog.e(TAG, s);
} }
int convertFeatureToNetworkType(String feature){
int networkType = -1;
if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
networkType = ConnectivityManager.TYPE_MOBILE_MMS;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
networkType = ConnectivityManager.TYPE_MOBILE_SUPL;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
networkType = ConnectivityManager.TYPE_MOBILE_DUN;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
networkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_FOTA)) {
networkType = ConnectivityManager.TYPE_MOBILE_FOTA;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_IMS)) {
networkType = ConnectivityManager.TYPE_MOBILE_IMS;
} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_CBS)) {
networkType = ConnectivityManager.TYPE_MOBILE_CBS;
}
return networkType;
}
} }

View File

@ -91,10 +91,6 @@ public class ServiceState implements Parcelable {
public static final int RADIO_TECHNOLOGY_HSPA = 11; public static final int RADIO_TECHNOLOGY_HSPA = 11;
/** @hide */ /** @hide */
public static final int RADIO_TECHNOLOGY_EVDO_B = 12; public static final int RADIO_TECHNOLOGY_EVDO_B = 12;
/** @hide */
public static final int RADIO_TECHNOLOGY_LTE = 13;
/** @hide */
public static final int RADIO_TECHNOLOGY_EHRPD = 14;
/** /**
* Available registration states for GSM, UMTS and CDMA. * Available registration states for GSM, UMTS and CDMA.
@ -428,12 +424,6 @@ public class ServiceState implements Parcelable {
case 12: case 12:
radioTechnology = "EvDo rev. B"; radioTechnology = "EvDo rev. B";
break; break;
case 13:
radioTechnology = "LTE";
break;
case 14:
radioTechnology = "eHRPD";
break;
default: default:
Log.w(LOG_TAG, "mRadioTechnology variable out of range."); Log.w(LOG_TAG, "mRadioTechnology variable out of range.");
break; break;

View File

@ -1,164 +0,0 @@
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import android.app.PendingIntent;
import android.util.Log;
import java.util.ArrayList;
import com.android.internal.telephony.gsm.GsmDataConnection;
/**
* Maintain the Apn context
*/
public class ApnContext {
public static final int PENDING_ACTION_NONE = 1;
public static final int PENDING_ACTION_RECONNECT = 2;
public static final int PENDING_ACTION_APN_DISABLE = 3;
public final String LOG_TAG;
int pendingAction;
protected static final boolean DBG = true;
String mApnType;
DataConnectionTracker.State mState;
ArrayList<ApnSetting> mWaitingApns = null;
private int mWaitingApnsPermanentFailureCountDown = 0;
ApnSetting mApnSetting;
GsmDataConnection mDataConnection;
String mReason;
PendingIntent mReconnectIntent;
public ApnContext(String apnType, String logTag) {
mApnType = apnType;
mState = DataConnectionTracker.State.IDLE;
setReason(Phone.REASON_DATA_ENABLED);
pendingAction = PENDING_ACTION_NONE;
LOG_TAG = logTag;
}
public int getPendingAction() {
return pendingAction;
}
public void setPendingAction(int pa) {
pendingAction = pa;
}
public int getPermFailCount() {
return mWaitingApnsPermanentFailureCountDown;
}
public void decPermFailCount() {
mWaitingApnsPermanentFailureCountDown--;
}
public String getApnType() {
return mApnType;
}
public GsmDataConnection getDataConnection() {
return mDataConnection;
}
public void setDataConnection(GsmDataConnection dataConnection) {
mDataConnection = dataConnection;
}
public ApnSetting getApnSetting() {
return mApnSetting;
}
public void setApnSetting(ApnSetting apnSetting) {
mApnSetting = apnSetting;
}
public void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
mWaitingApns = waitingApns;
}
public ApnSetting getNextApn() {
ArrayList<ApnSetting> list = mWaitingApns;
ApnSetting apn = null;
if (list != null) {
if (!list.isEmpty()) {
apn = list.get(0);
}
}
return apn;
}
public void removeNextApn() {
if ((mWaitingApns != null) && (!mWaitingApns.isEmpty())) {
mWaitingApns.remove(0);
}
}
public ArrayList<ApnSetting> getWaitingApns() {
return mWaitingApns;
}
public void setState(DataConnectionTracker.State s) {
if (DBG)
log("setState: " + s + " for type " + mApnType + ", previous state:" + mState);
mState = s;
if (mState == DataConnectionTracker.State.FAILED) {
if (mWaitingApns != null)
mWaitingApns.clear(); // when teardown the connection and set to IDLE
}
}
public DataConnectionTracker.State getState() {
return mState;
}
public void setReason(String reason) {
if (DBG)
log("set reason as " + reason + ", for type " + mApnType + ",current state " + mState);
mReason = reason;
}
public String getReason() {
return mReason;
}
public void setReconnectIntent(PendingIntent intent) {
if (DBG)
log("set ReconnectIntent for type " + mApnType);
mReconnectIntent = intent;
}
public PendingIntent getReconnectIntent() {
return mReconnectIntent;
}
protected void log(String s) {
Log.d(LOG_TAG, "[ApnContext] " + s);
}
}

View File

@ -38,17 +38,12 @@ public class ApnSetting {
public String numeric; public String numeric;
public String protocol; public String protocol;
public String roamingProtocol; public String roamingProtocol;
public boolean enabled;
int timer;
int apnclass;
public ApnSetting(int id, String numeric, String carrier, String apn, public ApnSetting(int id, String numeric, String carrier, String apn,
String proxy, String port, String proxy, String port,
String mmsc, String mmsProxy, String mmsPort, String mmsc, String mmsProxy, String mmsPort,
String user, String password, int authType, String[] types, String user, String password, int authType, String[] types,
String protocol, String roamingProtocol, String protocol, String roamingProtocol) {
boolean enabled, int timer, int apnclass) {
this.id = id; this.id = id;
this.numeric = numeric; this.numeric = numeric;
this.carrier = carrier; this.carrier = carrier;
@ -64,9 +59,6 @@ public class ApnSetting {
this.types = types; this.types = types;
this.protocol = protocol; this.protocol = protocol;
this.roamingProtocol = roamingProtocol; this.roamingProtocol = roamingProtocol;
this.enabled = enabled;
this.timer = timer;
this.apnclass = apnclass;
} }
/** /**
@ -85,7 +77,7 @@ public class ApnSetting {
* v2 format: * v2 format:
* [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
* <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>, * <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>,
* <type>[| <type>...], <protocol>, <roaming_protocol>, <enabled>, <timer>, <apnclass> * <type>[| <type>...], <protocol>, <roaming_protocol>
* *
* Note that the strings generated by toString() do not contain the username * Note that the strings generated by toString() do not contain the username
* and password and thus cannot be read by this method. * and password and thus cannot be read by this method.
@ -118,16 +110,11 @@ public class ApnSetting {
String[] typeArray; String[] typeArray;
String protocol, roamingProtocol; String protocol, roamingProtocol;
boolean enabled;
int timer, apnclass;
if (version == 1) { if (version == 1) {
typeArray = new String[a.length - 13]; typeArray = new String[a.length - 13];
System.arraycopy(a, 13, typeArray, 0, a.length - 13); System.arraycopy(a, 13, typeArray, 0, a.length - 13);
protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
enabled = true;
timer = 0;
apnclass = 0;
} else { } else {
if (a.length < 16) { if (a.length < 16) {
return null; return null;
@ -135,14 +122,10 @@ public class ApnSetting {
typeArray = a[13].split("\\s*\\|\\s*"); typeArray = a[13].split("\\s*\\|\\s*");
protocol = a[14]; protocol = a[14];
roamingProtocol = a[15]; roamingProtocol = a[15];
enabled = Integer.parseInt(a[16]) != 0;
timer = Integer.parseInt(a[17]);
apnclass = Integer.parseInt(a[18]);
} }
return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol, a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol);
enabled,timer,apnclass);
} }
public String toString() { public String toString() {
@ -166,9 +149,6 @@ public class ApnSetting {
} }
sb.append(", ").append(protocol); sb.append(", ").append(protocol);
sb.append(", ").append(roamingProtocol); sb.append(", ").append(roamingProtocol);
sb.append(", ").append(enabled);
sb.append(", ").append(timer);
sb.append(", ").append(apnclass);
return sb.toString(); return sb.toString();
} }

View File

@ -34,9 +34,6 @@ public abstract class BaseCommands implements CommandsInterface {
//***** Instance Variables //***** Instance Variables
protected Context mContext; protected Context mContext;
protected RadioState mState = RadioState.RADIO_UNAVAILABLE; protected RadioState mState = RadioState.RADIO_UNAVAILABLE;
protected RadioState mSimState = RadioState.RADIO_UNAVAILABLE;
protected RadioState mRuimState = RadioState.RADIO_UNAVAILABLE;
protected RadioState mNvState = RadioState.RADIO_UNAVAILABLE;
protected Object mStateMonitor = new Object(); protected Object mStateMonitor = new Object();
protected RegistrantList mRadioStateChangedRegistrants = new RegistrantList(); protected RegistrantList mRadioStateChangedRegistrants = new RegistrantList();
@ -108,18 +105,6 @@ public abstract class BaseCommands implements CommandsInterface {
return mState; return mState;
} }
public RadioState getSimState() {
return mSimState;
}
public RadioState getRuimState() {
return mRuimState;
}
public RadioState getNvState() {
return mNvState;
}
public void registerForRadioStateChanged(Handler h, int what, Object obj) { public void registerForRadioStateChanged(Handler h, int what, Object obj) {
Registrant r = new Registrant (h, what, obj); Registrant r = new Registrant (h, what, obj);
@ -215,7 +200,7 @@ public abstract class BaseCommands implements CommandsInterface {
synchronized (mStateMonitor) { synchronized (mStateMonitor) {
mSIMReadyRegistrants.add(r); mSIMReadyRegistrants.add(r);
if (mSimState.isSIMReady()) { if (mState.isSIMReady()) {
r.notifyRegistrant(new AsyncResult(null, null, null)); r.notifyRegistrant(new AsyncResult(null, null, null));
} }
} }
@ -234,7 +219,7 @@ public abstract class BaseCommands implements CommandsInterface {
synchronized (mStateMonitor) { synchronized (mStateMonitor) {
mRUIMReadyRegistrants.add(r); mRUIMReadyRegistrants.add(r);
if (mRuimState.isRUIMReady()) { if (mState.isRUIMReady()) {
r.notifyRegistrant(new AsyncResult(null, null, null)); r.notifyRegistrant(new AsyncResult(null, null, null));
} }
} }
@ -253,7 +238,7 @@ public abstract class BaseCommands implements CommandsInterface {
synchronized (mStateMonitor) { synchronized (mStateMonitor) {
mNVReadyRegistrants.add(r); mNVReadyRegistrants.add(r);
if (mNvState.isNVReady()) { if (mState.isNVReady()) {
r.notifyRegistrant(new AsyncResult(null, null, null)); r.notifyRegistrant(new AsyncResult(null, null, null));
} }
} }
@ -271,7 +256,7 @@ public abstract class BaseCommands implements CommandsInterface {
synchronized (mStateMonitor) { synchronized (mStateMonitor) {
mSIMLockedRegistrants.add(r); mSIMLockedRegistrants.add(r);
if (mSimState == RadioState.SIM_LOCKED_OR_ABSENT) { if (mState == RadioState.SIM_LOCKED_OR_ABSENT) {
r.notifyRegistrant(new AsyncResult(null, null, null)); r.notifyRegistrant(new AsyncResult(null, null, null));
} }
} }
@ -289,7 +274,7 @@ public abstract class BaseCommands implements CommandsInterface {
synchronized (mStateMonitor) { synchronized (mStateMonitor) {
mRUIMLockedRegistrants.add(r); mRUIMLockedRegistrants.add(r);
if (mRuimState == RadioState.RUIM_LOCKED_OR_ABSENT) { if (mState == RadioState.RUIM_LOCKED_OR_ABSENT) {
r.notifyRegistrant(new AsyncResult(null, null, null)); r.notifyRegistrant(new AsyncResult(null, null, null));
} }
} }
@ -668,22 +653,6 @@ public abstract class BaseCommands implements CommandsInterface {
return; return;
} }
// FIXME: Use Constants or Enums
if(mState.getType() == 0) {
mSimState = mState;
mRuimState = mState;
mNvState = mState;
}
else if (mState.getType() == 1) {
mSimState = mState;
}
else if (mState.getType() == 2) {
mRuimState = mState;
}
else if (mState.getType() == 3) {
mNvState = mState;
}
mRadioStateChangedRegistrants.notifyRegistrants(); mRadioStateChangedRegistrants.notifyRegistrants();
if (mState.isAvailable() && !oldState.isAvailable()) { if (mState.isAvailable() && !oldState.isAvailable()) {

View File

@ -119,10 +119,6 @@ public abstract class CallTracker extends Handler {
//***** Overridden from Handler //***** Overridden from Handler
public abstract void handleMessage (Message msg); public abstract void handleMessage (Message msg);
public abstract void registerForVoiceCallStarted(Handler h, int what, Object obj);
public abstract void unregisterForVoiceCallStarted(Handler h);
public abstract void registerForVoiceCallEnded(Handler h, int what, Object obj);
public abstract void unregisterForVoiceCallEnded(Handler h);
protected abstract void log(String msg); protected abstract void log(String msg);

View File

@ -20,29 +20,25 @@ import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import android.os.Message; import android.os.Message;
import android.os.Handler; import android.os.Handler;
import android.os.SystemProperties;
/** /**
* {@hide} * {@hide}
*/ */
public interface CommandsInterface { public interface CommandsInterface {
// TODO: Get rid of mot from property.
static final boolean LTE_AVAILABLE_ON_CDMA =
SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
enum RadioState { enum RadioState {
RADIO_OFF(0), /* Radio explictly powered off (eg CFUN=0) */ RADIO_OFF, /* Radio explicitly powered off (e.g. CFUN=0) */
RADIO_UNAVAILABLE(0), /* Radio unavailable (eg, resetting or not booted) */ RADIO_UNAVAILABLE, /* Radio unavailable (e.g. resetting or not booted) */
SIM_NOT_READY(1), /* Radio is on, but the SIM interface is not ready */ SIM_NOT_READY, /* Radio is on, but the SIM interface is not ready */
SIM_LOCKED_OR_ABSENT(1), /* SIM PIN locked, PUK required, network SIM_LOCKED_OR_ABSENT, /* SIM PIN locked, PUK required, network
personalization, or SIM absent */ personalization, or SIM absent */
SIM_READY(1), /* Radio is on and SIM interface is available */ SIM_READY, /* Radio is on and SIM interface is available */
RUIM_NOT_READY(2), /* Radio is on, but the RUIM interface is not ready */ RUIM_NOT_READY, /* Radio is on, but the RUIM interface is not ready */
RUIM_READY(2), /* Radio is on and the RUIM interface is available */ RUIM_READY, /* Radio is on and the RUIM interface is available */
RUIM_LOCKED_OR_ABSENT(2), /* RUIM PIN locked, PUK required, network RUIM_LOCKED_OR_ABSENT, /* RUIM PIN locked, PUK required, network
personalization locked, or RUIM absent */ personalization locked, or RUIM absent */
NV_NOT_READY(3), /* Radio is on, but the NV interface is not available */ NV_NOT_READY, /* Radio is on, but the NV interface is not available */
NV_READY(3); /* Radio is on and the NV interface is available */ NV_READY; /* Radio is on and the NV interface is available */
public boolean isOn() /* and available...*/ { public boolean isOn() /* and available...*/ {
return this == SIM_NOT_READY return this == SIM_NOT_READY
@ -54,14 +50,6 @@ public interface CommandsInterface {
|| this == NV_NOT_READY || this == NV_NOT_READY
|| this == NV_READY; || this == NV_READY;
} }
private int stateType;
private RadioState (int type) {
stateType = type;
}
public int getType() {
return stateType;
}
public boolean isAvailable() { public boolean isAvailable() {
return this != RADIO_UNAVAILABLE; return this != RADIO_UNAVAILABLE;
@ -80,25 +68,17 @@ public interface CommandsInterface {
} }
public boolean isGsm() { public boolean isGsm() {
if (LTE_AVAILABLE_ON_CDMA) { return this == SIM_NOT_READY
return false; || this == SIM_LOCKED_OR_ABSENT
} else { || this == SIM_READY;
return this == SIM_NOT_READY
|| this == SIM_LOCKED_OR_ABSENT
|| this == SIM_READY;
}
} }
public boolean isCdma() { public boolean isCdma() {
if (LTE_AVAILABLE_ON_CDMA) { return this == RUIM_NOT_READY
return true; || this == RUIM_READY
} else { || this == RUIM_LOCKED_OR_ABSENT
return this == RUIM_NOT_READY || this == NV_NOT_READY
|| this == RUIM_READY || this == NV_READY;
|| this == RUIM_LOCKED_OR_ABSENT
|| this == NV_NOT_READY
|| this == NV_READY;
}
} }
} }
@ -173,9 +153,6 @@ public interface CommandsInterface {
//***** Methods //***** Methods
RadioState getRadioState(); RadioState getRadioState();
RadioState getSimState();
RadioState getRuimState();
RadioState getNvState();
/** /**
* Fires on any RadioState transition * Fires on any RadioState transition

View File

@ -97,14 +97,14 @@ public abstract class DataConnectionTracker extends Handler {
protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 12; protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 12;
protected static final int EVENT_VOICE_CALL_STARTED = 14; protected static final int EVENT_VOICE_CALL_STARTED = 14;
protected static final int EVENT_VOICE_CALL_ENDED = 15; protected static final int EVENT_VOICE_CALL_ENDED = 15;
protected static final int EVENT_DATA_CONNECTION_DETACHED = 19; protected static final int EVENT_GPRS_DETACHED = 19;
protected static final int EVENT_LINK_STATE_CHANGED = 20; protected static final int EVENT_LINK_STATE_CHANGED = 20;
protected static final int EVENT_ROAMING_ON = 21; protected static final int EVENT_ROAMING_ON = 21;
protected static final int EVENT_ROAMING_OFF = 22; protected static final int EVENT_ROAMING_OFF = 22;
protected static final int EVENT_ENABLE_NEW_APN = 23; protected static final int EVENT_ENABLE_NEW_APN = 23;
protected static final int EVENT_RESTORE_DEFAULT_APN = 24; protected static final int EVENT_RESTORE_DEFAULT_APN = 24;
protected static final int EVENT_DISCONNECT_DONE = 25; protected static final int EVENT_DISCONNECT_DONE = 25;
protected static final int EVENT_DATA_CONNECTION_ATTACHED = 26; protected static final int EVENT_GPRS_ATTACHED = 26;
protected static final int EVENT_START_NETSTAT_POLL = 27; protected static final int EVENT_START_NETSTAT_POLL = 27;
protected static final int EVENT_START_RECOVERY = 28; protected static final int EVENT_START_RECOVERY = 28;
protected static final int EVENT_APN_CHANGED = 29; protected static final int EVENT_APN_CHANGED = 29;
@ -117,8 +117,8 @@ public abstract class DataConnectionTracker extends Handler {
protected static final int EVENT_RESTART_RADIO = 36; protected static final int EVENT_RESTART_RADIO = 36;
protected static final int EVENT_SET_INTERNAL_DATA_ENABLE = 37; protected static final int EVENT_SET_INTERNAL_DATA_ENABLE = 37;
protected static final int EVENT_RESET_DONE = 38; protected static final int EVENT_RESET_DONE = 38;
public static final int CMD_SET_DATA_ENABLE = 39; public static final int CMD_SET_DATA_ENABLE = 39;
public static final int EVENT_CLEAN_UP_ALL_CONNECTIONS = 40;
/***** Constants *****/ /***** Constants *****/
@ -128,10 +128,7 @@ public abstract class DataConnectionTracker extends Handler {
protected static final int APN_SUPL_ID = 2; protected static final int APN_SUPL_ID = 2;
protected static final int APN_DUN_ID = 3; protected static final int APN_DUN_ID = 3;
protected static final int APN_HIPRI_ID = 4; protected static final int APN_HIPRI_ID = 4;
protected static final int APN_IMS_ID = 5; protected static final int APN_NUM_TYPES = 5;
protected static final int APN_FOTA_ID = 6;
protected static final int APN_CBS_ID = 7;
protected static final int APN_NUM_TYPES = 8;
public static final int DISABLED = 0; public static final int DISABLED = 0;
public static final int ENABLED = 1; public static final int ENABLED = 1;
@ -264,8 +261,15 @@ public abstract class DataConnectionTracker extends Handler {
startNetStatPoll(); startNetStatPoll();
} else if (action.equals(getActionIntentReconnectAlarm())) { } else if (action.equals(getActionIntentReconnectAlarm())) {
log("Reconnect alarm. Previous state was " + mState); log("Reconnect alarm. Previous state was " + mState);
onActionIntentReconnectAlarm(intent);
String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
if (mState == State.FAILED) {
Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 0; // tearDown is false
msg.obj = reason;
sendMessage(msg);
}
sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
} else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
final android.net.NetworkInfo networkInfo = (NetworkInfo) final android.net.NetworkInfo networkInfo = (NetworkInfo)
intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
@ -283,18 +287,6 @@ public abstract class DataConnectionTracker extends Handler {
} }
}; };
protected void onActionIntentReconnectAlarm(Intent intent) {
String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
if (mState == State.FAILED) {
Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 0; // tearDown is false
msg.arg2 = 0;
msg.obj = reason;
sendMessage(msg);
}
sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
}
/** /**
* Default constructor * Default constructor
*/ */
@ -342,10 +334,22 @@ public abstract class DataConnectionTracker extends Handler {
} }
public State getState() { public State getState() {
// TODO: reimplement to use apnType better yet REMOVE.
return mState; return mState;
} }
public String getStateInString() {
switch (mState) {
case IDLE: return "IDLE";
case INITING: return "INIT";
case CONNECTING: return "CING";
case SCANNING: return "SCAN";
case CONNECTED: return "CNTD";
case DISCONNECTING: return "DING";
case FAILED: return "FAIL";
default: return "ERRO";
}
}
/** /**
* @return the data connections * @return the data connections
*/ */
@ -370,7 +374,7 @@ public abstract class DataConnectionTracker extends Handler {
return result; return result;
} }
private String getActiveApnType() { public String getActiveApnType() {
String result; String result;
if (mActiveApn != null) { if (mActiveApn != null) {
result = apnIdToType(mActiveApn.id); result = apnIdToType(mActiveApn.id);
@ -380,7 +384,7 @@ public abstract class DataConnectionTracker extends Handler {
return result; return result;
} }
public String getActiveApnString() { protected String getActiveApnString() {
String result = null; String result = null;
if (mActiveApn != null) { if (mActiveApn != null) {
result = mActiveApn.apn; result = mActiveApn.apn;
@ -388,6 +392,17 @@ public abstract class DataConnectionTracker extends Handler {
return result; return result;
} }
/**
* The data connection is expected to be setup while device
* 1. has Icc card
* 2. registered for data service
* 3. user doesn't explicitly disable data service
* 4. wifi is not on
*
* @return false while no data connection if all above requirements are met.
*/
public abstract boolean isDataConnectionAsDesired();
//The data roaming setting is now located in the shared preferences. //The data roaming setting is now located in the shared preferences.
// See if the requested preference value is the same as that stored in // See if the requested preference value is the same as that stored in
// the shared values. If it is not, then update it. // the shared values. If it is not, then update it.
@ -428,8 +443,7 @@ public abstract class DataConnectionTracker extends Handler {
protected abstract void onResetDone(AsyncResult ar); protected abstract void onResetDone(AsyncResult ar);
protected abstract void onVoiceCallStarted(); protected abstract void onVoiceCallStarted();
protected abstract void onVoiceCallEnded(); protected abstract void onVoiceCallEnded();
protected abstract void onCleanUpConnection(boolean tearDown, int apnId, String reason); protected abstract void onCleanUpConnection(boolean tearDown, String reason);
protected abstract void onCleanUpAllConnections();
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
@ -484,15 +498,11 @@ public abstract class DataConnectionTracker extends Handler {
onVoiceCallEnded(); onVoiceCallEnded();
break; break;
case EVENT_CLEAN_UP_ALL_CONNECTIONS: { case EVENT_CLEAN_UP_CONNECTION:
onCleanUpAllConnections();
break;
}
case EVENT_CLEAN_UP_CONNECTION: {
boolean tearDown = (msg.arg1 == 0) ? false : true; boolean tearDown = (msg.arg1 == 0) ? false : true;
onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj); onCleanUpConnection(tearDown, (String) msg.obj);
break; break;
}
case EVENT_SET_INTERNAL_DATA_ENABLE: { case EVENT_SET_INTERNAL_DATA_ENABLE: {
boolean enabled = (msg.arg1 == ENABLED) ? true : false; boolean enabled = (msg.arg1 == ENABLED) ? true : false;
onSetInternalDataEnabled(enabled); onSetInternalDataEnabled(enabled);
@ -547,12 +557,6 @@ public abstract class DataConnectionTracker extends Handler {
return APN_DUN_ID; return APN_DUN_ID;
} else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) { } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) {
return APN_HIPRI_ID; return APN_HIPRI_ID;
} else if (TextUtils.equals(type, Phone.APN_TYPE_IMS)) {
return APN_IMS_ID;
} else if (TextUtils.equals(type, Phone.APN_TYPE_FOTA)) {
return APN_FOTA_ID;
} else if (TextUtils.equals(type, Phone.APN_TYPE_CBS)) {
return APN_CBS_ID;
} else { } else {
return APN_INVALID_ID; return APN_INVALID_ID;
} }
@ -570,12 +574,6 @@ public abstract class DataConnectionTracker extends Handler {
return Phone.APN_TYPE_DUN; return Phone.APN_TYPE_DUN;
case APN_HIPRI_ID: case APN_HIPRI_ID:
return Phone.APN_TYPE_HIPRI; return Phone.APN_TYPE_HIPRI;
case APN_IMS_ID:
return Phone.APN_TYPE_IMS;
case APN_FOTA_ID:
return Phone.APN_TYPE_FOTA;
case APN_CBS_ID:
return Phone.APN_TYPE_CBS;
default: default:
log("Unknown id (" + id + ") in apnIdToType"); log("Unknown id (" + id + ") in apnIdToType");
return Phone.APN_TYPE_DEFAULT; return Phone.APN_TYPE_DEFAULT;
@ -828,7 +826,7 @@ public abstract class DataConnectionTracker extends Handler {
dataEnabled[apnId] = false; dataEnabled[apnId] = false;
enabledCount--; enabledCount--;
if (enabledCount == 0) { if (enabledCount == 0) {
onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED); onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
} }
// send the disconnect msg manually, since the normal route wont send // send the disconnect msg manually, since the normal route wont send
@ -886,7 +884,7 @@ public abstract class DataConnectionTracker extends Handler {
mRetryMgr.resetRetryCount(); mRetryMgr.resetRetryCount();
onTrySetupData(Phone.REASON_DATA_ENABLED); onTrySetupData(Phone.REASON_DATA_ENABLED);
} else { } else {
cleanUpAllConnections(); onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
} }
} }
} }
@ -896,17 +894,6 @@ public abstract class DataConnectionTracker extends Handler {
return mDataEnabled; return mDataEnabled;
} }
public void cleanUpAllConnections() {
Message msg = obtainMessage(EVENT_CLEAN_UP_ALL_CONNECTIONS);
sendMessage(msg);
}
public boolean isAnyActiveDataConnections() {
// TODO: Remember if there are any connected or
// loop asking each DC/APN?
return true;
}
protected void onSetDataEnabled(boolean enable) { protected void onSetDataEnabled(boolean enable) {
boolean prevEnabled = getAnyDataEnabled(); boolean prevEnabled = getAnyDataEnabled();
if (mDataEnabled != enable) { if (mDataEnabled != enable) {
@ -920,7 +907,7 @@ public abstract class DataConnectionTracker extends Handler {
mRetryMgr.resetRetryCount(); mRetryMgr.resetRetryCount();
onTrySetupData(Phone.REASON_DATA_ENABLED); onTrySetupData(Phone.REASON_DATA_ENABLED);
} else { } else {
onCleanUpConnection(true, APN_DEFAULT_ID, Phone.REASON_DATA_DISABLED); onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
} }
} }
} }

View File

@ -28,7 +28,6 @@ import android.util.Log;
import com.android.internal.telephony.PhoneBase; import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.CommandsInterface.RadioState; import com.android.internal.telephony.CommandsInterface.RadioState;
import android.os.SystemProperties;
/** /**
* {@hide} * {@hide}
@ -86,10 +85,6 @@ public abstract class IccCard {
private static final int EVENT_QUERY_FACILITY_FDN_DONE = 10; private static final int EVENT_QUERY_FACILITY_FDN_DONE = 10;
private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 11; private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 11;
// FIXME: remove mot from property
static final boolean LTE_AVAILABLE_ON_CDMA =
SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
/* /*
UNKNOWN is a transient state, for example, after uesr inputs ICC pin under UNKNOWN is a transient state, for example, after uesr inputs ICC pin under
PIN_REQUIRED state, the query for ICC status returns UNKNOWN before it PIN_REQUIRED state, the query for ICC status returns UNKNOWN before it
@ -431,9 +426,6 @@ public abstract class IccCard {
broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED, broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED,
INTENT_VALUE_LOCKED_NETWORK); INTENT_VALUE_LOCKED_NETWORK);
} }
if (oldState != State.READY && newState == State.READY && LTE_AVAILABLE_ON_CDMA) {
mPhone.mSIMRecords.onSimReady();
}
} }
/** /**
@ -620,16 +612,14 @@ public abstract class IccCard {
currentRadioState == RadioState.SIM_NOT_READY || currentRadioState == RadioState.SIM_NOT_READY ||
currentRadioState == RadioState.RUIM_NOT_READY || currentRadioState == RadioState.RUIM_NOT_READY ||
currentRadioState == RadioState.NV_NOT_READY || currentRadioState == RadioState.NV_NOT_READY ||
(currentRadioState == RadioState.NV_READY && !LTE_AVAILABLE_ON_CDMA)) { currentRadioState == RadioState.NV_READY) {
return IccCard.State.NOT_READY; return IccCard.State.NOT_READY;
} }
if( currentRadioState == RadioState.SIM_LOCKED_OR_ABSENT || if( currentRadioState == RadioState.SIM_LOCKED_OR_ABSENT ||
currentRadioState == RadioState.SIM_READY || currentRadioState == RadioState.SIM_READY ||
currentRadioState == RadioState.RUIM_LOCKED_OR_ABSENT || currentRadioState == RadioState.RUIM_LOCKED_OR_ABSENT ||
currentRadioState == RadioState.RUIM_READY || currentRadioState == RadioState.RUIM_READY) {
(currentRadioState == RadioState.NV_READY && LTE_AVAILABLE_ON_CDMA)) {
int index; int index;

View File

@ -28,8 +28,7 @@ public class IccCardApplication {
APPTYPE_SIM, APPTYPE_SIM,
APPTYPE_USIM, APPTYPE_USIM,
APPTYPE_RUIM, APPTYPE_RUIM,
APPTYPE_CSIM, APPTYPE_CSIM
APPTYPE_ISIM
}; };
public enum AppState{ public enum AppState{
@ -116,7 +115,6 @@ public class IccCardApplication {
case 2: newType = AppType.APPTYPE_USIM; break; case 2: newType = AppType.APPTYPE_USIM; break;
case 3: newType = AppType.APPTYPE_RUIM; break; case 3: newType = AppType.APPTYPE_RUIM; break;
case 4: newType = AppType.APPTYPE_CSIM; break; case 4: newType = AppType.APPTYPE_CSIM; break;
case 5: newType = AppType.APPTYPE_ISIM; break;
default: default:
throw new RuntimeException( throw new RuntimeException(
"Unrecognized RIL_AppType: " +type); "Unrecognized RIL_AppType: " +type);

View File

@ -58,13 +58,6 @@ public interface IccConstants {
static final int EF_CST = 0x6f32; static final int EF_CST = 0x6f32;
static final int EF_RUIM_SPN =0x6F41; static final int EF_RUIM_SPN =0x6F41;
//ISIM access
static final int EF_IMPU = 0x6f04;
static final int EF_IMPI = 0x6f02;
static final int EF_DOMAIN = 0x6f03;
static final int EF_IST = 0x6f07;
static final int EF_PCSCF = 0x6f09;
// SMS record length from TS 51.011 10.5.3 // SMS record length from TS 51.011 10.5.3
static public final int SMS_RECORD_LENGTH = 176; static public final int SMS_RECORD_LENGTH = 176;
@ -74,7 +67,4 @@ public interface IccConstants {
static final String DF_GRAPHICS = "5F50"; static final String DF_GRAPHICS = "5F50";
static final String DF_GSM = "7F20"; static final String DF_GSM = "7F20";
static final String DF_CDMA = "7F25"; static final String DF_CDMA = "7F25";
//ISIM access
static final String DF_ADFISIM = "7FFF";
} }

View File

@ -125,12 +125,6 @@ public interface Phone {
static final String APN_TYPE_DUN = "dun"; static final String APN_TYPE_DUN = "dun";
/** APN type for HiPri traffic */ /** APN type for HiPri traffic */
static final String APN_TYPE_HIPRI = "hipri"; static final String APN_TYPE_HIPRI = "hipri";
/** APN type for FOTA */
static final String APN_TYPE_FOTA = "fota";
/** APN type for IMS */
static final String APN_TYPE_IMS = "ims";
/** APN type for CBS */
static final String APN_TYPE_CBS = "cbs";
// "Features" accessible through the connectivity manager // "Features" accessible through the connectivity manager
static final String FEATURE_ENABLE_MMS = "enableMMS"; static final String FEATURE_ENABLE_MMS = "enableMMS";
@ -138,9 +132,6 @@ public interface Phone {
static final String FEATURE_ENABLE_DUN = "enableDUN"; static final String FEATURE_ENABLE_DUN = "enableDUN";
static final String FEATURE_ENABLE_HIPRI = "enableHIPRI"; static final String FEATURE_ENABLE_HIPRI = "enableHIPRI";
static final String FEATURE_ENABLE_DUN_ALWAYS = "enableDUNAlways"; static final String FEATURE_ENABLE_DUN_ALWAYS = "enableDUNAlways";
static final String FEATURE_ENABLE_FOTA = "enableFOTA";
static final String FEATURE_ENABLE_IMS = "enableIMS";
static final String FEATURE_ENABLE_CBS = "enableCBS";
/** /**
* Return codes for <code>enableApnType()</code> * Return codes for <code>enableApnType()</code>
@ -149,7 +140,6 @@ public interface Phone {
static final int APN_REQUEST_STARTED = 1; static final int APN_REQUEST_STARTED = 1;
static final int APN_TYPE_NOT_AVAILABLE = 2; static final int APN_TYPE_NOT_AVAILABLE = 2;
static final int APN_REQUEST_FAILED = 3; static final int APN_REQUEST_FAILED = 3;
static final int APN_ALREADY_INACTIVE = 4;
/** /**
@ -174,7 +164,6 @@ public interface Phone {
static final String REASON_PS_RESTRICT_ENABLED = "psRestrictEnabled"; static final String REASON_PS_RESTRICT_ENABLED = "psRestrictEnabled";
static final String REASON_PS_RESTRICT_DISABLED = "psRestrictDisabled"; static final String REASON_PS_RESTRICT_DISABLED = "psRestrictDisabled";
static final String REASON_SIM_LOADED = "simLoaded"; static final String REASON_SIM_LOADED = "simLoaded";
static final String REASON_NW_TYPE_CHANGED = "nwTypeChanged";
// Used for band mode selection methods // Used for band mode selection methods
static final int BM_UNSPECIFIED = 0; // selected by baseband automatically static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
@ -204,7 +193,6 @@ public interface Phone {
int NT_MODE_EVDO_NO_CDMA = RILConstants.NETWORK_MODE_EVDO_NO_CDMA; int NT_MODE_EVDO_NO_CDMA = RILConstants.NETWORK_MODE_EVDO_NO_CDMA;
int NT_MODE_GLOBAL = RILConstants.NETWORK_MODE_GLOBAL; int NT_MODE_GLOBAL = RILConstants.NETWORK_MODE_GLOBAL;
int NT_MODE_LTE_ONLY = RILConstants.NETWORK_MODE_LTE_ONLY;
int PREFERRED_NT_MODE = RILConstants.PREFERRED_NETWORK_MODE; int PREFERRED_NT_MODE = RILConstants.PREFERRED_NETWORK_MODE;

View File

@ -38,8 +38,6 @@ import android.util.Log;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.test.SimulatedRadioControl;
import com.android.internal.telephony.gsm.SIMRecords;
import com.android.internal.telephony.gsm.SimCard;
import java.util.Locale; import java.util.Locale;
@ -118,9 +116,6 @@ public abstract class PhoneBase extends Handler implements Phone {
int mCallRingDelay; int mCallRingDelay;
public boolean mIsTheCurrentActivePhone = true; public boolean mIsTheCurrentActivePhone = true;
boolean mIsVoiceCapable = true; boolean mIsVoiceCapable = true;
public SIMRecords mSIMRecords;
public SimCard mSimCard;
public SMSDispatcher mSMS;
/** /**
* Set a system property, unless we're in unit test mode * Set a system property, unless we're in unit test mode
@ -242,8 +237,7 @@ public abstract class PhoneBase extends Handler implements Phone {
public void dispose() { public void dispose() {
synchronized(PhoneProxy.lockForRadioTechnologyChange) { synchronized(PhoneProxy.lockForRadioTechnologyChange) {
mCM.unSetOnCallRing(this); mCM.unSetOnCallRing(this);
// Must cleanup all connectionS and needs to use sendMessage! mDataConnection.onCleanUpConnection(false, REASON_RADIO_TURNED_OFF);
mDataConnection.cleanUpAllConnections();
mIsTheCurrentActivePhone = false; mIsTheCurrentActivePhone = false;
} }
} }
@ -667,20 +661,6 @@ public abstract class PhoneBase extends Handler implements Phone {
return this; return this;
} }
/**
* Retrieves the ServiceStateTracker of the phone instance.
*/
public ServiceStateTracker getServiceStateTracker() {
return null;
}
/**
* Get call tracker
*/
public CallTracker getCallTracker() {
return null;
}
/** /**
* Query the status of the CDMA roaming preference * Query the status of the CDMA roaming preference
*/ */
@ -1100,14 +1080,4 @@ public abstract class PhoneBase extends Handler implements Phone {
Log.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " + Log.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
"called, GSMPhone inactive."); "called, GSMPhone inactive.");
} }
// Called by SimRecords which is constructed with a PhoneBase instead of a GSMPhone.
public void notifyCallForwardingIndicator() {
// This function should be overridden by the class GSMPhone. Not implemented in CDMAPhone.
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
}
public void notifyDataConnectionFailed(String reason, String apnType) {
mNotifier.notifyDataConnectionFailed(this, reason, apnType);
}
} }

View File

@ -21,10 +21,8 @@ import android.net.LocalServerSocket;
import android.os.Looper; import android.os.Looper;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.os.SystemProperties;
import com.android.internal.telephony.cdma.CDMAPhone; import com.android.internal.telephony.cdma.CDMAPhone;
import com.android.internal.telephony.cdma.CDMALTEPhone;
import com.android.internal.telephony.gsm.GSMPhone; import com.android.internal.telephony.gsm.GSMPhone;
import com.android.internal.telephony.sip.SipPhone; import com.android.internal.telephony.sip.SipPhone;
import com.android.internal.telephony.sip.SipPhoneFactory; import com.android.internal.telephony.sip.SipPhoneFactory;
@ -36,9 +34,6 @@ public class PhoneFactory {
static final String LOG_TAG = "PHONE"; static final String LOG_TAG = "PHONE";
static final int SOCKET_OPEN_RETRY_MILLIS = 2 * 1000; static final int SOCKET_OPEN_RETRY_MILLIS = 2 * 1000;
static final int SOCKET_OPEN_MAX_RETRY = 3; static final int SOCKET_OPEN_MAX_RETRY = 3;
static final boolean LTE_AVAILABLE_ON_CDMA =
SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
//***** Class Variables //***** Class Variables
static private Phone sProxyPhone = null; static private Phone sProxyPhone = null;
@ -120,15 +115,9 @@ public class PhoneFactory {
sProxyPhone = new PhoneProxy(new GSMPhone(context, sProxyPhone = new PhoneProxy(new GSMPhone(context,
sCommandsInterface, sPhoneNotifier)); sCommandsInterface, sPhoneNotifier));
} else if (phoneType == Phone.PHONE_TYPE_CDMA) { } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
if (LTE_AVAILABLE_ON_CDMA == false ) { Log.i(LOG_TAG, "Creating CDMAPhone");
Log.i(LOG_TAG, "Creating CDMAPhone"); sProxyPhone = new PhoneProxy(new CDMAPhone(context,
sProxyPhone = new PhoneProxy(new CDMAPhone(context, sCommandsInterface, sPhoneNotifier));
sCommandsInterface, sPhoneNotifier));
} else {
Log.i(LOG_TAG, "Creating CDMALTEPhone");
sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,
sCommandsInterface, sPhoneNotifier));
}
} }
sMadeDefaults = true; sMadeDefaults = true;
@ -158,13 +147,6 @@ public class PhoneFactory {
case RILConstants.NETWORK_MODE_GLOBAL: case RILConstants.NETWORK_MODE_GLOBAL:
return Phone.PHONE_TYPE_CDMA; return Phone.PHONE_TYPE_CDMA;
case RILConstants.NETWORK_MODE_LTE_ONLY:
if (SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
return Phone.PHONE_TYPE_CDMA;
} else {
return Phone.PHONE_TYPE_GSM;
}
default: default:
return Phone.PHONE_TYPE_GSM; return Phone.PHONE_TYPE_GSM;
} }
@ -184,13 +166,8 @@ public class PhoneFactory {
public static Phone getCdmaPhone() { public static Phone getCdmaPhone() {
synchronized(PhoneProxy.lockForRadioTechnologyChange) { synchronized(PhoneProxy.lockForRadioTechnologyChange) {
if (LTE_AVAILABLE_ON_CDMA == false) { Phone phone = new CDMAPhone(sContext, sCommandsInterface, sPhoneNotifier);
Phone phone = new CDMAPhone(sContext, sCommandsInterface, sPhoneNotifier); return phone;
return phone;
} else {
Phone phone = new CDMALTEPhone(sContext, sCommandsInterface, sPhoneNotifier);
return phone;
}
} }
} }

View File

@ -741,10 +741,6 @@ public class PhoneProxy extends Handler implements Phone {
return mActivePhone.getCdmaEriIconMode(); return mActivePhone.getCdmaEriIconMode();
} }
public Phone getActivePhone() {
return mActivePhone;
}
public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){ public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){
mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete); mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete);
} }

View File

@ -638,13 +638,6 @@ public final class RIL extends BaseCommands implements CommandsInterface {
case RILConstants.NETWORK_MODE_GLOBAL: case RILConstants.NETWORK_MODE_GLOBAL:
mPhoneType = RILConstants.CDMA_PHONE; mPhoneType = RILConstants.CDMA_PHONE;
break; break;
case RILConstants.NETWORK_MODE_LTE_ONLY:
if (SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
mPhoneType = RILConstants.CDMA_PHONE;
} else {
mPhoneType = RILConstants.GSM_PHONE;
}
break;
default: default:
mPhoneType = RILConstants.CDMA_PHONE; mPhoneType = RILConstants.CDMA_PHONE;
} }
@ -2071,14 +2064,6 @@ public final class RIL extends BaseCommands implements CommandsInterface {
*/ */
if (RILJ_LOGD) Log.d(LOG_TAG, "Radio ON @ init; reset to OFF"); if (RILJ_LOGD) Log.d(LOG_TAG, "Radio ON @ init; reset to OFF");
setRadioPower(false, null); setRadioPower(false, null);
// MultimodeRIL needs to know the preferred network at power up.
RILRequest rrPnt = RILRequest.obtain(
RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, null);
rrPnt.mp.writeInt(1);
rrPnt.mp.writeInt(mNetworkMode);
if (RILJ_LOGD) riljLog(rrPnt.serialString() + "> "
+ requestToString(rrPnt.mRequest) + " : " + mNetworkMode);
send(rrPnt);
} else { } else {
if (DBG) Log.d(LOG_TAG, "Radio OFF @ init"); if (DBG) Log.d(LOG_TAG, "Radio OFF @ init");
setRadioState(newState); setRadioState(newState);

View File

@ -66,8 +66,6 @@ public interface RILConstants {
int NETWORK_MODE_EVDO_NO_CDMA = 6; /* EvDo only */ int NETWORK_MODE_EVDO_NO_CDMA = 6; /* EvDo only */
int NETWORK_MODE_GLOBAL = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL) int NETWORK_MODE_GLOBAL = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
AVAILABLE Application Settings menu*/ AVAILABLE Application Settings menu*/
int NETWORK_MODE_LTE_ONLY = 8; /* LTE Only mode. Used only for testing purposes.Not
user selectable from regular UI */
int PREFERRED_NETWORK_MODE = NETWORK_MODE_WCDMA_PREF; int PREFERRED_NETWORK_MODE = NETWORK_MODE_WCDMA_PREF;
/* CDMA subscription source. See ril.h RIL_REQUEST_CDMA_SET_SUBSCRIPTION */ /* CDMA subscription source. See ril.h RIL_REQUEST_CDMA_SET_SUBSCRIPTION */
@ -140,12 +138,10 @@ cat include/telephony/ril.h | \
int RIL_RESTRICTED_STATE_PS_ALL = 0x10; int RIL_RESTRICTED_STATE_PS_ALL = 0x10;
/** Data profile for RIL_REQUEST_SETUP_DATA_CALL */ /** Data profile for RIL_REQUEST_SETUP_DATA_CALL */
public static final int DATA_PROFILE_DEFAULT = 0; static final int DATA_PROFILE_DEFAULT = 0;
public static final int DATA_PROFILE_TETHERED = 1; static final int DATA_PROFILE_TETHERED = 1;
public static final int DATA_PROFILE_IMS = 2; static final int DATA_PROFILE_OEM_BASE = 1000;
public static final int DATA_PROFILE_FOTA = 3;
public static final int DATA_PROFILE_CBS = 4;
public static final int DATA_PROFILE_OEM_BASE = 1000;
int RIL_REQUEST_GET_SIM_STATUS = 1; int RIL_REQUEST_GET_SIM_STATUS = 1;
int RIL_REQUEST_ENTER_SIM_PIN = 2; int RIL_REQUEST_ENTER_SIM_PIN = 2;

View File

@ -582,7 +582,7 @@ public abstract class SMSDispatcher extends Handler {
* {@link Activity#RESULT_OK} if the message has been broadcast * {@link Activity#RESULT_OK} if the message has been broadcast
* to applications * to applications
*/ */
public abstract int dispatchMessage(SmsMessageBase sms); protected abstract int dispatchMessage(SmsMessageBase sms);
/** /**
@ -916,7 +916,7 @@ public abstract class SMSDispatcher extends Handler {
* @param response * @param response
* Callback message is empty on completion * Callback message is empty on completion
*/ */
public abstract void activateCellBroadcastSms(int activate, Message response); protected abstract void activateCellBroadcastSms(int activate, Message response);
/** /**
* Query the current configuration of cell broadcast SMS. * Query the current configuration of cell broadcast SMS.
@ -925,7 +925,7 @@ public abstract class SMSDispatcher extends Handler {
* Callback message contains the configuration from the modem on completion * Callback message contains the configuration from the modem on completion
* @see #setCellBroadcastConfig * @see #setCellBroadcastConfig
*/ */
public abstract void getCellBroadcastSmsConfig(Message response); protected abstract void getCellBroadcastSmsConfig(Message response);
/** /**
* Configure cell broadcast SMS. * Configure cell broadcast SMS.
@ -937,7 +937,7 @@ public abstract class SMSDispatcher extends Handler {
* @param response * @param response
* Callback message is empty on completion * Callback message is empty on completion
*/ */
public abstract void setCellBroadcastConfig(int[] configValuesArray, Message response); protected abstract void setCellBroadcastConfig(int[] configValuesArray, Message response);
/** /**
* Send an acknowledge message. * Send an acknowledge message.
@ -1006,27 +1006,6 @@ public abstract class SMSDispatcher extends Handler {
return new SmsTracker(data, sentIntent, deliveryIntent); return new SmsTracker(data, sentIntent, deliveryIntent);
} }
public void initSipStack(boolean isObg) {
// This function should be overridden by the classes that support
// switching modes such as the CdmaSMSDispatcher.
// Not implemented in GsmSMSDispatcher.
Log.e(TAG, "Error! This function should never be executed.");
}
public void switchToCdma() {
// This function should be overridden by the classes that support
// switching modes such as the CdmaSMSDispatcher.
// Not implemented in GsmSMSDispatcher.
Log.e(TAG, "Error! This function should never be executed.");
}
public void switchToGsm() {
// This function should be overridden by the classes that support
// switching modes such as the CdmaSMSDispatcher.
// Not implemented in GsmSMSDispatcher.
Log.e(TAG, "Error! This function should never be executed.");
}
private DialogInterface.OnClickListener mListener = private DialogInterface.OnClickListener mListener =
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {

View File

@ -45,8 +45,6 @@ public abstract class ServiceStateTracker extends Handler {
protected static final int DATA_ACCESS_HSUPA = 10; protected static final int DATA_ACCESS_HSUPA = 10;
protected static final int DATA_ACCESS_HSPA = 11; protected static final int DATA_ACCESS_HSPA = 11;
protected static final int DATA_ACCESS_CDMA_EvDo_B = 12; protected static final int DATA_ACCESS_CDMA_EvDo_B = 12;
protected static final int DATA_ACCESS_LTE = 13;
protected static final int DATA_ACCESS_EHRPD = 14;
protected CommandsInterface cm; protected CommandsInterface cm;
@ -282,51 +280,12 @@ public abstract class ServiceStateTracker extends Handler {
protected abstract void setPowerStateToDesired(); protected abstract void setPowerStateToDesired();
protected abstract void log(String s); protected abstract void log(String s);
private void logUnexpectedGsmMethodCall(String name) {
log("SSST" + "Error! " + name + "() in ServiceStateTracker should not be " +
"called, GsmServiceStateTracker inactive.");
}
public abstract int getCurrentDataConnectionState();
public abstract boolean isConcurrentVoiceAndDataAllowed();
public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
logUnexpectedGsmMethodCall("registerForDataConnectionAttached");
}
public void unregisterForDataConnectionAttached(Handler h) {
logUnexpectedGsmMethodCall("unregisterForDataConnectionAttached");
}
public void registerForDataConnectionDetached(Handler h, int what, Object obj) {
logUnexpectedGsmMethodCall("registerForDataConnectionDetached");
}
public void unregisterForDataConnectionDetached(Handler h) {
logUnexpectedGsmMethodCall("unregisterForDataConnectionDetached");
}
public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
logUnexpectedGsmMethodCall("registerForPsRestrictedEnabled");
}
public void unregisterForPsRestrictedEnabled(Handler h) {
logUnexpectedGsmMethodCall("unregisterForPsRestrictedEnabled");
}
public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
logUnexpectedGsmMethodCall("registerForPsRestrictedDisabled");
}
public void unregisterForPsRestrictedDisabled(Handler h) {
logUnexpectedGsmMethodCall("registerForPsRestrictedDisabled");
}
/** /**
* Clean up existing voice and data connection then turn off radio power. * Clean up existing voice and data connection then turn off radio power.
* *
* Hang up the existing voice calls to decrease call drop rate. * Hang up the existing voice calls to decrease call drop rate.
*/ */
public abstract void powerOffRadioSafely(); protected abstract void powerOffRadioSafely();
/** Cancel a pending (if any) pollState() operation */ /** Cancel a pending (if any) pollState() operation */
protected void cancelPollState() { protected void cancelPollState() {

View File

@ -1,180 +0,0 @@
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.cdma;
import android.os.SystemProperties;
import android.content.Context;
import android.net.Uri;
import android.content.Context;
import android.provider.Telephony;
import android.content.ContentValues;
import android.database.SQLException;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import com.android.internal.telephony.gsm.SIMRecords;
import com.android.internal.telephony.gsm.SimCard;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.PhoneNotifier;
import com.android.internal.telephony.PhoneProxy;
import com.android.internal.telephony.IccCard;
import com.android.internal.telephony.gsm.GsmDataConnectionTracker;
import android.util.Log;
public class CDMALTEPhone extends CDMAPhone {
static final String LOG_TAG = "CDMA";
private static final boolean DBG = true;
// Constructors
public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
this(context, ci, notifier, false);
log("CDMALTEPhone Constructors");
}
public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
boolean unitTestMode) {
super(context, ci, notifier, false);
mSST = new CdmaLteServiceStateTracker(this);
init(context, notifier);
mSIMRecords = new SIMRecords(this);
mSimCard = new SimCard(this, LOG_TAG, DBG);
}
public void dispose() {
synchronized (PhoneProxy.lockForRadioTechnologyChange) {
super.dispose();
mSIMRecords.dispose();
mSimCard.dispose();
}
}
@Override
public void removeReferences() {
super.removeReferences();
this.mSIMRecords = null;
this.mSimCard = null;
}
@Override
public ServiceStateTracker getServiceStateTracker() {
return mSST;
}
public IccCard getIccCard() {
return mSimCard;
}
@Override
public String getIccSerialNumber() {
return mSIMRecords.iccid;
}
@Override
public DataState getDataConnectionState(String apnType) {
boolean isCdmaDataConnectionTracker = false;
if (mDataConnection instanceof CdmaDataConnectionTracker) {
isCdmaDataConnectionTracker = true;
}
log("getDataConnectionState");
DataState ret = DataState.DISCONNECTED;
if (!isCdmaDataConnectionTracker && (SystemProperties.get("adb.connected", "").length()
> 0)) {
// We're connected to an ADB host and we have USB networking
// turned on. No matter what the radio state is,
// we report data connected
ret = DataState.CONNECTED;
} else if (mSST == null) {
// Radio Technology Change is ongoning, dispose() and
// removeReferences() have
// already been called
ret = DataState.DISCONNECTED;
} else if (mSST.getCurrentCdmaDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
// If we're out of service, open TCP sockets may still work
// but no data will flow
ret = DataState.DISCONNECTED;
} else if (mDataConnection.isApnTypeEnabled(apnType) == false) {
ret = DataState.DISCONNECTED;
} else {
DataConnectionTracker.State state;
if (isCdmaDataConnectionTracker) {
state = mDataConnection.getState();
} else {
state = ((GsmDataConnectionTracker)mDataConnection).getState(apnType);
}
switch (state) {
case FAILED:
case IDLE:
ret = DataState.DISCONNECTED;
break;
case CONNECTED:
case DISCONNECTING:
if (mCT.state != Phone.State.IDLE && !mSST.isConcurrentVoiceAndDataAllowed()) {
ret = DataState.SUSPENDED;
} else {
ret = DataState.CONNECTED;
}
break;
case INITING:
case CONNECTING:
case SCANNING:
ret = DataState.CONNECTING;
break;
}
}
return ret;
}
public boolean updateCurrentCarrierInProvider() {
if (mSIMRecords != null) {
try {
Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
ContentValues map = new ContentValues();
map.put(Telephony.Carriers.NUMERIC, mSIMRecords.getSIMOperatorNumeric());
mContext.getContentResolver().insert(uri, map);
return true;
} catch (SQLException e) {
Log.e(LOG_TAG, "[CDMALTEPhone] Can't store current operator", e);
}
}
return false;
}
public String getActiveApn(String apnType) {
if (mDataConnection instanceof CdmaDataConnectionTracker)
return mDataConnection.getActiveApnString();
return ((GsmDataConnectionTracker)mDataConnection).getActiveApnString(apnType);
}
protected void log(String s) {
if (DBG)
Log.d(LOG_TAG, "[CDMALTEPhone] " + s);
}
}

View File

@ -66,7 +66,6 @@ import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties; import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.UUSInfo; import com.android.internal.telephony.UUSInfo;
import com.android.internal.telephony.CallTracker;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
@ -98,6 +97,7 @@ public class CDMAPhone extends PhoneBase {
// Instance Variables // Instance Variables
CdmaCallTracker mCT; CdmaCallTracker mCT;
CdmaSMSDispatcher mSMS;
CdmaServiceStateTracker mSST; CdmaServiceStateTracker mSST;
RuimRecords mRuimRecords; RuimRecords mRuimRecords;
RuimCard mRuimCard; RuimCard mRuimCard;
@ -141,21 +141,16 @@ public class CDMAPhone extends PhoneBase {
// Constructors // Constructors
public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) { public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
super(notifier, context, ci, false); this(context,ci,notifier, false);
mSST = new CdmaServiceStateTracker (this);
init(context, notifier);
} }
public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier, public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
boolean unitTestMode) { boolean unitTestMode) {
super(notifier, context, ci, unitTestMode); super(notifier, context, ci, unitTestMode);
mSST = new CdmaServiceStateTracker (this);
init(context, notifier);
}
protected void init(Context context, PhoneNotifier notifier) {
mCM.setPhoneType(Phone.PHONE_TYPE_CDMA); mCM.setPhoneType(Phone.PHONE_TYPE_CDMA);
mCT = new CdmaCallTracker(this); mCT = new CdmaCallTracker(this);
mSST = new CdmaServiceStateTracker (this);
mSMS = new CdmaSMSDispatcher(this); mSMS = new CdmaSMSDispatcher(this);
mIccFileHandler = new RuimFileHandler(this); mIccFileHandler = new RuimFileHandler(this);
mRuimRecords = new RuimRecords(this); mRuimRecords = new RuimRecords(this);
@ -275,18 +270,10 @@ public class CDMAPhone extends PhoneBase {
return mSST.ss; return mSST.ss;
} }
public CallTracker getCallTracker() {
return mCT;
}
public Phone.State getState() { public Phone.State getState() {
return mCT.state; return mCT.state;
} }
public ServiceStateTracker getServiceStateTracker() {
return mSST;
}
public String getPhoneName() { public String getPhoneName() {
return "CDMA"; return "CDMA";
} }
@ -638,7 +625,7 @@ public class CDMAPhone extends PhoneBase {
case CONNECTED: case CONNECTED:
case DISCONNECTING: case DISCONNECTING:
if ( mCT.state != Phone.State.IDLE if ( mCT.state != Phone.State.IDLE
&& !mSST.isConcurrentVoiceAndDataAllowed()) { && !mSST.isConcurrentVoiceAndData()) {
ret = DataState.SUSPENDED; ret = DataState.SUSPENDED;
} else { } else {
ret = DataState.CONNECTED; ret = DataState.CONNECTED;

View File

@ -134,10 +134,6 @@ public final class CdmaCallTracker extends CallTracker {
public void registerForVoiceCallStarted(Handler h, int what, Object obj) { public void registerForVoiceCallStarted(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj); Registrant r = new Registrant(h, what, obj);
voiceCallStartedRegistrants.add(r); voiceCallStartedRegistrants.add(r);
// Notify if in call when registering
if (state != Phone.State.IDLE) {
r.notifyRegistrant(new AsyncResult(null, null, null));
}
} }
public void unregisterForVoiceCallStarted(Handler h) { public void unregisterForVoiceCallStarted(Handler h) {
voiceCallStartedRegistrants.remove(h); voiceCallStartedRegistrants.remove(h);

View File

@ -430,7 +430,7 @@ public class CdmaConnection extends Connection {
} else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
|| serviceState == ServiceState.STATE_EMERGENCY_ONLY) { || serviceState == ServiceState.STATE_EMERGENCY_ONLY) {
return DisconnectCause.OUT_OF_SERVICE; return DisconnectCause.OUT_OF_SERVICE;
} else if (phone.mCM.getNvState() != CommandsInterface.RadioState.NV_READY } else if (phone.mCM.getRadioState() != CommandsInterface.RadioState.NV_READY
&& phone.getIccCard().getState() != RuimCard.State.READY) { && phone.getIccCard().getState() != RuimCard.State.READY) {
return DisconnectCause.ICC_ERROR; return DisconnectCause.ICC_ERROR;
} else if (causeCode==CallFailCause.NORMAL_CLEARING) { } else if (causeCode==CallFailCause.NORMAL_CLEARING) {

View File

@ -167,6 +167,30 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
return false; return false;
} }
/**
* The data connection is expected to be setup while device
* 1. has ruim card or non-volatile data store
* 2. registered to data connection service
* 3. user doesn't explicitly disable data service
* 4. wifi is not on
*
* @return false while no data connection if all above requirements are met.
*/
@Override
public boolean isDataConnectionAsDesired() {
boolean roaming = mPhone.getServiceState().getRoaming();
if (((mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY) ||
mCdmaPhone.mRuimRecords.getRecordsLoaded()) &&
(mCdmaPhone.mSST.getCurrentCdmaDataConnectionState() ==
ServiceState.STATE_IN_SERVICE) &&
(!roaming || getDataOnRoamingEnabled()) &&
!mIsWifiConnected ) {
return (mState == State.CONNECTED);
}
return true;
}
@Override @Override
protected boolean isDataAllowed() { protected boolean isDataAllowed() {
int psState = mCdmaPhone.mSST.getCurrentCdmaDataConnectionState(); int psState = mCdmaPhone.mSST.getCurrentCdmaDataConnectionState();
@ -176,9 +200,9 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
boolean allowed = boolean allowed =
(psState == ServiceState.STATE_IN_SERVICE || (psState == ServiceState.STATE_IN_SERVICE ||
mAutoAttachOnCreation) && mAutoAttachOnCreation) &&
(mPhone.mCM.getNvState() == CommandsInterface.RadioState.NV_READY || (mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY ||
mCdmaPhone.mRuimRecords.getRecordsLoaded()) && mCdmaPhone.mRuimRecords.getRecordsLoaded()) &&
(mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() || (mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
mPhone.getState() == Phone.State.IDLE) && mPhone.getState() == Phone.State.IDLE) &&
!roaming && !roaming &&
mInternalDataEnabled && mInternalDataEnabled &&
@ -190,11 +214,11 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
if (!((psState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) { if (!((psState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
reason += " - psState= " + psState; reason += " - psState= " + psState;
} }
if (!(mPhone.mCM.getNvState() == CommandsInterface.RadioState.NV_READY || if (!(mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY ||
mCdmaPhone.mRuimRecords.getRecordsLoaded())) { mCdmaPhone.mRuimRecords.getRecordsLoaded())) {
reason += " - radioState= " + mPhone.mCM.getNvState() + " - RUIM not loaded"; reason += " - radioState= " + mPhone.mCM.getRadioState() + " - RUIM not loaded";
} }
if (!(mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() || if (!(mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
mPhone.getState() == Phone.State.IDLE)) { mPhone.getState() == Phone.State.IDLE)) {
reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState(); reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState();
} }
@ -238,7 +262,9 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
} }
/** /**
* Cleanup the CDMA data connection (only one is supported) * Cleanup all connections.
*
* TODO: Cleanup only a specified connection passed as a parameter.
* *
* @param tearDown true if the underlying DataConnection should be disconnected. * @param tearDown true if the underlying DataConnection should be disconnected.
* @param reason for the clean up. * @param reason for the clean up.
@ -311,7 +337,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
apnId = mDefaultApnId; apnId = mDefaultApnId;
} }
mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "", mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "",
"", 0, types, "IP", "IP", true, 0, 0); "", 0, types, "IP", "IP");
if (DBG) log("setupData: mActiveApn=" + mActiveApn); if (DBG) log("setupData: mActiveApn=" + mActiveApn);
Message msg = obtainMessage(); Message msg = obtainMessage();
@ -360,7 +386,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
protected void restartRadio() { protected void restartRadio() {
if (DBG) log("Cleanup connection and wait " + if (DBG) log("Cleanup connection and wait " +
(TIME_DELAYED_TO_RESTART_RADIO / 1000) + "s to restart radio"); (TIME_DELAYED_TO_RESTART_RADIO / 1000) + "s to restart radio");
cleanUpAllConnections(); cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF);
sendEmptyMessageDelayed(EVENT_RESTART_RADIO, TIME_DELAYED_TO_RESTART_RADIO); sendEmptyMessageDelayed(EVENT_RESTART_RADIO, TIME_DELAYED_TO_RESTART_RADIO);
mPendingRestartRadio = true; mPendingRestartRadio = true;
} }
@ -517,14 +543,14 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
protected void onRecordsLoaded() { protected void onRecordsLoaded() {
if (mState == State.FAILED) { if (mState == State.FAILED) {
cleanUpAllConnections(); cleanUpConnection(false, null);
} }
sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED)); sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED));
} }
protected void onNVReady() { protected void onNVReady() {
if (mState == State.FAILED) { if (mState == State.FAILED) {
cleanUpAllConnections(); cleanUpConnection(false, null);
} }
sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA)); sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
} }
@ -534,7 +560,6 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
*/ */
@Override @Override
protected void onEnableNewApn() { protected void onEnableNewApn() {
// No mRequestedApnType check; only one connection is supported
cleanUpConnection(true, Phone.REASON_APN_SWITCHED); cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
} }
@ -563,7 +588,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
trySetupData(Phone.REASON_ROAMING_ON); trySetupData(Phone.REASON_ROAMING_ON);
} else { } else {
if (DBG) log("Tear down data connection on roaming."); if (DBG) log("Tear down data connection on roaming.");
cleanUpAllConnections(); cleanUpConnection(true, Phone.REASON_ROAMING_ON);
} }
} }
@ -584,7 +609,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
notifyDataAvailability(null); notifyDataAvailability(null);
if (mState != State.IDLE) { if (mState != State.IDLE) {
cleanUpAllConnections(); cleanUpConnection(true, null);
} }
} }
@ -601,7 +626,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
log("We're on the simulator; assuming radio off is meaningless"); log("We're on the simulator; assuming radio off is meaningless");
} else { } else {
if (DBG) log("Radio is off and clean up all connection"); if (DBG) log("Radio is off and clean up all connection");
cleanUpAllConnections(); cleanUpConnection(false, Phone.REASON_RADIO_TURNED_OFF);
} }
} }
@ -686,7 +711,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
*/ */
@Override @Override
protected void onVoiceCallStarted() { protected void onVoiceCallStarted() {
if (mState == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) { if (mState == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
stopNetStatPoll(); stopNetStatPoll();
notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED); notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
notifyDataAvailability(Phone.REASON_VOICE_CALL_STARTED); notifyDataAvailability(Phone.REASON_VOICE_CALL_STARTED);
@ -699,7 +724,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
@Override @Override
protected void onVoiceCallEnded() { protected void onVoiceCallEnded() {
if (mState == State.CONNECTED) { if (mState == State.CONNECTED) {
if (!mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) { if (!mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
startNetStatPoll(); startNetStatPoll();
notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED); notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
} else { } else {
@ -715,17 +740,10 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
} }
@Override @Override
protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) { protected void onCleanUpConnection(boolean tearDown, String reason) {
// No apnId check; only one connection is supported
cleanUpConnection(tearDown, reason); cleanUpConnection(tearDown, reason);
} }
@Override
protected void onCleanUpAllConnections() {
// Only one CDMA connection is supported
cleanUpConnection(true, null);
}
private void createAllDataConnectionList() { private void createAllDataConnectionList() {
CdmaDataConnection dataConn; CdmaDataConnection dataConn;

View File

@ -1,567 +0,0 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.cdma;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.EventLogTags;
import com.android.internal.telephony.RILConstants;
import android.telephony.SignalStrength;
import android.telephony.ServiceState;
import android.telephony.cdma.CdmaCellLocation;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
import android.os.Registrant;
import android.os.RegistrantList;
import android.os.AsyncResult;
import android.os.Message;
import android.util.Log;
import android.util.EventLog;
import com.android.internal.telephony.gsm.RestrictedState;
import com.android.internal.telephony.gsm.GsmDataConnectionTracker;
public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker {
static final String LOG_TAG = "CDMA";
CDMALTEPhone mCdmaLtePhone;
private RestrictedState rs;
private int gprsState = ServiceState.STATE_OUT_OF_SERVICE;
private int newGPRSState = ServiceState.STATE_OUT_OF_SERVICE;
private RegistrantList gprsAttachedRegistrants = new RegistrantList();
private RegistrantList gprsDetachedRegistrants = new RegistrantList();
private RegistrantList psRestrictEnabledRegistrants = new RegistrantList();
private RegistrantList psRestrictDisabledRegistrants = new RegistrantList();
public CdmaLteServiceStateTracker(CDMALTEPhone phone) {
super(phone);
mCdmaLtePhone = phone;
rs = new RestrictedState();
log("CdmaLteServiceStateTracker Constructors");
}
// Added 9 new functions needed in GsmDataConnectionTracker, functions were
// copied over from GsmServiceStateTracker.
/**
* Registration point for transition into GPRS attached.
*
* @param h handler to notify
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
log("registerForDataConnectionAttached ");
Registrant r = new Registrant(h, what, obj);
gprsAttachedRegistrants.add(r);
if (gprsState == ServiceState.STATE_IN_SERVICE) {
r.notifyRegistrant();
}
}
public void unregisterForDataConnectionAttached(Handler h) {
gprsAttachedRegistrants.remove(h);
}
/**
* Registration point for transition into GPRS detached.
*
* @param h handler to notify
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
public void registerForDataConnectionDetached(Handler h, int what, Object obj) {
log("registerForDataConnectionDetached ");
Registrant r = new Registrant(h, what, obj);
gprsDetachedRegistrants.add(r);
if (gprsState == ServiceState.STATE_OUT_OF_SERVICE) {
r.notifyRegistrant();
}
}
public void unregisterForDataConnectionDetached(Handler h) {
gprsDetachedRegistrants.remove(h);
}
/**
* Registration point for transition into packet service restricted zone.
*
* @param h handler to notify
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
log("registerForPsRestrictedEnabled ");
Registrant r = new Registrant(h, what, obj);
psRestrictEnabledRegistrants.add(r);
if (rs.isPsRestricted()) {
r.notifyRegistrant();
}
}
public void unregisterForPsRestrictedEnabled(Handler h) {
psRestrictEnabledRegistrants.remove(h);
}
/**
* Registration point for transition out of packet service restricted zone.
*
* @param h handler to notify
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
log("registerForPsRestrictedDisabled ");
Registrant r = new Registrant(h, what, obj);
psRestrictDisabledRegistrants.add(r);
if (rs.isPsRestricted()) {
r.notifyRegistrant();
}
}
public void unregisterForPsRestrictedDisabled(Handler h) {
psRestrictDisabledRegistrants.remove(h);
}
/**
* @return The current GPRS state. IN_SERVICE is the same as "attached" and
* OUT_OF_SERVICE is the same as detached.
*/
public int getCurrentDataConnectionState() {
return gprsState;
}
@Override
public void handleMessage(Message msg) {
AsyncResult ar;
int[] ints;
String[] strings;
if (msg.what == EVENT_POLL_STATE_GPRS) {
log("handleMessage EVENT_POLL_STATE_GPRS");
ar = (AsyncResult)msg.obj;
handlePollStateResult(msg.what, ar);
} else {
super.handleMessage(msg);
}
}
/**
* The LTE data connection state, only return true here
*/
@Override
protected boolean checkAdditionalDataAvaiable() {
return newGPRSState != ServiceState.STATE_IN_SERVICE;
}
/**
* Handle the result of one of the pollState()-related requests
*/
@Override
protected void handlePollStateResultMessage(int what, AsyncResult ar) {
if (what == EVENT_POLL_STATE_GPRS) {
log("handlePollStateResultMessage EVENT_POLL_STATE_GPRS");
String states[] = (String[])ar.result;
int type = 0;
int regState = -1;
if (states.length > 0) {
try {
regState = Integer.parseInt(states[0]);
// states[3] (if present) is the current radio technology
if (states.length >= 4 && states[3] != null) {
type = Integer.parseInt(states[3]);
}
} catch (NumberFormatException ex) {
Log.w(LOG_TAG,
"[CdmaLteServiceStateTracker] error parsing GprsRegistrationState: "
+ ex);
}
}
newGPRSState = regCodeToServiceState(regState);
// Not sure if this is needed in CDMALTE phone.
// mDataRoaming = regCodeIsRoaming(regState);
if (newGPRSState == ServiceState.STATE_IN_SERVICE) {
this.newCdmaDataConnectionState = newGPRSState;
newNetworkType = type;
newSS.setRadioTechnology(type);
}
} else {
super.handlePollStateResultMessage(what, ar);
}
}
@Override
protected void setSignalStrengthDefaultValues() {
mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false);
}
@Override
protected void pollState() {
pollingContext = new int[1];
pollingContext[0] = 0;
switch (cm.getRadioState()) {
case RADIO_UNAVAILABLE:
newSS.setStateOutOfService();
newCellLoc.setStateInvalid();
setSignalStrengthDefaultValues();
mGotCountryCode = false;
pollStateDone();
break;
case RADIO_OFF:
newSS.setStateOff();
newCellLoc.setStateInvalid();
setSignalStrengthDefaultValues();
mGotCountryCode = false;
pollStateDone();
break;
case SIM_NOT_READY:
case SIM_LOCKED_OR_ABSENT:
case SIM_READY:
log("Radio Technology Change ongoing, setting SS to off");
newSS.setStateOff();
newCellLoc.setStateInvalid();
setSignalStrengthDefaultValues();
mGotCountryCode = false;
// NOTE: pollStateDone() is not needed in this case
break;
default:
// Issue all poll-related commands at once, then count
// down the responses which are allowed to arrive
// out-of-order.
pollingContext[0]++;
// RIL_REQUEST_OPERATOR is necessary for CDMA
cm.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, pollingContext));
pollingContext[0]++;
// RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA
cm.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA,
pollingContext));
int networkMode = android.provider.Settings.Secure.getInt(phone.getContext()
.getContentResolver(),
android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
RILConstants.PREFERRED_NETWORK_MODE);
Log.v(LOG_TAG, "[CdmaLteServiceStateTracker] The network mode here is = "
+ networkMode);
if ((networkMode == RILConstants.NETWORK_MODE_GLOBAL)
|| (networkMode == RILConstants.NETWORK_MODE_LTE_ONLY)) {
pollingContext[0]++;
// RIL_REQUEST_DATA_REGISTRATION_STATE
cm.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS,
pollingContext));
}
break;
}
}
protected static String networkTypeToString(int type) {
String ret = "unknown";
switch (type) {
case DATA_ACCESS_CDMA_IS95A:
case DATA_ACCESS_CDMA_IS95B:
ret = "CDMA";
break;
case DATA_ACCESS_CDMA_1xRTT:
ret = "CDMA - 1xRTT";
break;
case DATA_ACCESS_CDMA_EvDo_0:
ret = "CDMA - EvDo rev. 0";
break;
case DATA_ACCESS_CDMA_EvDo_A:
ret = "CDMA - EvDo rev. A";
break;
case DATA_ACCESS_CDMA_EvDo_B:
ret = "CDMA - EvDo rev. B";
break;
case DATA_ACCESS_LTE:
ret = "LTE";
break;
case DATA_ACCESS_EHRPD:
ret = "CDMA - eHRPD";
default:
if (DBG) {
Log.e(LOG_TAG, " [CdmaLteServiceStateTracker] Wrong network."
+ " Can not return a string.");
}
break;
}
return ret;
}
@Override
protected void pollStateDone() {
log("Poll ServiceState done: oldSS=[" + ss + "] newSS=[" + newSS + "]");
boolean hasRegistered = ss.getState() != ServiceState.STATE_IN_SERVICE
&& newSS.getState() == ServiceState.STATE_IN_SERVICE;
boolean hasDeregistered = ss.getState() == ServiceState.STATE_IN_SERVICE
&& newSS.getState() != ServiceState.STATE_IN_SERVICE;
boolean hasCdmaDataConnectionAttached =
this.cdmaDataConnectionState != ServiceState.STATE_IN_SERVICE
&& this.newCdmaDataConnectionState == ServiceState.STATE_IN_SERVICE;
boolean hasCdmaDataConnectionDetached =
this.cdmaDataConnectionState == ServiceState.STATE_IN_SERVICE
&& this.newCdmaDataConnectionState != ServiceState.STATE_IN_SERVICE;
boolean hasCdmaDataConnectionChanged =
cdmaDataConnectionState != newCdmaDataConnectionState;
boolean hasNetworkTypeChanged = networkType != newNetworkType;
boolean hasChanged = !newSS.equals(ss);
boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming();
boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming();
boolean hasLocationChanged = !newCellLoc.equals(cellLoc);
boolean has4gHandoff =
((networkType == DATA_ACCESS_LTE) && (newNetworkType == DATA_ACCESS_EHRPD))
|| ((networkType == DATA_ACCESS_EHRPD) && (newNetworkType == DATA_ACCESS_LTE));
boolean hasMultiApnSupport =
(((newNetworkType == DATA_ACCESS_LTE) || (newNetworkType == DATA_ACCESS_EHRPD))
&& ((networkType != DATA_ACCESS_LTE) && (networkType != DATA_ACCESS_EHRPD)));
boolean hasLostMultiApnSupport =
((newNetworkType >= DATA_ACCESS_CDMA_IS95A)
&& (newNetworkType <= DATA_ACCESS_CDMA_EvDo_A));
log("hasRegistered = " + hasRegistered + " hasCdmaDataConnectionAttached = "
+ hasCdmaDataConnectionAttached + " hasCdmaDataConnectionChanged = "
+ hasCdmaDataConnectionChanged + " hasNetworkTypeChanged = "
+ hasNetworkTypeChanged + " has4gHandoff = " + has4gHandoff
+ " hasMultiApnSupport = " + hasMultiApnSupport + " hasLostMultiApnSupport = "
+ hasLostMultiApnSupport);
// Add an event log when connection state changes
if (ss.getState() != newSS.getState()
|| cdmaDataConnectionState != newCdmaDataConnectionState) {
EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, ss.getState(),
cdmaDataConnectionState, newSS.getState(), newCdmaDataConnectionState);
}
ServiceState tss;
tss = ss;
ss = newSS;
newSS = tss;
// clean slate for next time
newSS.setStateOutOfService();
// TODO: 4G Tech Handoff
// if (has4gHandoff) {
// Message msg = phone.mDataConnection.obtainMessage(
// DataConnectionTracker.EVENT_4G_TECHNOLOGY_CHANGE);
// phone.mDataConnection.sendMessage(msg);
// }
if ((hasMultiApnSupport)
&& (phone.mDataConnection instanceof CdmaDataConnectionTracker)) {
log("GsmDataConnectionTracker Created");
phone.mDataConnection.dispose();
phone.mDataConnection = new GsmDataConnectionTracker(mCdmaLtePhone);
}
if ((hasLostMultiApnSupport)
&& (phone.mDataConnection instanceof GsmDataConnectionTracker)) {
log("GsmDataConnectionTracker disposed");
phone.mDataConnection.dispose();
phone.mDataConnection = new CdmaDataConnectionTracker((CDMAPhone)phone);
}
CdmaCellLocation tcl = cellLoc;
cellLoc = newCellLoc;
newCellLoc = tcl;
cdmaDataConnectionState = newCdmaDataConnectionState;
networkType = newNetworkType;
gprsState = newCdmaDataConnectionState;
newSS.setStateOutOfService(); // clean slate for next time
if (hasNetworkTypeChanged) {
phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
networkTypeToString(networkType));
}
if (hasRegistered) {
networkAttachedRegistrants.notifyRegistrants();
}
if (hasChanged) {
if (cm.getNvState().isNVReady()) {
String eriText;
// Now the CDMAPhone sees the new ServiceState so it can get the
// new ERI text
if (ss.getState() == ServiceState.STATE_IN_SERVICE) {
eriText = phone.getCdmaEriText();
} else {
// Note that ServiceState.STATE_OUT_OF_SERVICE is valid used
// for
// mRegistrationState 0,2,3 and 4
eriText = phone.getContext()
.getText(com.android.internal.R.string.roamingTextSearching).toString();
}
ss.setCdmaEriText(eriText);
}
String operatorNumeric;
phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
ss.getOperatorAlphaLong());
operatorNumeric = ss.getOperatorNumeric();
phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
if (operatorNumeric == null) {
phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
} else {
String isoCountryCode = "";
try {
isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(operatorNumeric
.substring(0, 3)));
} catch (NumberFormatException ex) {
Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
} catch (StringIndexOutOfBoundsException ex) {
Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
}
phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
isoCountryCode);
mGotCountryCode = true;
if (mNeedFixZone) {
fixTimeZone(isoCountryCode);
}
}
phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
ss.getRoaming() ? "true" : "false");
updateSpnDisplay();
phone.notifyServiceStateChanged(ss);
}
if (hasCdmaDataConnectionAttached) {
cdmaDataConnectionAttachedRegistrants.notifyRegistrants();
gprsAttachedRegistrants.notifyRegistrants();
}
if (hasCdmaDataConnectionDetached) {
cdmaDataConnectionDetachedRegistrants.notifyRegistrants();
gprsDetachedRegistrants.notifyRegistrants();
}
if ((hasCdmaDataConnectionChanged || hasNetworkTypeChanged)
&& (phone.mDataConnection instanceof CdmaDataConnectionTracker)) {
phone.notifyDataConnection();
}
if (hasRoamingOn) {
roamingOnRegistrants.notifyRegistrants();
}
if (hasRoamingOff) {
roamingOffRegistrants.notifyRegistrants();
}
if (hasLocationChanged) {
phone.notifyLocationChanged();
}
}
protected void onSignalStrengthResult(AsyncResult ar) {
SignalStrength oldSignalStrength = mSignalStrength;
if (ar.exception != null) {
// Most likely radio is resetting/disconnected change to default
// values.
setSignalStrengthDefaultValues();
} else {
int[] ints = (int[])ar.result;
int lteCqi = 99, lteRsrp = -1;
int lteRssi = 99;
int offset = 2;
int cdmaDbm = (ints[offset] > 0) ? -ints[offset] : -120;
int cdmaEcio = (ints[offset + 1] > 0) ? -ints[offset + 1] : -160;
int evdoRssi = (ints[offset + 2] > 0) ? -ints[offset + 2] : -120;
int evdoEcio = (ints[offset + 3] > 0) ? -ints[offset + 3] : -1;
int evdoSnr = ((ints[offset + 4] > 0) && (ints[offset + 4] <= 8)) ? ints[offset + 4]
: -1;
if (networkType == ServiceState.RADIO_TECHNOLOGY_LTE) {
lteRssi = (ints[offset + 5] >= 0) ? ints[offset + 5] : 99;
lteRsrp = (ints[offset + 6] > 0) ? -ints[offset + 7] : -1;
lteCqi = (ints[offset + 7] >= 0) ? ints[offset + 6] : 99;
}
if (networkType != ServiceState.RADIO_TECHNOLOGY_LTE) {
mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, evdoRssi, evdoEcio,
evdoSnr, false);
} else {
mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, evdoRssi, evdoEcio,
evdoSnr, lteRssi, lteRsrp, -1, -1, lteCqi, true);
}
}
try {
phone.notifySignalStrength();
} catch (NullPointerException ex) {
log("onSignalStrengthResult() Phone already destroyed: " + ex
+ "SignalStrength not notified");
}
}
public boolean isConcurrentVoiceAndDataAllowed() {
// Note: it needs to be confirmed which CDMA network types
// can support voice and data calls concurrently.
// For the time-being, the return value will be false.
// return (networkType >= DATA_ACCESS_LTE);
return false;
}
@Override
protected void log(String s) {
if (DBG)
Log.d(LOG_TAG, "[CdmaLteServiceStateTracker] " + s);
}
}

View File

@ -94,7 +94,7 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public int dispatchMessage(SmsMessageBase smsb) { protected int dispatchMessage(SmsMessageBase smsb) {
// If sms is null, means there was a parsing error. // If sms is null, means there was a parsing error.
if (smsb == null) { if (smsb == null) {
@ -485,19 +485,19 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void activateCellBroadcastSms(int activate, Message response) { protected void activateCellBroadcastSms(int activate, Message response) {
mCm.setCdmaBroadcastActivation((activate == 0), response); mCm.setCdmaBroadcastActivation((activate == 0), response);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void getCellBroadcastSmsConfig(Message response) { protected void getCellBroadcastSmsConfig(Message response) {
mCm.getCdmaBroadcastConfig(response); mCm.getCdmaBroadcastConfig(response);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void setCellBroadcastConfig(int[] configValuesArray, Message response) { protected void setCellBroadcastConfig(int[] configValuesArray, Message response) {
mCm.setCdmaBroadcastConfig(configValuesArray, response); mCm.setCdmaBroadcastConfig(configValuesArray, response);
} }

View File

@ -61,7 +61,7 @@ import java.util.TimeZone;
/** /**
* {@hide} * {@hide}
*/ */
public class CdmaServiceStateTracker extends ServiceStateTracker { final class CdmaServiceStateTracker extends ServiceStateTracker {
static final String LOG_TAG = "CDMA"; static final String LOG_TAG = "CDMA";
CDMAPhone phone; CDMAPhone phone;
@ -88,8 +88,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
/** /**
* Values correspond to ServiceStateTracker.DATA_ACCESS_ definitions. * Values correspond to ServiceStateTracker.DATA_ACCESS_ definitions.
*/ */
protected int networkType = 0; private int networkType = 0;
protected int newNetworkType = 0; private int newNetworkType = 0;
private boolean mCdmaRoaming = false; private boolean mCdmaRoaming = false;
private int mRoamingIndicator; private int mRoamingIndicator;
@ -99,23 +99,23 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
/** /**
* Initially assume no data connection. * Initially assume no data connection.
*/ */
protected int cdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE; private int cdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
protected int newCdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE; private int newCdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
protected int mRegistrationState = -1; private int mRegistrationState = -1;
protected RegistrantList cdmaDataConnectionAttachedRegistrants = new RegistrantList(); private RegistrantList cdmaDataConnectionAttachedRegistrants = new RegistrantList();
protected RegistrantList cdmaDataConnectionDetachedRegistrants = new RegistrantList(); private RegistrantList cdmaDataConnectionDetachedRegistrants = new RegistrantList();
protected RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList(); private RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
/** /**
* Sometimes we get the NITZ time before we know what country we * Sometimes we get the NITZ time before we know what country we
* are in. Keep the time zone information from the NITZ string so * are in. Keep the time zone information from the NITZ string so
* we can fix the time zone once know the country. * we can fix the time zone once know the country.
*/ */
protected boolean mNeedFixZone = false; private boolean mNeedFixZone = false;
private int mZoneOffset; private int mZoneOffset;
private boolean mZoneDst; private boolean mZoneDst;
private long mZoneTime; private long mZoneTime;
protected boolean mGotCountryCode = false; private boolean mGotCountryCode = false;
String mSavedTimeZone; String mSavedTimeZone;
long mSavedTime; long mSavedTime;
long mSavedAtTime; long mSavedAtTime;
@ -566,21 +566,37 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
cm.setRadioPower(true, null); cm.setRadioPower(true, null);
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) { } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection; DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
EventLog.writeEvent(EventLogTags.DATA_NETWORK_STATUS_ON_RADIO_OFF,
dcTracker.getStateInString(),
dcTracker.getAnyDataEnabled() ? 1 : 0);
}
// If it's on and available and we want it off gracefully // If it's on and available and we want it off gracefully
powerOffRadioSafely(); powerOffRadioSafely();
} // Otherwise, we're in the desired state } // Otherwise, we're in the desired state
} }
// TODO: Consider moving this method to DataConnectionTracker
@Override @Override
public void powerOffRadioSafely() { protected void powerOffRadioSafely() {
DataConnectionTracker dcTracker = phone.mDataConnection; DataConnectionTracker dcTracker = phone.mDataConnection;
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
synchronized (this) { synchronized (this) {
if (!mPendingRadioPowerOffAfterDataOff) { if (!mPendingRadioPowerOffAfterDataOff) {
if (dcTracker.isAnyActiveDataConnections()) { DataConnectionTracker.State currentState = dcTracker.getState();
dcTracker.cleanUpAllConnections(); if (currentState != DataConnectionTracker.State.CONNECTED
&& currentState != DataConnectionTracker.State.DISCONNECTING
&& currentState != DataConnectionTracker.State.INITING) {
msg.arg1 = 0; // tearDown is false as it is not needed.
dcTracker.sendMessage(msg);
if (DBG) log("Data disconnected, turn off radio right away.");
hangupAndPowerOff();
} else {
msg.arg1 = 1; // tearDown is true
dcTracker.sendMessage(msg);
if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 30000)) { if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 30000)) {
if (DBG) log("Wait upto 30s for data to disconnect, then turn off radio."); if (DBG) log("Wait upto 30s for data to disconnect, then turn off radio.");
mPendingRadioPowerOffAfterDataOff = true; mPendingRadioPowerOffAfterDataOff = true;
@ -588,10 +604,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away."); Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away.");
hangupAndPowerOff(); hangupAndPowerOff();
} }
} else {
dcTracker.cleanUpAllConnections();
if (DBG) log("Data disconnected, turn off radio right away.");
hangupAndPowerOff();
} }
} }
} }
@ -635,167 +647,14 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
} }
/** /**
* The LTE data connection state, only return true here * Handle the result of one of the pollState()-related requests
*/
protected boolean checkAdditionalDataAvaiable(){
return true;
}
/**
* Hanlde the PollStateResult message
*/
protected void handlePollStateResultMessage(int what, AsyncResult ar){
int ints[];
String states[];
switch (what) {
case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
states = (String[])ar.result;
int registrationState = 4; //[0] registrationState
int radioTechnology = -1; //[3] radioTechnology
int baseStationId = -1; //[4] baseStationId
//[5] baseStationLatitude
int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
//[6] baseStationLongitude
int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
int cssIndicator = 0; //[7] init with 0, because it is treated as a boolean
int systemId = 0; //[8] systemId
int networkId = 0; //[9] networkId
int roamingIndicator = -1; //[10] Roaming indicator
int systemIsInPrl = 0; //[11] Indicates if current system is in PRL
int defaultRoamingIndicator = 0; //[12] Is default roaming indicator from PRL
int reasonForDenial = 0; //[13] Denial reason if registrationState = 3
if (states.length == 14) {
try {
if (states[0] != null) {
registrationState = Integer.parseInt(states[0]);
}
if (states[3] != null) {
radioTechnology = Integer.parseInt(states[3]);
}
if (states[4] != null) {
baseStationId = Integer.parseInt(states[4]);
}
if (states[5] != null) {
baseStationLatitude = Integer.parseInt(states[5]);
}
if (states[6] != null) {
baseStationLongitude = Integer.parseInt(states[6]);
}
// Some carriers only return lat-lngs of 0,0
if (baseStationLatitude == 0 && baseStationLongitude == 0) {
baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
}
if (states[7] != null) {
cssIndicator = Integer.parseInt(states[7]);
}
if (states[8] != null) {
systemId = Integer.parseInt(states[8]);
}
if (states[9] != null) {
networkId = Integer.parseInt(states[9]);
}
if (states[10] != null) {
roamingIndicator = Integer.parseInt(states[10]);
}
if (states[11] != null) {
systemIsInPrl = Integer.parseInt(states[11]);
}
if (states[12] != null) {
defaultRoamingIndicator = Integer.parseInt(states[12]);
}
if (states[13] != null) {
reasonForDenial = Integer.parseInt(states[13]);
}
} catch (NumberFormatException ex) {
Log.w(LOG_TAG, "error parsing RegistrationState: " + ex);
}
} else {
throw new RuntimeException("Warning! Wrong number of parameters returned from "
+ "RIL_REQUEST_REGISTRATION_STATE: expected 14 got "
+ states.length);
}
mRegistrationState = registrationState;
// When registration state is roaming and TSB58
// roaming indicator is not in the carrier-specified
// list of ERIs for home system, mCdmaRoaming is true.
mCdmaRoaming =
regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
newSS.setState (regCodeToServiceState(registrationState));
if(checkAdditionalDataAvaiable()) {
this.newCdmaDataConnectionState =
radioTechnologyToDataServiceState(radioTechnology);
newSS.setRadioTechnology(radioTechnology);
newNetworkType = radioTechnology;
}
newSS.setCssIndicator(cssIndicator);
newSS.setSystemAndNetworkId(systemId, networkId);
mRoamingIndicator = roamingIndicator;
mIsInPrl = (systemIsInPrl == 0) ? false : true;
mDefaultRoamingIndicator = defaultRoamingIndicator;
// Values are -1 if not available.
newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
baseStationLongitude, systemId, networkId);
if (reasonForDenial == 0) {
mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
} else if (reasonForDenial == 1) {
mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
} else {
mRegistrationDeniedReason = "";
}
if (mRegistrationState == 3) {
if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
}
break;
case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
String opNames[] = (String[])ar.result;
if (opNames != null && opNames.length >= 3) {
// If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
if ((opNames[2] == null) || (opNames[2].length() < 5)
|| ("00000".equals(opNames[2]))) {
opNames[2] = SystemProperties.get(
CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
if (DBG) {
log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
" is bad. Using SystemProperties '" +
CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
"'= " + opNames[2]);
}
}
if (cm.getNvState().isNVReady()) {
// In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
// ERI text, so here it is ignored what is coming from the modem.
newSS.setOperatorName(null, opNames[1], opNames[2]);
} else {
newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
}
} else {
Log.w(LOG_TAG, "error parsing opNames");
}
break;
default:
Log.e(LOG_TAG, "RIL response handle in wrong phone!"
+ " Expected CDMA RIL request and get GSM RIL request.");
break;
}
}
/**
* Handle the result of one of the pollState() - related requests
*/ */
@Override @Override
protected void handlePollStateResult (int what, AsyncResult ar) { protected void handlePollStateResult (int what, AsyncResult ar) {
int ints[];
String states[];
// Ignore stale requests from last poll. // Ignore stale requests from last poll.
if (ar.userObj != pollingContext) return; if (ar.userObj != pollingContext) return;
@ -825,7 +684,148 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
ar.exception); ar.exception);
} }
} else try { } else try {
handlePollStateResultMessage(what, ar); switch (what) {
case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
states = (String[])ar.result;
int registrationState = 4; //[0] registrationState
int radioTechnology = -1; //[3] radioTechnology
int baseStationId = -1; //[4] baseStationId
//[5] baseStationLatitude
int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
//[6] baseStationLongitude
int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
int cssIndicator = 0; //[7] init with 0, because it is treated as a boolean
int systemId = 0; //[8] systemId
int networkId = 0; //[9] networkId
int roamingIndicator = -1; //[10] Roaming indicator
int systemIsInPrl = 0; //[11] Indicates if current system is in PRL
int defaultRoamingIndicator = 0; //[12] Is default roaming indicator from PRL
int reasonForDenial = 0; //[13] Denial reason if registrationState = 3
if (states.length == 14) {
try {
if (states[0] != null) {
registrationState = Integer.parseInt(states[0]);
}
if (states[3] != null) {
radioTechnology = Integer.parseInt(states[3]);
}
if (states[4] != null) {
baseStationId = Integer.parseInt(states[4]);
}
if (states[5] != null) {
baseStationLatitude = Integer.parseInt(states[5]);
}
if (states[6] != null) {
baseStationLongitude = Integer.parseInt(states[6]);
}
// Some carriers only return lat-lngs of 0,0
if (baseStationLatitude == 0 && baseStationLongitude == 0) {
baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
}
if (states[7] != null) {
cssIndicator = Integer.parseInt(states[7]);
}
if (states[8] != null) {
systemId = Integer.parseInt(states[8]);
}
if (states[9] != null) {
networkId = Integer.parseInt(states[9]);
}
if (states[10] != null) {
roamingIndicator = Integer.parseInt(states[10]);
}
if (states[11] != null) {
systemIsInPrl = Integer.parseInt(states[11]);
}
if (states[12] != null) {
defaultRoamingIndicator = Integer.parseInt(states[12]);
}
if (states[13] != null) {
reasonForDenial = Integer.parseInt(states[13]);
}
} catch (NumberFormatException ex) {
Log.w(LOG_TAG, "error parsing RegistrationState: " + ex);
}
} else {
throw new RuntimeException("Warning! Wrong number of parameters returned from "
+ "RIL_REQUEST_REGISTRATION_STATE: expected 14 got "
+ states.length);
}
mRegistrationState = registrationState;
// When registration state is roaming and TSB58
// roaming indicator is not in the carrier-specified
// list of ERIs for home system, mCdmaRoaming is true.
mCdmaRoaming =
regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
newSS.setState (regCodeToServiceState(registrationState));
this.newCdmaDataConnectionState =
radioTechnologyToDataServiceState(radioTechnology);
newSS.setRadioTechnology(radioTechnology);
newNetworkType = radioTechnology;
newSS.setCssIndicator(cssIndicator);
newSS.setSystemAndNetworkId(systemId, networkId);
mRoamingIndicator = roamingIndicator;
mIsInPrl = (systemIsInPrl == 0) ? false : true;
mDefaultRoamingIndicator = defaultRoamingIndicator;
// Values are -1 if not available.
newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
baseStationLongitude, systemId, networkId);
if (reasonForDenial == 0) {
mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
} else if (reasonForDenial == 1) {
mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
} else {
mRegistrationDeniedReason = "";
}
if (mRegistrationState == 3) {
if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
}
break;
case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
String opNames[] = (String[])ar.result;
if (opNames != null && opNames.length >= 3) {
// If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
if ((opNames[2] == null) || (opNames[2].length() < 5)
|| ("00000".equals(opNames[2]))) {
opNames[2] = SystemProperties.get(
CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
if (DBG) {
log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
" is bad. Using SystemProperties '" +
CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
"'= " + opNames[2]);
}
}
if (cm.getRadioState().isNVReady()) {
// In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
// ERI text, so here it is ignored what is coming from the modem.
newSS.setOperatorName(null, opNames[1], opNames[2]);
} else {
newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
}
} else {
Log.w(LOG_TAG, "error parsing opNames");
}
break;
default:
Log.e(LOG_TAG, "RIL response handle in wrong phone!"
+ " Expected CDMA RIL request and get GSM RIL request.");
break;
}
} catch (RuntimeException ex) { } catch (RuntimeException ex) {
Log.e(LOG_TAG, "Exception while polling service state. " Log.e(LOG_TAG, "Exception while polling service state. "
+ "Probably malformed RIL response.", ex); + "Probably malformed RIL response.", ex);
@ -896,8 +896,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
} }
protected void setSignalStrengthDefaultValues() { private void setSignalStrengthDefaultValues() {
mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, false); mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, false);
} }
/** /**
@ -908,7 +909,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
* and start over again if the radio notifies us that some * and start over again if the radio notifies us that some
* event has changed * event has changed
*/ */
protected void private void
pollState() { pollState() {
pollingContext = new int[1]; pollingContext = new int[1];
pollingContext[0] = 0; pollingContext[0] = 0;
@ -963,7 +964,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
} }
} }
protected static String networkTypeToString(int type) { private static String networkTypeToString(int type) {
String ret = "unknown"; String ret = "unknown";
switch (type) { switch (type) {
@ -993,7 +994,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
return ret; return ret;
} }
protected void fixTimeZone(String isoCountryCode) { private void fixTimeZone(String isoCountryCode) {
TimeZone zone = null; TimeZone zone = null;
// If the offset is (0, false) and the time zone property // If the offset is (0, false) and the time zone property
// is set, use the time zone property rather than GMT. // is set, use the time zone property rather than GMT.
@ -1030,7 +1031,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
} }
} }
protected void pollStateDone() { private void pollStateDone() {
if (DBG) log("Poll ServiceState done: oldSS=[" + ss + "] newSS=[" + newSS + "]"); if (DBG) log("Poll ServiceState done: oldSS=[" + ss + "] newSS=[" + newSS + "]");
boolean hasRegistered = boolean hasRegistered =
@ -1233,7 +1234,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
* send signal-strength-changed notification if changed * send signal-strength-changed notification if changed
* Called both for solicited and unsolicited signal strength updates * Called both for solicited and unsolicited signal strength updates
*/ */
protected void private void
onSignalStrengthResult(AsyncResult ar) { onSignalStrengthResult(AsyncResult ar) {
SignalStrength oldSignalStrength = mSignalStrength; SignalStrength oldSignalStrength = mSignalStrength;
@ -1252,7 +1253,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
//log(String.format("onSignalStrengthResult cdmaDbm=%d cdmaEcio=%d evdoRssi=%d evdoEcio=%d evdoSnr=%d", //log(String.format("onSignalStrengthResult cdmaDbm=%d cdmaEcio=%d evdoRssi=%d evdoEcio=%d evdoSnr=%d",
// cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, evdoSnr)); // cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, evdoSnr));
mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio,
evdoRssi, evdoEcio, evdoSnr, false); evdoRssi, evdoEcio, evdoSnr, -1, -1, -1, -1, -1, false);
} }
try { try {
@ -1288,7 +1289,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
} }
/** code is registration state 0-5 from TS 27.007 7.2 */ /** code is registration state 0-5 from TS 27.007 7.2 */
protected int private int
regCodeToServiceState(int code) { regCodeToServiceState(int code) {
switch (code) { switch (code) {
case 0: // Not searching and not registered case 0: // Not searching and not registered
@ -1317,13 +1318,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
return cdmaDataConnectionState; return cdmaDataConnectionState;
} }
/**
* TODO: In the future, we need remove getCurrentCdmaDataConnectionState
*/
public int getCurrentDataConnectionState() {
return cdmaDataConnectionState;
}
/** /**
* code is registration state 0-5 from TS 27.007 7.2 * code is registration state 0-5 from TS 27.007 7.2
* returns true if registered roam, false otherwise * returns true if registered roam, false otherwise
@ -1668,7 +1662,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
* @return true if phone is camping on a technology * @return true if phone is camping on a technology
* that could support voice and data simultaneously. * that could support voice and data simultaneously.
*/ */
public boolean isConcurrentVoiceAndDataAllowed() { boolean isConcurrentVoiceAndData() {
// Note: it needs to be confirmed which CDMA network types // Note: it needs to be confirmed which CDMA network types
// can support voice and data calls concurrently. // can support voice and data calls concurrently.
// For the time-being, the return value will be false. // For the time-being, the return value will be false.

View File

@ -33,7 +33,6 @@ import android.telephony.CellLocation;
import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils;
import android.telephony.ServiceState; import android.telephony.ServiceState;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import com.android.internal.telephony.CallTracker;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -73,7 +72,6 @@ import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.UUSInfo; import com.android.internal.telephony.UUSInfo;
import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.test.SimulatedRadioControl;
import com.android.internal.telephony.IccVmNotSupportedException; import com.android.internal.telephony.IccVmNotSupportedException;
import com.android.internal.telephony.ServiceStateTracker;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -102,6 +100,9 @@ public class GSMPhone extends PhoneBase {
// Instance Variables // Instance Variables
GsmCallTracker mCT; GsmCallTracker mCT;
GsmServiceStateTracker mSST; GsmServiceStateTracker mSST;
GsmSMSDispatcher mSMS;
SIMRecords mSIMRecords;
SimCard mSimCard;
CatService mStkService; CatService mStkService;
ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>(); ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
SimPhoneBookInterfaceManager mSimPhoneBookIntManager; SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
@ -282,14 +283,6 @@ public class GSMPhone extends PhoneBase {
return mSIMRecords.getVoiceCallForwardingFlag(); return mSIMRecords.getVoiceCallForwardingFlag();
} }
public CallTracker getCallTracker() {
return mCT;
}
public ServiceStateTracker getServiceStateTracker() {
return mSST;
}
public List<? extends MmiCode> public List<? extends MmiCode>
getPendingMmiCodes() { getPendingMmiCodes() {
return mPendingMMIs; return mPendingMMIs;
@ -321,7 +314,7 @@ public class GSMPhone extends PhoneBase {
case CONNECTED: case CONNECTED:
case DISCONNECTING: case DISCONNECTING:
if ( mCT.state != Phone.State.IDLE if ( mCT.state != Phone.State.IDLE
&& !mSST.isConcurrentVoiceAndDataAllowed()) { && !mSST.isConcurrentVoiceAndData()) {
ret = DataState.SUSPENDED; ret = DataState.SUSPENDED;
} else { } else {
ret = DataState.CONNECTED; ret = DataState.CONNECTED;
@ -411,7 +404,7 @@ public class GSMPhone extends PhoneBase {
mNotifier.notifySignalStrength(this); mNotifier.notifySignalStrength(this);
} }
public void /*package*/ void
notifyDataConnectionFailed(String reason, String apnType) { notifyDataConnectionFailed(String reason, String apnType) {
mNotifier.notifyDataConnectionFailed(this, reason, apnType); mNotifier.notifyDataConnectionFailed(this, reason, apnType);
} }

View File

@ -19,12 +19,10 @@ package com.android.internal.telephony.gsm;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
import android.util.Patterns; import android.util.Patterns;
import android.text.TextUtils;
import com.android.internal.telephony.ApnSetting; import com.android.internal.telephony.ApnSetting;
import com.android.internal.telephony.DataConnection; import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.RetryManager; import com.android.internal.telephony.RetryManager;
@ -38,10 +36,8 @@ public class GsmDataConnection extends DataConnection {
//***** Instance Variables //***** Instance Variables
private ApnSetting apn; private ApnSetting apn;
protected int mProfileId = RILConstants.DATA_PROFILE_DEFAULT;
protected String mActiveApnType = Phone.APN_TYPE_DEFAULT;
//***** Constructor //***** Constructor
private GsmDataConnection(PhoneBase phone, String name, RetryManager rm) { private GsmDataConnection(GSMPhone phone, String name, RetryManager rm) {
super(phone, name, rm); super(phone, name, rm);
} }
@ -53,7 +49,7 @@ public class GsmDataConnection extends DataConnection {
* @param rm the RetryManager * @param rm the RetryManager
* @return GsmDataConnection that was created. * @return GsmDataConnection that was created.
*/ */
static GsmDataConnection makeDataConnection(PhoneBase phone, int id, RetryManager rm) { static GsmDataConnection makeDataConnection(GSMPhone phone, int id, RetryManager rm) {
synchronized (mCountLock) { synchronized (mCountLock) {
mCount += 1; mCount += 1;
} }
@ -106,29 +102,11 @@ public class GsmDataConnection extends DataConnection {
phone.mCM.setupDataCall( phone.mCM.setupDataCall(
Integer.toString(RILConstants.SETUP_DATA_TECH_GSM), Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
Integer.toString(mProfileId), Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
apn.apn, apn.user, apn.password, apn.apn, apn.user, apn.password, Integer.toString(authType),
Integer.toString(authType),
protocol, msg); protocol, msg);
} }
public void setProfileId(int profileId) {
mProfileId = profileId;
}
public int getProfileId() {
return mProfileId;
}
public int getCid() {
// 'cid' has been defined in parent class
return cid;
}
public void setActiveApnType(String apnType) {
mActiveApnType = apnType;
}
@Override @Override
protected void clearSettings() { protected void clearSettings() {
super.clearSettings(); super.clearSettings();
@ -172,35 +150,17 @@ public class GsmDataConnection extends DataConnection {
} }
private void setHttpProxy(String httpProxy, String httpPort) { private void setHttpProxy(String httpProxy, String httpPort) {
if (httpProxy == null || httpProxy.length() == 0) {
if (DBG) log("set http proxy for" phone.setSystemProperty("net.gprs.http-proxy", null);
+ "' APN: '" + mActiveApnType return;
+ "' proxy: '" + apn.proxy + "' port: '" + apn.port);
if(TextUtils.equals(mActiveApnType, Phone.APN_TYPE_DEFAULT)) {
if (httpProxy == null || httpProxy.length() == 0) {
phone.setSystemProperty("net.gprs.http-proxy", null);
return;
}
if (httpPort == null || httpPort.length() == 0) {
httpPort = "8080"; // Default to port 8080
}
phone.setSystemProperty("net.gprs.http-proxy",
"http://" + httpProxy + ":" + httpPort + "/");
} else {
if (httpProxy == null || httpProxy.length() == 0) {
phone.setSystemProperty("net.gprs.http-proxy." + mActiveApnType, null);
return;
}
if (httpPort == null || httpPort.length() == 0) {
httpPort = "8080"; // Default to port 8080
}
phone.setSystemProperty("net.gprs.http-proxy." + mActiveApnType,
"http://" + httpProxy + ":" + httpPort + "/");
} }
if (httpPort == null || httpPort.length() == 0) {
httpPort = "8080"; // Default to port 8080
}
phone.setSystemProperty("net.gprs.http-proxy",
"http://" + httpProxy + ":" + httpPort + "/");
} }
private boolean isIpAddress(String address) { private boolean isIpAddress(String address) {

View File

@ -99,7 +99,7 @@ final class GsmSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public int dispatchMessage(SmsMessageBase smsb) { protected int dispatchMessage(SmsMessageBase smsb) {
// If sms is null, means there was a parsing error. // If sms is null, means there was a parsing error.
if (smsb == null) { if (smsb == null) {
@ -383,7 +383,7 @@ final class GsmSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void activateCellBroadcastSms(int activate, Message response) { protected void activateCellBroadcastSms(int activate, Message response) {
// Unless CBS is implemented for GSM, this point should be unreachable. // Unless CBS is implemented for GSM, this point should be unreachable.
Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM."); Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
response.recycle(); response.recycle();
@ -391,7 +391,7 @@ final class GsmSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void getCellBroadcastSmsConfig(Message response){ protected void getCellBroadcastSmsConfig(Message response){
// Unless CBS is implemented for GSM, this point should be unreachable. // Unless CBS is implemented for GSM, this point should be unreachable.
Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM."); Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
response.recycle(); response.recycle();
@ -399,7 +399,7 @@ final class GsmSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void setCellBroadcastConfig(int[] configValuesArray, Message response) { protected void setCellBroadcastConfig(int[] configValuesArray, Message response) {
// Unless CBS is implemented for GSM, this point should be unreachable. // Unless CBS is implemented for GSM, this point should be unreachable.
Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM."); Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
response.recycle(); response.recycle();

View File

@ -278,8 +278,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
* @param what what code of message when delivered * @param what what code of message when delivered
* @param obj placed in Message.obj * @param obj placed in Message.obj
*/ */
@Override void registerForGprsAttached(Handler h, int what, Object obj) {
public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj); Registrant r = new Registrant(h, what, obj);
gprsAttachedRegistrants.add(r); gprsAttachedRegistrants.add(r);
@ -288,8 +287,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
} }
} }
@Override void unregisterForGprsAttached(Handler h) {
public void unregisterForDataConnectionAttached(Handler h) {
gprsAttachedRegistrants.remove(h); gprsAttachedRegistrants.remove(h);
} }
@ -331,7 +329,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
* @param what what code of message when delivered * @param what what code of message when delivered
* @param obj placed in Message.obj * @param obj placed in Message.obj
*/ */
public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) { void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedEnabled "); Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedEnabled ");
Registrant r = new Registrant(h, what, obj); Registrant r = new Registrant(h, what, obj);
psRestrictEnabledRegistrants.add(r); psRestrictEnabledRegistrants.add(r);
@ -341,7 +339,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
} }
} }
public void unregisterForPsRestrictedEnabled(Handler h) { void unregisterForPsRestrictedEnabled(Handler h) {
psRestrictEnabledRegistrants.remove(h); psRestrictEnabledRegistrants.remove(h);
} }
@ -351,7 +349,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
* @param what what code of message when delivered * @param what what code of message when delivered
* @param obj placed in Message.obj * @param obj placed in Message.obj
*/ */
public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) { void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedDisabled "); Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedDisabled ");
Registrant r = new Registrant(h, what, obj); Registrant r = new Registrant(h, what, obj);
psRestrictDisabledRegistrants.add(r); psRestrictDisabledRegistrants.add(r);
@ -361,7 +359,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
} }
} }
public void unregisterForPsRestrictedDisabled(Handler h) { void unregisterForPsRestrictedDisabled(Handler h) {
psRestrictDisabledRegistrants.remove(h); psRestrictDisabledRegistrants.remove(h);
} }
@ -569,21 +567,33 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
&& cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) { && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
cm.setRadioPower(true, null); cm.setRadioPower(true, null);
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) { } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
EventLog.writeEvent(EventLogTags.DATA_NETWORK_STATUS_ON_RADIO_OFF,
dcTracker.getStateInString(), dcTracker.getAnyDataEnabled() ? 1 : 0);
}
// If it's on and available and we want it off gracefully // If it's on and available and we want it off gracefully
powerOffRadioSafely(); powerOffRadioSafely();
} // Otherwise, we're in the desired state } // Otherwise, we're in the desired state
} }
@Override @Override
public void powerOffRadioSafely() { protected void powerOffRadioSafely() {
// Cleanup all connections // clean data connection
DataConnectionTracker dcTracker = phone.mDataConnection; DataConnectionTracker dcTracker = phone.mDataConnection;
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_ALL_CONNECTIONS); Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = GSMPhone.REASON_RADIO_TURNED_OFF;
dcTracker.sendMessage(msg); dcTracker.sendMessage(msg);
// poll data state up to 15 times, with a 100ms delay // poll data state up to 15 times, with a 100ms delay
// totaling 1.5 sec. Normal data disable action will finish in 100ms. // totaling 1.5 sec. Normal data disable action will finish in 100ms.
for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) { for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
if (dcTracker.getState() != DataConnectionTracker.State.CONNECTED
&& dcTracker.getState() != DataConnectionTracker.State.DISCONNECTING) {
Log.d(LOG_TAG, "Data shutdown complete.");
break;
}
SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS); SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
} }
@ -1063,7 +1073,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
} }
if (hasNetworkTypeChanged) { if (hasNetworkTypeChanged) {
phone.notifyDataConnection(Phone.REASON_NW_TYPE_CHANGED, Phone.APN_TYPE_ALL); phone.notifyDataConnection();
} }
if (hasRoamingOn) { if (hasRoamingOn) {
@ -1391,15 +1401,11 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
return gprsState; return gprsState;
} }
public int getCurrentDataConnectionState() {
return gprsState;
}
/** /**
* @return true if phone is camping on a technology (eg UMTS) * @return true if phone is camping on a technology (eg UMTS)
* that could support voice and data simultaneously. * that could support voice and data simultaneously.
*/ */
public boolean isConcurrentVoiceAndDataAllowed() { boolean isConcurrentVoiceAndData() {
return (networkType >= DATA_ACCESS_UMTS); return (networkType >= DATA_ACCESS_UMTS);
} }

View File

@ -35,7 +35,6 @@ import com.android.internal.telephony.IccUtils;
import com.android.internal.telephony.IccVmFixedException; import com.android.internal.telephony.IccVmFixedException;
import com.android.internal.telephony.IccVmNotSupportedException; import com.android.internal.telephony.IccVmNotSupportedException;
import com.android.internal.telephony.MccTable; import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.PhoneBase;
import java.util.ArrayList; import java.util.ArrayList;
@ -166,7 +165,7 @@ public final class SIMRecords extends IccRecords {
// ***** Constructor // ***** Constructor
public SIMRecords(PhoneBase p) { SIMRecords(GSMPhone p) {
super(p); super(p);
adnCache = new AdnRecordCache(phone); adnCache = new AdnRecordCache(phone);
@ -365,7 +364,7 @@ public final class SIMRecords extends IccRecords {
countVoiceMessages = countWaiting; countVoiceMessages = countWaiting;
phone.notifyMessageWaitingIndicator(); ((GSMPhone) phone).notifyMessageWaitingIndicator();
try { try {
if (efMWIS != null) { if (efMWIS != null) {
@ -414,7 +413,7 @@ public final class SIMRecords extends IccRecords {
callForwardingEnabled = enable; callForwardingEnabled = enable;
phone.notifyCallForwardingIndicator(); ((GSMPhone) phone).notifyCallForwardingIndicator();
try { try {
if (mEfCfis != null) { if (mEfCfis != null) {
@ -471,7 +470,7 @@ public final class SIMRecords extends IccRecords {
/** Returns the 5 or 6 digit MCC/MNC of the operator that /** Returns the 5 or 6 digit MCC/MNC of the operator that
* provided the SIM card. Returns null of SIM is not yet ready * provided the SIM card. Returns null of SIM is not yet ready
*/ */
public String getSIMOperatorNumeric() { String getSIMOperatorNumeric() {
if (imsi == null || mncLength == UNINITIALIZED || mncLength == UNKNOWN) { if (imsi == null || mncLength == UNINITIALIZED || mncLength == UNKNOWN) {
return null; return null;
} }
@ -548,7 +547,7 @@ public final class SIMRecords extends IccRecords {
// finally have both the imsi and the mncLength and can parse the imsi properly // finally have both the imsi and the mncLength and can parse the imsi properly
MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength)); MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
} }
phone.mSimCard.broadcastIccStateChangedIntent( ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
SimCard.INTENT_VALUE_ICC_IMSI, null); SimCard.INTENT_VALUE_ICC_IMSI, null);
break; break;
@ -703,7 +702,7 @@ public final class SIMRecords extends IccRecords {
countVoiceMessages = -1; countVoiceMessages = -1;
} }
phone.notifyMessageWaitingIndicator(); ((GSMPhone) phone).notifyMessageWaitingIndicator();
break; break;
case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE: case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE:
@ -732,7 +731,7 @@ public final class SIMRecords extends IccRecords {
countVoiceMessages = 0; countVoiceMessages = 0;
} }
phone.notifyMessageWaitingIndicator(); ((GSMPhone) phone).notifyMessageWaitingIndicator();
} }
break; break;
@ -843,7 +842,7 @@ public final class SIMRecords extends IccRecords {
callForwardingEnabled = callForwardingEnabled =
((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE); ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE);
phone.notifyCallForwardingIndicator(); ((GSMPhone) phone).notifyCallForwardingIndicator();
} }
break; break;
@ -1043,7 +1042,7 @@ public final class SIMRecords extends IccRecords {
// Refer TS 51.011 Section 10.3.46 for the content description // Refer TS 51.011 Section 10.3.46 for the content description
callForwardingEnabled = ((data[1] & 0x01) != 0); callForwardingEnabled = ((data[1] & 0x01) != 0);
phone.notifyCallForwardingIndicator(); ((GSMPhone) phone).notifyCallForwardingIndicator();
break; break;
case EVENT_GET_CSP_CPHS_DONE: case EVENT_GET_CSP_CPHS_DONE:
@ -1153,7 +1152,7 @@ public final class SIMRecords extends IccRecords {
System.arraycopy(ba, 1, pdu, 0, n - 1); System.arraycopy(ba, 1, pdu, 0, n - 1);
SmsMessage message = SmsMessage.createFromPdu(pdu); SmsMessage message = SmsMessage.createFromPdu(pdu);
phone.mSMS.dispatchMessage(message); ((GSMPhone) phone).mSMS.dispatchMessage(message);
} }
} }
@ -1179,7 +1178,7 @@ public final class SIMRecords extends IccRecords {
System.arraycopy(ba, 1, pdu, 0, n - 1); System.arraycopy(ba, 1, pdu, 0, n - 1);
SmsMessage message = SmsMessage.createFromPdu(pdu); SmsMessage message = SmsMessage.createFromPdu(pdu);
phone.mSMS.dispatchMessage(message); ((GSMPhone) phone).mSMS.dispatchMessage(message);
// 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3
// 1 == "received by MS from network; message read" // 1 == "received by MS from network; message read"
@ -1229,7 +1228,7 @@ public final class SIMRecords extends IccRecords {
recordsLoadedRegistrants.notifyRegistrants( recordsLoadedRegistrants.notifyRegistrants(
new AsyncResult(null, null, null)); new AsyncResult(null, null, null));
phone.mSimCard.broadcastIccStateChangedIntent( ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
SimCard.INTENT_VALUE_ICC_LOADED, null); SimCard.INTENT_VALUE_ICC_LOADED, null);
} }
@ -1250,11 +1249,11 @@ public final class SIMRecords extends IccRecords {
} }
} }
public void onSimReady() { private void onSimReady() {
/* broadcast intent SIM_READY here so that we can make sure /* broadcast intent SIM_READY here so that we can make sure
READY is sent before IMSI ready READY is sent before IMSI ready
*/ */
phone.mSimCard.broadcastIccStateChangedIntent( ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
SimCard.INTENT_VALUE_ICC_READY, null); SimCard.INTENT_VALUE_ICC_READY, null);
fetchSimRecords(); fetchSimRecords();

View File

@ -19,8 +19,6 @@ package com.android.internal.telephony.gsm;
import android.util.Log; import android.util.Log;
import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCard;
import com.android.internal.telephony.PhoneBase;
import android.os.SystemProperties;
/** /**
* {@hide} * {@hide}
@ -36,21 +34,6 @@ public final class SimCard extends IccCard {
updateStateProperty(); updateStateProperty();
} }
/**
* We have the Sim card for LTE on CDMA phone
*/
public SimCard(PhoneBase phone, String logTag, Boolean dbg) {
super(phone, logTag, dbg);
mPhone.mCM.registerForSIMLockedOrAbsent(mHandler, EVENT_ICC_LOCKED_OR_ABSENT, null);
mPhone.mCM.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
mPhone.mCM.registerForSIMReady(mHandler, EVENT_ICC_READY, null);
updateStateProperty();
if(SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
mPhone.mCM.registerForNVReady(mHandler, EVENT_ICC_READY, null);
}
}
@Override @Override
public void dispose() { public void dispose() {
//Unregister for all events //Unregister for all events

View File

@ -58,21 +58,21 @@ public class ApnSettingTest extends TestCase {
testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN"; testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN";
expected_apn = new ApnSetting( expected_apn = new ApnSetting(
-1, "22210", "Vodafone IT", "web.omnitel.it", "", "", -1, "22210", "Vodafone IT", "web.omnitel.it", "", "",
"", "", "", "", "", 0, dunTypes, "IP", "IP", true, 0, 0); "", "", "", "", "", 0, dunTypes, "IP", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string. // A v2 string.
testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP"; testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP";
expected_apn = new ApnSetting( expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "", -1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0); "", "", "", "", "", 0, mmsTypes, "IPV6", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string with spaces. // A v2 string with spaces.
testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP"; testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP";
expected_apn = new ApnSetting( expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "", -1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP", true, 0, 0); "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// Return null if insufficient fields given. // Return null if insufficient fields given.
@ -87,7 +87,7 @@ public class ApnSettingTest extends TestCase {
String[] incorrectTypes = {"mms|*", "IPV6"}; String[] incorrectTypes = {"mms|*", "IPV6"};
expected_apn = new ApnSetting( expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "", -1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, incorrectTypes, "IP", "IP", true, 0, 0); "", "", "", "", "", 0, incorrectTypes, "IP", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
} }
@ -98,7 +98,7 @@ public class ApnSettingTest extends TestCase {
ApnSetting apn = new ApnSetting( ApnSetting apn = new ApnSetting(
99, "12345", "Name", "apn", "proxy", "port", 99, "12345", "Name", "apn", "proxy", "port",
"mmsc", "mmsproxy", "mmsport", "user", "password", 0, "mmsc", "mmsproxy", "mmsport", "user", "password", 0,
types, "IPV4V6", "IP", true, 0, 0); types, "IPV4V6", "IP");
String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " + String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " +
"mmsc, mmsproxy, mmsport, port, 0, default | *, " + "mmsc, mmsproxy, mmsport, port, 0, default | *, " +
"IPV4V6, IP"; "IPV4V6, IP";