diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java index bda8812934342..3728de278c8d8 100644 --- a/telephony/java/android/telephony/CellIdentity.java +++ b/telephony/java/android/telephony/CellIdentity.java @@ -109,6 +109,22 @@ public abstract class CellIdentity implements Parcelable { return mType; } + /** + * @return MCC or null for CDMA + * @hide + */ + public String getMccString() { + return mMccStr; + } + + /** + * @return MNC or null for CDMA + * @hide + */ + public String getMncString() { + return mMncStr; + } + /** * Returns the channel number of the cell identity. * diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java index fa198674c58ad..637f49dd665b9 100644 --- a/telephony/java/android/telephony/CellIdentityCdma.java +++ b/telephony/java/android/telephony/CellIdentityCdma.java @@ -109,6 +109,13 @@ public final class CellIdentityCdma extends CellIdentity { return new CellIdentityCdma(this); } + /** @hide */ + public CellIdentityCdma sanitizeLocationInfo() { + return new CellIdentityCdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + mAlphaLong, mAlphaShort); + } + /** * Take the latitude and longitude in 1/4 seconds and see if * the reported location is on Null Island. diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java index 9a24e47288c36..6c1048f78d288 100644 --- a/telephony/java/android/telephony/CellIdentityGsm.java +++ b/telephony/java/android/telephony/CellIdentityGsm.java @@ -97,6 +97,12 @@ public final class CellIdentityGsm extends CellIdentity { return new CellIdentityGsm(this); } + /** @hide */ + public CellIdentityGsm sanitizeLocationInfo() { + return new CellIdentityGsm(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + CellInfo.UNAVAILABLE, mMccStr, mMncStr, mAlphaLong, mAlphaShort); + } + /** * @return 3-digit Mobile Country Code, 0..999, * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable. diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java index 51393b90e61e5..824fbc5aebbc7 100644 --- a/telephony/java/android/telephony/CellIdentityLte.java +++ b/telephony/java/android/telephony/CellIdentityLte.java @@ -113,6 +113,13 @@ public final class CellIdentityLte extends CellIdentity { cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort); } + /** @hide */ + public CellIdentityLte sanitizeLocationInfo() { + return new CellIdentityLte(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + mMccStr, mMncStr, mAlphaLong, mAlphaShort); + } + CellIdentityLte copy() { return new CellIdentityLte(this); } diff --git a/telephony/java/android/telephony/CellIdentityNr.java b/telephony/java/android/telephony/CellIdentityNr.java index 771e7b9a80766..44896e297e3c7 100644 --- a/telephony/java/android/telephony/CellIdentityNr.java +++ b/telephony/java/android/telephony/CellIdentityNr.java @@ -46,7 +46,7 @@ public final class CellIdentityNr extends CellIdentity { * * @hide */ - public CellIdentityNr(int pci, int tac, int nrArfcn, String mccStr, String mncStr, + public CellIdentityNr(int pci, int tac, int nrArfcn, String mccStr, String mncStr, long nci, String alphal, String alphas) { super(TAG, CellInfo.TYPE_NR, mccStr, mncStr, alphal, alphas); mPci = pci; @@ -55,6 +55,12 @@ public final class CellIdentityNr extends CellIdentity { mNci = nci; } + /** @hide */ + public CellIdentityNr sanitizeLocationInfo() { + return new CellIdentityNr(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + mMccStr, mMncStr, CellInfo.UNAVAILABLE, mAlphaLong, mAlphaShort); + } + /** * @return a CellLocation object for this CellIdentity. * @hide diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java index 19b11b666018c..a591bd15f95f7 100644 --- a/telephony/java/android/telephony/CellIdentityTdscdma.java +++ b/telephony/java/android/telephony/CellIdentityTdscdma.java @@ -90,6 +90,12 @@ public final class CellIdentityTdscdma extends CellIdentity { cid.uarfcn, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort); } + /** @hide */ + public CellIdentityTdscdma sanitizeLocationInfo() { + return new CellIdentityTdscdma(mMccStr, mMncStr, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, mAlphaLong, mAlphaShort); + } + CellIdentityTdscdma copy() { return new CellIdentityTdscdma(this); } diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java index 6e0978434a577..3a1772f6068f6 100644 --- a/telephony/java/android/telephony/CellIdentityWcdma.java +++ b/telephony/java/android/telephony/CellIdentityWcdma.java @@ -91,6 +91,13 @@ public final class CellIdentityWcdma extends CellIdentity { cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort); } + /** @hide */ + public CellIdentityWcdma sanitizeLocationInfo() { + return new CellIdentityWcdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, mMccStr, mMncStr, + mAlphaLong, mAlphaShort); + } + CellIdentityWcdma copy() { return new CellIdentityWcdma(this); } diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java index cdaf6ed7c6aab..2142febc82ae4 100644 --- a/telephony/java/android/telephony/CellInfo.java +++ b/telephony/java/android/telephony/CellInfo.java @@ -197,6 +197,11 @@ public abstract class CellInfo implements Parcelable { @NonNull public abstract CellSignalStrength getCellSignalStrength(); + /** @hide */ + public CellInfo sanitizeLocationInfo() { + return null; + } + /** * Gets the connection status of this cell. * diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java index 359c8bee8b8d6..d9f44b83b0517 100644 --- a/telephony/java/android/telephony/CellInfoCdma.java +++ b/telephony/java/android/telephony/CellInfoCdma.java @@ -90,6 +90,15 @@ public final class CellInfoCdma extends CellInfo implements Parcelable { public CellSignalStrengthCdma getCellSignalStrength() { return mCellSignalStrengthCdma; } + + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + CellInfoCdma result = new CellInfoCdma(this); + result.mCellIdentityCdma = mCellIdentityCdma.sanitizeLocationInfo(); + return result; + } + /** @hide */ public void setCellSignalStrength(CellSignalStrengthCdma css) { mCellSignalStrengthCdma = css; diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java index dc2779f5fb2ab..1cecbc6e5bca9 100644 --- a/telephony/java/android/telephony/CellInfoGsm.java +++ b/telephony/java/android/telephony/CellInfoGsm.java @@ -84,6 +84,15 @@ public final class CellInfoGsm extends CellInfo implements Parcelable { public CellSignalStrengthGsm getCellSignalStrength() { return mCellSignalStrengthGsm; } + + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + CellInfoGsm result = new CellInfoGsm(this); + result.mCellIdentityGsm = mCellIdentityGsm.sanitizeLocationInfo(); + return result; + } + /** @hide */ public void setCellSignalStrength(CellSignalStrengthGsm css) { mCellSignalStrengthGsm = css; diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java index 0e9623dfab2b4..45f4b1d394634 100644 --- a/telephony/java/android/telephony/CellInfoLte.java +++ b/telephony/java/android/telephony/CellInfoLte.java @@ -96,6 +96,15 @@ public final class CellInfoLte extends CellInfo implements Parcelable { if (DBG) log("getCellSignalStrength: " + mCellSignalStrengthLte); return mCellSignalStrengthLte; } + + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + CellInfoLte result = new CellInfoLte(this); + result.mCellIdentityLte = mCellIdentityLte.sanitizeLocationInfo(); + return result; + } + /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public void setCellSignalStrength(CellSignalStrengthLte css) { diff --git a/telephony/java/android/telephony/CellInfoNr.java b/telephony/java/android/telephony/CellInfoNr.java index 7f7902c76095d..2a8b0673389c3 100644 --- a/telephony/java/android/telephony/CellInfoNr.java +++ b/telephony/java/android/telephony/CellInfoNr.java @@ -36,6 +36,13 @@ public final class CellInfoNr extends CellInfo { mCellSignalStrength = CellSignalStrengthNr.CREATOR.createFromParcel(in); } + private CellInfoNr(CellInfoNr other, boolean sanitizeLocationInfo) { + super(other); + mCellIdentity = sanitizeLocationInfo ? other.mCellIdentity.sanitizeLocationInfo() + : other.mCellIdentity; + mCellSignalStrength = other.mCellSignalStrength; + } + @Override @NonNull public CellIdentity getCellIdentity() { @@ -48,6 +55,12 @@ public final class CellInfoNr extends CellInfo { return mCellSignalStrength; } + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + return new CellInfoNr(this, true); + } + @Override public int hashCode() { return Objects.hash(super.hashCode(), mCellIdentity, mCellSignalStrength); diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java index 1830086ba448b..ccafda61a1773 100644 --- a/telephony/java/android/telephony/CellInfoTdscdma.java +++ b/telephony/java/android/telephony/CellInfoTdscdma.java @@ -90,6 +90,14 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable { return mCellSignalStrengthTdscdma; } + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + CellInfoTdscdma result = new CellInfoTdscdma(this); + result.mCellIdentityTdscdma = mCellIdentityTdscdma.sanitizeLocationInfo(); + return result; + } + /** @hide */ public void setCellSignalStrength(CellSignalStrengthTdscdma css) { mCellSignalStrengthTdscdma = css; diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java index fe06c78c3a913..81fc7bb3a1105 100644 --- a/telephony/java/android/telephony/CellInfoWcdma.java +++ b/telephony/java/android/telephony/CellInfoWcdma.java @@ -84,6 +84,15 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable { public CellSignalStrengthWcdma getCellSignalStrength() { return mCellSignalStrengthWcdma; } + + /** @hide */ + @Override + public CellInfo sanitizeLocationInfo() { + CellInfoWcdma result = new CellInfoWcdma(this); + result.mCellIdentityWcdma = mCellIdentityWcdma.sanitizeLocationInfo(); + return result; + } + /** @hide */ public void setCellSignalStrength(CellSignalStrengthWcdma css) { mCellSignalStrengthWcdma = css; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index e9cb6589c78c9..0de93bc080eb6 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -6864,6 +6864,17 @@ public class TelephonyManager { * app has carrier privileges (see {@link #hasCarrierPrivileges}) * and {@link android.Manifest.permission#ACCESS_FINE_LOCATION}. * + * If the system-wide location switch is off, apps may still call this API, with the + * following constraints: + *