am 9c118c80: Update CID in NeighboringCellInfo

Merge commit '9c118c80fd0a5416051f2a49f515301f2cf3fd6f' into eclair-plus-aosp

* commit '9c118c80fd0a5416051f2a49f515301f2cf3fd6f':
  Update CID in NeighboringCellInfo
This commit is contained in:
johnwang
2009-09-25 13:44:42 -07:00
committed by Android Git Automerger
5 changed files with 304 additions and 51 deletions

View File

@@ -122805,7 +122805,7 @@
type="android.telephony.NeighboringCellInfo" type="android.telephony.NeighboringCellInfo"
static="false" static="false"
final="false" final="false"
deprecated="not deprecated" deprecated="deprecated"
visibility="public" visibility="public"
> >
</constructor> </constructor>
@@ -122813,7 +122813,7 @@
type="android.telephony.NeighboringCellInfo" type="android.telephony.NeighboringCellInfo"
static="false" static="false"
final="false" final="false"
deprecated="not deprecated" deprecated="deprecated"
visibility="public" visibility="public"
> >
<parameter name="rssi" type="int"> <parameter name="rssi" type="int">
@@ -122853,6 +122853,39 @@
visibility="public" visibility="public"
> >
</method> </method>
<method name="getLac"
return="int"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</method>
<method name="getNetworkType"
return="int"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</method>
<method name="getPsc"
return="int"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</method>
<method name="getRssi" <method name="getRssi"
return="int" return="int"
abstract="false" abstract="false"
@@ -122871,7 +122904,7 @@
synchronized="false" synchronized="false"
static="false" static="false"
final="false" final="false"
deprecated="not deprecated" deprecated="deprecated"
visibility="public" visibility="public"
> >
<parameter name="cid" type="int"> <parameter name="cid" type="int">
@@ -122884,7 +122917,7 @@
synchronized="false" synchronized="false"
static="false" static="false"
final="false" final="false"
deprecated="not deprecated" deprecated="deprecated"
visibility="public" visibility="public"
> >
<parameter name="rssi" type="int"> <parameter name="rssi" type="int">

View File

