Allow requestNetworkScan to return sanitized info
If an app doesn't have location permissions or if the system location switch is off, allow requestNetworkScan to still function, but sanitize the returned CellInfo objects first and disallow certain input arguments Bug: 126779616 Test: CTS Change-Id: Ic9c44043bd30d402f128bf0723f2b0bf6c420e3e
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -6869,6 +6869,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:
|
||||
* <ol>
|
||||
* <li>The app must hold the {@code android.permission.NETWORK_SCAN} permission.</li>
|
||||
* <li>The app must not supply any specific bands or channels to scan.</li>
|
||||
* <li>The app must only specify MCC/MNC pairs that are
|
||||
* associated to a SIM in the device.</li>
|
||||
* <li>Returned results will have no meaningful info other than signal strength
|
||||
* and MCC/MNC info.</li>
|
||||
* </ol>
|
||||
*
|
||||
* @param request Contains all the RAT with bands/channels that need to be scanned.
|
||||
* @param executor The executor through which the callback should be invoked. Since the scan
|
||||
* request may trigger multiple callbacks and they must be invoked in the same order as
|
||||
|
||||
@@ -53,6 +53,11 @@ public final class TelephonyScanManager {
|
||||
public static final int CALLBACK_SCAN_ERROR = 2;
|
||||
/** @hide */
|
||||
public static final int CALLBACK_SCAN_COMPLETE = 3;
|
||||
/** @hide */
|
||||
public static final int CALLBACK_RESTRICTED_SCAN_RESULTS = 4;
|
||||
|
||||
/** @hide */
|
||||
public static final int INVALID_SCAN_ID = -1;
|
||||
|
||||
/**
|
||||
* The caller of
|
||||
@@ -129,6 +134,7 @@ public final class TelephonyScanManager {
|
||||
}
|
||||
|
||||
switch (message.what) {
|
||||
case CALLBACK_RESTRICTED_SCAN_RESULTS:
|
||||
case CALLBACK_SCAN_RESULTS:
|
||||
try {
|
||||
final Bundle b = message.getData();
|
||||
@@ -137,9 +143,9 @@ public final class TelephonyScanManager {
|
||||
for (int i = 0; i < parcelables.length; i++) {
|
||||
ci[i] = (CellInfo) parcelables[i];
|
||||
}
|
||||
executor.execute(() ->{
|
||||
executor.execute(() -> {
|
||||
Rlog.d(TAG, "onResults: " + ci.toString());
|
||||
callback.onResults((List<CellInfo>) Arrays.asList(ci));
|
||||
callback.onResults(Arrays.asList(ci));
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Rlog.e(TAG, "Exception in networkscan callback onResults", e);
|
||||
@@ -200,6 +206,10 @@ public final class TelephonyScanManager {
|
||||
if (telephony != null) {
|
||||
int scanId = telephony.requestNetworkScan(
|
||||
subId, request, mMessenger, new Binder(), callingPackage);
|
||||
if (scanId == INVALID_SCAN_ID) {
|
||||
Rlog.e(TAG, "Failed to initiate network scan");
|
||||
return null;
|
||||
}
|
||||
saveScanInfo(scanId, request, executor, callback);
|
||||
return new NetworkScan(scanId, subId);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user