Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +21 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.os.Handler; import android.os.Message; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.telephony.CellInfo; import android.telephony.ServiceState; import android.telephony.SignalStrength; Loading Loading @@ -58,8 +59,9 @@ public abstract class ServiceStateTracker extends Handler { public ServiceState mSS = new ServiceState(); protected ServiceState mNewSS = new ServiceState(); private static final long LAST_CELL_INFO_LIST_MAX_AGE_MS = 2000; protected long mLastCellInfoListTime; protected List<CellInfo> mLastCellInfoList = null; protected CellInfo mLastCellInfo = null; // This is final as subclasses alias to a more specific type // so we don't want the reference to change. Loading Loading @@ -388,6 +390,7 @@ public abstract class ServiceStateTracker extends Handler { + " list=" + result.list); } } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = result.list; result.lockObj.notify(); } Loading @@ -404,6 +407,7 @@ public abstract class ServiceStateTracker extends Handler { log("EVENT_UNSOL_CELL_INFO_LIST: size=" + list.size() + " list=" + list); } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = list; mPhoneBase.notifyCellInfo(list); } Loading Loading @@ -670,6 +674,8 @@ public abstract class ServiceStateTracker extends Handler { int ver = mCi.getRilVersion(); if (ver >= 8) { if (isCallerOnDifferentThread()) { if ((SystemClock.elapsedRealtime() - mLastCellInfoListTime) > LAST_CELL_INFO_LIST_MAX_AGE_MS) { Message msg = obtainMessage(EVENT_GET_CELL_INFO_LIST, result); synchronized(result.lockObj) { mCi.getCellInfoList(msg); Loading @@ -681,11 +687,15 @@ public abstract class ServiceStateTracker extends Handler { } } } else { log("SST.getAllCellInfo(): X return last, same thread probably RadioInfo"); if (DBG) log("SST.getAllCellInfo(): return last, back to back calls"); result.list = mLastCellInfoList; } } else { log("SST.getAllCellInfo(): X not implemented"); if (DBG) log("SST.getAllCellInfo(): return last, same thread can't block"); result.list = mLastCellInfoList; } } else { if (DBG) log("SST.getAllCellInfo(): not implemented"); result.list = null; } if (DBG) { Loading src/java/com/android/internal/telephony/gsm/GSMPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -249,7 +249,7 @@ public class GSMPhone extends PhoneBase { @Override public CellLocation getCellLocation() { return mSST.mCellLoc; return mSST.getCellLocation(); } @Override Loading src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +78 −0 Original line number Diff line number Diff line Loading @@ -37,7 +37,14 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.telephony.CellIdentityGsm; import android.telephony.CellIdentityLte; import android.telephony.CellIdentityWcdma; import android.telephony.CellInfo; import android.telephony.CellInfoGsm; import android.telephony.CellInfoLte; import android.telephony.CellInfoWcdma; import android.telephony.CellLocation; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SignalStrength; Loading Loading @@ -69,6 +76,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; /** Loading Loading @@ -1318,6 +1326,76 @@ final class GsmServiceStateTracker extends ServiceStateTracker { return (mSS.getRilVoiceRadioTechnology() >= ServiceState.RIL_RADIO_TECHNOLOGY_UMTS); } /** * @return the current cell location information. Prefer Gsm location * information if available otherwise return LTE location information */ public CellLocation getCellLocation() { if ((mCellLoc.getLac() >= 0) && (mCellLoc.getCid() >= 0)) { if (DBG) log("getCellLocation(): X good mCellLoc=" + mCellLoc); return mCellLoc; } else { List<CellInfo> result = getAllCellInfo(); if (result != null) { // A hack to allow tunneling of LTE information via GsmCellLocation // so that older Network Location Providers can return some information // on LTE only networks, see bug 9228974. // // We'll search the return CellInfo array preferring GSM/WCDMA // data, but if there is none we'll tunnel the first LTE information // in the list. // // The tunnel'd LTE information is returned as follows: // LAC = TAC field // CID = CI field // PSC = 0. GsmCellLocation cellLocOther = new GsmCellLocation(); for (CellInfo ci : result) { if (ci instanceof CellInfoGsm) { CellInfoGsm cellInfoGsm = (CellInfoGsm)ci; CellIdentityGsm cellIdentityGsm = cellInfoGsm.getCellIdentity(); cellLocOther.setLacAndCid(cellIdentityGsm.getLac(), cellIdentityGsm.getCid()); cellLocOther.setPsc(cellIdentityGsm.getPsc()); if (DBG) log("getCellLocation(): X ret GSM info=" + cellLocOther); return cellLocOther; } else if (ci instanceof CellInfoWcdma) { CellInfoWcdma cellInfoWcdma = (CellInfoWcdma)ci; CellIdentityWcdma cellIdentityWcdma = cellInfoWcdma.getCellIdentity(); cellLocOther.setLacAndCid(cellIdentityWcdma.getLac(), cellIdentityWcdma.getCid()); cellLocOther.setPsc(cellIdentityWcdma.getPsc()); if (DBG) log("getCellLocation(): X ret WCDMA info=" + cellLocOther); return cellLocOther; } else if ((ci instanceof CellInfoLte) && ((cellLocOther.getLac() < 0) || (cellLocOther.getCid() < 0))) { // We'll return the first good LTE info we get if there is no better answer CellInfoLte cellInfoLte = (CellInfoLte)ci; CellIdentityLte cellIdentityLte = cellInfoLte.getCellIdentity(); if ((cellIdentityLte.getTac() != Integer.MAX_VALUE) && (cellIdentityLte.getCi() != Integer.MAX_VALUE)) { cellLocOther.setLacAndCid(cellIdentityLte.getTac(), cellIdentityLte.getCi()); cellLocOther.setPsc(0); if (DBG) { log("getCellLocation(): possible LTE cellLocOther=" + cellLocOther); } } } } if (DBG) { log("getCellLocation(): X ret best answer cellLocOther=" + cellLocOther); } return cellLocOther; } else { if (DBG) { log("getCellLocation(): X empty mCellLoc and CellInfo mCellLoc=" + mCellLoc); } return mCellLoc; } } } /** * nitzReceiveTime is time_t that the NITZ time was posted */ Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +21 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.os.Handler; import android.os.Message; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.telephony.CellInfo; import android.telephony.ServiceState; import android.telephony.SignalStrength; Loading Loading @@ -58,8 +59,9 @@ public abstract class ServiceStateTracker extends Handler { public ServiceState mSS = new ServiceState(); protected ServiceState mNewSS = new ServiceState(); private static final long LAST_CELL_INFO_LIST_MAX_AGE_MS = 2000; protected long mLastCellInfoListTime; protected List<CellInfo> mLastCellInfoList = null; protected CellInfo mLastCellInfo = null; // This is final as subclasses alias to a more specific type // so we don't want the reference to change. Loading Loading @@ -388,6 +390,7 @@ public abstract class ServiceStateTracker extends Handler { + " list=" + result.list); } } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = result.list; result.lockObj.notify(); } Loading @@ -404,6 +407,7 @@ public abstract class ServiceStateTracker extends Handler { log("EVENT_UNSOL_CELL_INFO_LIST: size=" + list.size() + " list=" + list); } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = list; mPhoneBase.notifyCellInfo(list); } Loading Loading @@ -670,6 +674,8 @@ public abstract class ServiceStateTracker extends Handler { int ver = mCi.getRilVersion(); if (ver >= 8) { if (isCallerOnDifferentThread()) { if ((SystemClock.elapsedRealtime() - mLastCellInfoListTime) > LAST_CELL_INFO_LIST_MAX_AGE_MS) { Message msg = obtainMessage(EVENT_GET_CELL_INFO_LIST, result); synchronized(result.lockObj) { mCi.getCellInfoList(msg); Loading @@ -681,11 +687,15 @@ public abstract class ServiceStateTracker extends Handler { } } } else { log("SST.getAllCellInfo(): X return last, same thread probably RadioInfo"); if (DBG) log("SST.getAllCellInfo(): return last, back to back calls"); result.list = mLastCellInfoList; } } else { log("SST.getAllCellInfo(): X not implemented"); if (DBG) log("SST.getAllCellInfo(): return last, same thread can't block"); result.list = mLastCellInfoList; } } else { if (DBG) log("SST.getAllCellInfo(): not implemented"); result.list = null; } if (DBG) { Loading
src/java/com/android/internal/telephony/gsm/GSMPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -249,7 +249,7 @@ public class GSMPhone extends PhoneBase { @Override public CellLocation getCellLocation() { return mSST.mCellLoc; return mSST.getCellLocation(); } @Override Loading
src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +78 −0 Original line number Diff line number Diff line Loading @@ -37,7 +37,14 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.telephony.CellIdentityGsm; import android.telephony.CellIdentityLte; import android.telephony.CellIdentityWcdma; import android.telephony.CellInfo; import android.telephony.CellInfoGsm; import android.telephony.CellInfoLte; import android.telephony.CellInfoWcdma; import android.telephony.CellLocation; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SignalStrength; Loading Loading @@ -69,6 +76,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; /** Loading Loading @@ -1318,6 +1326,76 @@ final class GsmServiceStateTracker extends ServiceStateTracker { return (mSS.getRilVoiceRadioTechnology() >= ServiceState.RIL_RADIO_TECHNOLOGY_UMTS); } /** * @return the current cell location information. Prefer Gsm location * information if available otherwise return LTE location information */ public CellLocation getCellLocation() { if ((mCellLoc.getLac() >= 0) && (mCellLoc.getCid() >= 0)) { if (DBG) log("getCellLocation(): X good mCellLoc=" + mCellLoc); return mCellLoc; } else { List<CellInfo> result = getAllCellInfo(); if (result != null) { // A hack to allow tunneling of LTE information via GsmCellLocation // so that older Network Location Providers can return some information // on LTE only networks, see bug 9228974. // // We'll search the return CellInfo array preferring GSM/WCDMA // data, but if there is none we'll tunnel the first LTE information // in the list. // // The tunnel'd LTE information is returned as follows: // LAC = TAC field // CID = CI field // PSC = 0. GsmCellLocation cellLocOther = new GsmCellLocation(); for (CellInfo ci : result) { if (ci instanceof CellInfoGsm) { CellInfoGsm cellInfoGsm = (CellInfoGsm)ci; CellIdentityGsm cellIdentityGsm = cellInfoGsm.getCellIdentity(); cellLocOther.setLacAndCid(cellIdentityGsm.getLac(), cellIdentityGsm.getCid()); cellLocOther.setPsc(cellIdentityGsm.getPsc()); if (DBG) log("getCellLocation(): X ret GSM info=" + cellLocOther); return cellLocOther; } else if (ci instanceof CellInfoWcdma) { CellInfoWcdma cellInfoWcdma = (CellInfoWcdma)ci; CellIdentityWcdma cellIdentityWcdma = cellInfoWcdma.getCellIdentity(); cellLocOther.setLacAndCid(cellIdentityWcdma.getLac(), cellIdentityWcdma.getCid()); cellLocOther.setPsc(cellIdentityWcdma.getPsc()); if (DBG) log("getCellLocation(): X ret WCDMA info=" + cellLocOther); return cellLocOther; } else if ((ci instanceof CellInfoLte) && ((cellLocOther.getLac() < 0) || (cellLocOther.getCid() < 0))) { // We'll return the first good LTE info we get if there is no better answer CellInfoLte cellInfoLte = (CellInfoLte)ci; CellIdentityLte cellIdentityLte = cellInfoLte.getCellIdentity(); if ((cellIdentityLte.getTac() != Integer.MAX_VALUE) && (cellIdentityLte.getCi() != Integer.MAX_VALUE)) { cellLocOther.setLacAndCid(cellIdentityLte.getTac(), cellIdentityLte.getCi()); cellLocOther.setPsc(0); if (DBG) { log("getCellLocation(): possible LTE cellLocOther=" + cellLocOther); } } } } if (DBG) { log("getCellLocation(): X ret best answer cellLocOther=" + cellLocOther); } return cellLocOther; } else { if (DBG) { log("getCellLocation(): X empty mCellLoc and CellInfo mCellLoc=" + mCellLoc); } return mCellLoc; } } } /** * nitzReceiveTime is time_t that the NITZ time was posted */ Loading