@@ -18,6 +18,15 @@ package android.telephony;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
/** /**
* Represents the neighboring cell information, including * Represents the neighboring cell information, including
@@ -34,60 +43,202 @@ public class NeighboringCellInfo implements Parcelable
*/ */
static final public int UNKNOWN_CID = -1; static final public int UNKNOWN_CID = -1;
/**
* In GSM, mRssi is the Received RSSI;
* In UMTS, mRssi is the Level index of CPICH Received Signal Code Power
*/
private int mRssi; private int mRssi;
/**
* CID in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
*/
private int mCid; private int mCid;
/**
* LAC in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
*/
private int mLac;
/**
* Primary Scrambling Code in 9 bits format in UMTS
* Return UNKNOWN_CID in GSM and CMDA.
*/
private int mPsc;
/**
* Radio network type, value is one of following
* TelephonyManager.NETWORK_TYPE_XXXXXX.
*/
private int mNetworkType;
/** /**
* @deprecated
* Empty constructor. Initializes the RSSI and CID. * Empty constructor. Initializes the RSSI and CID.
*
* NeighboringCellInfo is one time shot for the neighboring cells based on
* the radio network type at that moment. Its constructor needs radio network
* type.
*/ */
public NeighboringCellInfo() { public NeighboringCellInfo() {
mRssi = UNKNOWN_RSSI; mRssi = UNKNOWN_RSSI;
mLac = UNKNOWN_CID;
mCid = UNKNOWN_CID; mCid = UNKNOWN_CID;
mPsc = UNKNOWN_CID;
mNetworkType = NETWORK_TYPE_UNKNOWN;
} }
/** /**
* @deprecated
* Initialize the object from rssi and cid. * Initialize the object from rssi and cid.
*
* NeighboringCellInfo is one time shot for the neighboring cells based on
* the radio network type at that moment. Its constructor needs radio network
* type.
*/ */
public NeighboringCellInfo(int rssi, int cid) { public NeighboringCellInfo(int rssi, int cid) {
mRssi = rssi; mRssi = rssi;
mCid = cid; mCid = cid;
} }
/**
* @hide
* Initialize the object from rssi, location string, and radioType
* radioType is one of following
* {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS},
* {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE},
* {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
* {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
* {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
* and {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}.
*/
public NeighboringCellInfo(int rssi, String location, int radioType) {
// set default value
mRssi = rssi;
mNetworkType = NETWORK_TYPE_UNKNOWN;
mPsc = UNKNOWN_CID;
mLac = UNKNOWN_CID;
mCid = UNKNOWN_CID;
// pad location string with leading "0"
int l = location.length();
if (l > 8) return;
if (l < 8) {
for (int i = 0; i < (8-l); i++) {
location = "0" + location;
}
}
try {// set LAC/CID or PSC based on radioType
switch (radioType) {
case NETWORK_TYPE_GPRS:
case NETWORK_TYPE_EDGE:
mNetworkType = radioType;
mLac = Integer.valueOf(location.substring(0, 4), 16);
mCid = Integer.valueOf(location.substring(4), 16);
break;
case NETWORK_TYPE_UMTS:
case NETWORK_TYPE_HSDPA:
case NETWORK_TYPE_HSUPA:
case NETWORK_TYPE_HSPA:
mNetworkType = radioType;
mPsc = Integer.valueOf(location, 16);
break;
}
} catch (NumberFormatException e) {
// parsing location error
mPsc = UNKNOWN_CID;
mLac = UNKNOWN_CID;
mCid = UNKNOWN_CID;
mNetworkType = NETWORK_TYPE_UNKNOWN;
}
}
/** /**
* Initialize the object from a parcel. * Initialize the object from a parcel.
*/ */
public NeighboringCellInfo(Parcel in) { public NeighboringCellInfo(Parcel in) {
mRssi = in.readInt(); mRssi = in.readInt();
mLac = in.readInt();
mCid = in.readInt(); mCid = in.readInt();
mPsc = in.readInt();
mNetworkType = in.readInt();
} }
/** /**
* @return received signal strength in "asu", ranging from 0 - 31, * @return received signal strength or UNKNOWN_RSSI if unknown
* or UNKNOWN_RSSI if unknown
* *
* For GSM, dBm = -113 + 2*asu, * For GSM, it is in "asu" ranging from 0 to 31 (dBm = -113 + 2*asu)
* 0 means "-113 dBm or less" and 31 means "-51 dBm or greater" * 0 means "-113 dBm or less" and 31 means "-51 dBm or greater"
* For UMTS, it is the Level index of CPICH RSCP defined in TS 25.125
*/ */
public int getRssi() { public int getRssi() {
return mRssi; return mRssi;
} }
/** /**
* @return cell id, UNKNOWN_CID if unknown, 0xffffffff max legal value * @return LAC in GSM, 0xffff max legal value
* UNKNOWN_CID if in UMTS or CMDA or unknown
*/
public int getLac() {
return mLac;
}
/**
* @return cell id in GSM, 0xffff max legal value
* UNKNOWN_CID if in UMTS or CDMA or unknown
*/ */
public int getCid() { public int getCid() {
return mCid; return mCid;
} }
/** /**
* @return Primary Scrambling Code in 9 bits format in UMTS, 0x1ff max value
* UNKNOWN_CID if in GSM or CMDA or unknown
*/
public int getPsc() {
return mPsc;
}
/**
* @return Radio network type while neighboring cell location is stored.
*
* Return {@link TelephonyManager#NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_UNKNOWN}
* means that the location information is unavailable.
*
* Return {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS} or
* {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE}
* means that Neighboring Cell information is stored for GSM network, in
* which {@link NeighboringCellInfo#getLac NeighboringCellInfo.getLac} and
* {@link NeighboringCellInfo#getCid NeighboringCellInfo.getCid} should be
* called to access location.
*
* Return {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
* {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
* {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
* or {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}
* means that Neighboring Cell information is stored for UMTS network, in
* which {@link NeighboringCellInfo#getPsc NeighboringCellInfo.getPsc}
* should be called to access location.
*/
public int getNetworkType() {
return mNetworkType;
}
/**
* @deprecated
* Set the cell id. * Set the cell id.
*
* NeighboringCellInfo is a one time shot for the neighboring cells based on
* the radio network type at that moment. It shouldn't be changed after
* creation.
*/ */
public void setCid(int cid) { public void setCid(int cid) {
mCid = cid; mCid = cid;
} }
/** /**
* @deprecated
* Set the signal strength of the cell. * Set the signal strength of the cell.
*
* NeighboringCellInfo is a one time shot for the neighboring cells based on
* the radio network type at that moment. It shouldn't be changed after
* creation.
*/ */
public void setRssi(int rssi) { public void setRssi(int rssi) {
mRssi = rssi; mRssi = rssi;
@@ -95,8 +246,20 @@ public class NeighboringCellInfo implements Parcelable
@Override @Override
public String toString() { public String toString() {
return "["+ ((mCid == UNKNOWN_CID) ? "/" : Integer.toHexString(mCid)) StringBuilder sb = new StringBuilder();
+ " at " + ((mRssi == UNKNOWN_RSSI)? "/" : mRssi) + "]";
sb.append("[");
if (mPsc != UNKNOWN_CID) {
sb.append(Integer.toHexString(mPsc))
.append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
} else if(mLac != UNKNOWN_CID && mCid != UNKNOWN_CID) {
sb.append(Integer.toHexString(mLac))
.append(Integer.toHexString(mCid))
.append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
}
sb.append("]");
return sb.toString();
} }
public int describeContents() { public int describeContents() {
@@ -105,7 +268,10 @@ public class NeighboringCellInfo implements Parcelable
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mRssi); dest.writeInt(mRssi);
dest.writeInt(mLac);
dest.writeInt(mCid); dest.writeInt(mCid);
dest.writeInt(mPsc);
dest.writeInt(mNetworkType);
} }
public static final Parcelable.Creator<NeighboringCellInfo> CREATOR public static final Parcelable.Creator<NeighboringCellInfo> CREATOR
@@ -118,6 +284,4 @@ public class NeighboringCellInfo implements Parcelable
return new NeighboringCellInfo[size]; return new NeighboringCellInfo[size];
} }
}; };
} }

View File

@@ -254,13 +254,13 @@ public class TelephonyManager {
* (@link android.Manifest.permission#ACCESS_COARSE_UPDATES} * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES}
*/ */
public List<NeighboringCellInfo> getNeighboringCellInfo() { public List<NeighboringCellInfo> getNeighboringCellInfo() {
try { try {
return getITelephony().getNeighboringCellInfo(); return getITelephony().getNeighboringCellInfo();
} catch (RemoteException ex) { } catch (RemoteException ex) {
return null; return null;
} catch (NullPointerException ex) { } catch (NullPointerException ex) {
return null; return null;
} }
} }
/** No phone radio. */ /** No phone radio. */

View File

@@ -17,6 +17,14 @@
package com.android.internal.telephony; package com.android.internal.telephony;
import static com.android.internal.telephony.RILConstants.*; import static com.android.internal.telephony.RILConstants.*;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -30,6 +38,7 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Parcel; import android.os.Parcel;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.PowerManager.WakeLock; import android.os.PowerManager.WakeLock;
import android.telephony.NeighboringCellInfo; import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils;
@@ -2876,21 +2885,44 @@ public final class RIL extends BaseCommands implements CommandsInterface {
private Object private Object
responseCellList(Parcel p) { responseCellList(Parcel p) {
int num; int num, rssi;
String location;
ArrayList<NeighboringCellInfo> response; ArrayList<NeighboringCellInfo> response;
NeighboringCellInfo cell; NeighboringCellInfo cell;
num = p.readInt(); num = p.readInt();
response = new ArrayList<NeighboringCellInfo>(num); response = new ArrayList<NeighboringCellInfo>();
for (int i = 0 ; i < num ; i++) { // Determine the radio access type
int rssi = p.readInt(); String radioString = SystemProperties.get(
int cid = Integer.valueOf(p.readString(), 16); TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, "unknown");
cell = new NeighboringCellInfo(rssi, cid); int radioType;
response.add(cell); if (radioString.equals("GPRS")) {
radioType = NETWORK_TYPE_GPRS;
} else if (radioString.equals("EDGE")) {
radioType = NETWORK_TYPE_EDGE;
} else if (radioString.equals("UMTS")) {
radioType = NETWORK_TYPE_UMTS;
} else if (radioString.equals("HSDPA")) {
radioType = NETWORK_TYPE_HSDPA;
} else if (radioString.equals("HSUPA")) {
radioType = NETWORK_TYPE_HSUPA;
} else if (radioString.equals("HSPA")) {
radioType = NETWORK_TYPE_HSPA;
} else {
radioType = NETWORK_TYPE_UNKNOWN;
} }
return response; // Interpret the location based on radio access type
if (radioType != NETWORK_TYPE_UNKNOWN) {
for (int i = 0 ; i < num ; i++) {
rssi = p.readInt();
location = p.readString();
cell = new NeighboringCellInfo(rssi, location, radioType);
response.add(cell);
}
}
return response;
} }
private Object responseGmsBroadcastConfig(Parcel p) { private Object responseGmsBroadcastConfig(Parcel p) {

View File

@@ -15,41 +15,65 @@
*/ */
package com.android.unit_tests; package com.android.unit_tests;
import android.os.Parcel;
import android.test.AndroidTestCase; import android.test.AndroidTestCase;
import android.telephony.NeighboringCellInfo; import android.telephony.NeighboringCellInfo;
import android.test. suitebuilder.annotation.SmallTest; import android.test. suitebuilder.annotation.SmallTest;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
public class NeighboringCellInfoTest extends AndroidTestCase { public class NeighboringCellInfoTest extends AndroidTestCase {
@SmallTest @SmallTest
public void testConstructor() { public void testConstructor() {
NeighboringCellInfo empty = new NeighboringCellInfo();
assertEquals(NeighboringCellInfo.UNKNOWN_RSSI, empty.getRssi());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, empty.getCid());
int rssi = 31; int rssi = 31;
int cid = 0xffffffff; NeighboringCellInfo nc;
NeighboringCellInfo max = new NeighboringCellInfo(rssi, cid);
assertEquals(rssi, max.getRssi());
assertEquals(cid, max.getCid());
}
@SmallTest nc = new NeighboringCellInfo(rssi, "FFFFFFF", NETWORK_TYPE_EDGE);
public void testGetAndSet() { assertEquals(NETWORK_TYPE_EDGE, nc.getNetworkType());
int rssi = 16;
int cid = 0x12345678;
NeighboringCellInfo nc = new NeighboringCellInfo();
nc.setRssi(rssi);
nc.setCid(cid);
assertEquals(rssi, nc.getRssi()); assertEquals(rssi, nc.getRssi());
assertEquals(cid, nc.getCid()); assertEquals(0xfff, nc.getLac());
assertEquals(0xffff, nc.getCid());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UMTS);
assertEquals(NETWORK_TYPE_UMTS, nc.getNetworkType());
assertEquals(rssi, nc.getRssi());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
assertEquals(0x1ff, nc.getPsc());
nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UNKNOWN);
assertEquals(NETWORK_TYPE_UNKNOWN, nc.getNetworkType());
assertEquals(rssi, nc.getRssi());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
} }
@SmallTest @SmallTest
public void testToString() { public void testParcel() {
NeighboringCellInfo empty = new NeighboringCellInfo(); int rssi = 20;
assertEquals("[/ at /]", empty.toString());
NeighboringCellInfo nc = new NeighboringCellInfo(16, 0x12345678); NeighboringCellInfo nc = new NeighboringCellInfo(rssi, "12345678", NETWORK_TYPE_GPRS);
assertEquals("[12345678 at 16]", nc.toString()); assertEquals(NETWORK_TYPE_GPRS, nc.getNetworkType());
} assertEquals(rssi, nc.getRssi());
assertEquals(0x1234, nc.getLac());
assertEquals(0x5678, nc.getCid());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
Parcel p = Parcel.obtain();
p.setDataPosition(0);
nc.writeToParcel(p, 0);
p.setDataPosition(0);
NeighboringCellInfo nw = new NeighboringCellInfo(p);
assertEquals(NETWORK_TYPE_GPRS, nw.getNetworkType());
assertEquals(rssi, nw.getRssi());
assertEquals(0x1234, nw.getLac());
assertEquals(0x5678, nw.getCid());
assertEquals(NeighboringCellInfo.UNKNOWN_CID, nw.getPsc());
}
} }