Merge "Add API to support async network scans."
am: 625d5a9dd9
Change-Id: Iac369e26f707e59095ae7a89bfb11324e12634dc
This commit is contained in:
83
telephony/java/android/telephony/NetworkScan.java
Normal file
83
telephony/java/android/telephony/NetworkScan.java
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 android.telephony;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.internal.telephony.ITelephony;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows applications to request the system to perform a network scan.
|
||||||
|
*
|
||||||
|
* The caller of {@link #requestNetworkScan(NetworkScanRequest, NetworkScanCallback)} will
|
||||||
|
* receive a NetworkScan which contains the callback method to stop the scan requested.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class NetworkScan {
|
||||||
|
|
||||||
|
public static final String TAG = "NetworkScan";
|
||||||
|
|
||||||
|
public static final int SUCCESS = 0;
|
||||||
|
public static final int ERROR_INVALID_SCAN = 1;
|
||||||
|
public static final int ERROR_UNSUPPORTED = 2;
|
||||||
|
public static final int ERROR_INTERRUPTED = 3;
|
||||||
|
public static final int ERROR_CANCELLED = 4;
|
||||||
|
|
||||||
|
private final int mScanId;
|
||||||
|
private final int mSubId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the network scan
|
||||||
|
*
|
||||||
|
* This is the callback method to stop an ongoing scan. When user requests a new scan,
|
||||||
|
* a NetworkScan object will be returned, and the user can stop the scan by calling this
|
||||||
|
* method.
|
||||||
|
*/
|
||||||
|
public void stop() throws RemoteException {
|
||||||
|
try {
|
||||||
|
ITelephony telephony = getITelephony();
|
||||||
|
if (telephony != null) {
|
||||||
|
telephony.stopNetworkScan(mSubId, mScanId);
|
||||||
|
} else {
|
||||||
|
throw new RemoteException("Failed to get the ITelephony instance.");
|
||||||
|
}
|
||||||
|
} catch (RemoteException ex) {
|
||||||
|
Rlog.e(TAG, "stopNetworkScan RemoteException", ex);
|
||||||
|
throw new RemoteException("Failed to stop the network scan with id " + mScanId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NetworkScan with scanId
|
||||||
|
*
|
||||||
|
* @param scanId The id of the scan
|
||||||
|
* @param subId the id of the subscription
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public NetworkScan(int scanId, int subId) {
|
||||||
|
mScanId = scanId;
|
||||||
|
mSubId = subId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ITelephony getITelephony() {
|
||||||
|
return ITelephony.Stub.asInterface(
|
||||||
|
ServiceManager.getService(Context.TELEPHONY_SERVICE));
|
||||||
|
}
|
||||||
|
}
|
||||||
19
telephony/java/android/telephony/NetworkScanRequest.aidl
Normal file
19
telephony/java/android/telephony/NetworkScanRequest.aidl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, 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 android.telephony;
|
||||||
|
|
||||||
|
parcelable NetworkScanRequest;
|
||||||
115
telephony/java/android/telephony/NetworkScanRequest.java
Normal file
115
telephony/java/android/telephony/NetworkScanRequest.java
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 android.telephony;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines a request to peform a network scan.
|
||||||
|
*
|
||||||
|
* This class defines whether the network scan will be performed only once or periodically until
|
||||||
|
* cancelled, when the scan is performed periodically, the time interval is not controlled by the
|
||||||
|
* user but defined by the modem vendor.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class NetworkScanRequest implements Parcelable {
|
||||||
|
|
||||||
|
/** Performs the scan only once */
|
||||||
|
public static final int SCAN_TYPE_ONE_SHOT = 0;
|
||||||
|
/**
|
||||||
|
* Performs the scan periodically until cancelled
|
||||||
|
*
|
||||||
|
* The modem will start new scans periodically, and the interval between two scans is usually
|
||||||
|
* multiple minutes.
|
||||||
|
* */
|
||||||
|
public static final int SCAN_TYPE_PERIODIC = 1;
|
||||||
|
|
||||||
|
/** Defines the type of the scan. */
|
||||||
|
public int scanType;
|
||||||
|
|
||||||
|
/** Describes the radio access technologies with bands or channels that need to be scanned. */
|
||||||
|
public RadioAccessSpecifier[] specifiers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NetworkScanRequest with scanType and network specifiers
|
||||||
|
*
|
||||||
|
* @param scanType The type of the scan
|
||||||
|
* @param specifiers the radio network with bands / channels to be scanned
|
||||||
|
*/
|
||||||
|
public NetworkScanRequest(int scanType, RadioAccessSpecifier[] specifiers) {
|
||||||
|
this.scanType = scanType;
|
||||||
|
this.specifiers = specifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(scanType);
|
||||||
|
dest.writeParcelableArray(specifiers, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
private NetworkScanRequest(Parcel in) {
|
||||||
|
scanType = in.readInt();
|
||||||
|
specifiers = (RadioAccessSpecifier[]) in.readParcelableArray(
|
||||||
|
Object.class.getClassLoader(),
|
||||||
|
RadioAccessSpecifier.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals (Object o) {
|
||||||
|
NetworkScanRequest nsr;
|
||||||
|
|
||||||
|
try {
|
||||||
|
nsr = (NetworkScanRequest) o;
|
||||||
|
} catch (ClassCastException ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (scanType == nsr.scanType
|
||||||
|
&& Arrays.equals(specifiers, nsr.specifiers));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode () {
|
||||||
|
return ((scanType * 31)
|
||||||
|
+ (Arrays.hashCode(specifiers)) * 37);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<NetworkScanRequest> CREATOR =
|
||||||
|
new Creator<NetworkScanRequest>() {
|
||||||
|
@Override
|
||||||
|
public NetworkScanRequest createFromParcel(Parcel in) {
|
||||||
|
return new NetworkScanRequest(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NetworkScanRequest[] newArray(int size) {
|
||||||
|
return new NetworkScanRequest[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
19
telephony/java/android/telephony/RadioAccessSpecifier.aidl
Normal file
19
telephony/java/android/telephony/RadioAccessSpecifier.aidl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, 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 android.telephony;
|
||||||
|
|
||||||
|
parcelable RadioAccessSpecifier;
|
||||||
129
telephony/java/android/telephony/RadioAccessSpecifier.java
Normal file
129
telephony/java/android/telephony/RadioAccessSpecifier.java
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 android.telephony;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes a particular radio access network to be scanned.
|
||||||
|
*
|
||||||
|
* The scan can be performed on either bands or channels for a specific radio access network type.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class RadioAccessSpecifier implements Parcelable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The radio access network that needs to be scanned
|
||||||
|
*
|
||||||
|
* See {@link RadioNetworkConstants.RadioAccessNetworks} for details.
|
||||||
|
*/
|
||||||
|
public int radioAccessNetwork;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The frequency bands that need to be scanned
|
||||||
|
*
|
||||||
|
* bands must be used together with radioAccessNetwork
|
||||||
|
*
|
||||||
|
* See {@link RadioNetworkConstants} for details.
|
||||||
|
*/
|
||||||
|
public int[] bands;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The frequency channels that need to be scanned
|
||||||
|
*
|
||||||
|
* channels must be used together with radioAccessNetwork
|
||||||
|
*
|
||||||
|
* See {@link RadioNetworkConstants.RadioAccessNetworks} for details.
|
||||||
|
*/
|
||||||
|
public int[] channels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new RadioAccessSpecifier with radio network, bands and channels
|
||||||
|
*
|
||||||
|
* The user must specify the radio network type, and at least specify either of frequency
|
||||||
|
* bands or channels.
|
||||||
|
*
|
||||||
|
* @param ran The type of the radio access network
|
||||||
|
* @param bands the frequency bands to be scanned
|
||||||
|
* @param channels the frequency bands to be scanned
|
||||||
|
*/
|
||||||
|
public RadioAccessSpecifier(int ran, int[] bands, int[] channels) {
|
||||||
|
this.radioAccessNetwork = ran;
|
||||||
|
this.bands = bands;
|
||||||
|
this.channels = channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Parcelable.Creator<RadioAccessSpecifier> CREATOR =
|
||||||
|
new Parcelable.Creator<RadioAccessSpecifier> (){
|
||||||
|
@Override
|
||||||
|
public RadioAccessSpecifier createFromParcel(Parcel in) {
|
||||||
|
return new RadioAccessSpecifier(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RadioAccessSpecifier[] newArray(int size) {
|
||||||
|
return new RadioAccessSpecifier[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(radioAccessNetwork);
|
||||||
|
dest.writeIntArray(bands);
|
||||||
|
dest.writeIntArray(channels);
|
||||||
|
}
|
||||||
|
|
||||||
|
private RadioAccessSpecifier(Parcel in) {
|
||||||
|
radioAccessNetwork = in.readInt();
|
||||||
|
bands = in.createIntArray();
|
||||||
|
channels = in.createIntArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals (Object o) {
|
||||||
|
RadioAccessSpecifier ras;
|
||||||
|
|
||||||
|
try {
|
||||||
|
ras = (RadioAccessSpecifier) o;
|
||||||
|
} catch (ClassCastException ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (radioAccessNetwork == ras.radioAccessNetwork
|
||||||
|
&& Arrays.equals(bands, ras.bands)
|
||||||
|
&& Arrays.equals(channels, ras.channels));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode () {
|
||||||
|
return ((radioAccessNetwork * 31)
|
||||||
|
+ (Arrays.hashCode(bands) * 37)
|
||||||
|
+ (Arrays.hashCode(channels)) * 39);
|
||||||
|
}
|
||||||
|
}
|
||||||
169
telephony/java/android/telephony/RadioNetworkConstants.java
Normal file
169
telephony/java/android/telephony/RadioNetworkConstants.java
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 android.telephony;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains radio access network related constants.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class RadioNetworkConstants {
|
||||||
|
|
||||||
|
public static final class RadioAccessNetworks {
|
||||||
|
public static final int GERAN = 1;
|
||||||
|
public static final int UTRAN = 2;
|
||||||
|
public static final int EUTRAN = 3;
|
||||||
|
/** @hide */
|
||||||
|
public static final int CDMA2000 = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frenquency bands for GERAN.
|
||||||
|
* http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/14.00.00_60/ts_145005v140000p.pdf
|
||||||
|
*/
|
||||||
|
public static final class GeranBands {
|
||||||
|
public static final int BAND_T380 = 1;
|
||||||
|
public static final int BAND_T410 = 2;
|
||||||
|
public static final int BAND_450 = 3;
|
||||||
|
public static final int BAND_480 = 4;
|
||||||
|
public static final int BAND_710 = 5;
|
||||||
|
public static final int BAND_750 = 6;
|
||||||
|
public static final int BAND_T810 = 7;
|
||||||
|
public static final int BAND_850 = 8;
|
||||||
|
public static final int BAND_P900 = 9;
|
||||||
|
public static final int BAND_E900 = 10;
|
||||||
|
public static final int BAND_R900 = 11;
|
||||||
|
public static final int BAND_DCS1800 = 12;
|
||||||
|
public static final int BAND_PCS1900 = 13;
|
||||||
|
public static final int BAND_ER900 = 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frenquency bands for UTRAN.
|
||||||
|
* http://www.etsi.org/deliver/etsi_ts/125100_125199/125104/13.03.00_60/ts_125104v130p.pdf
|
||||||
|
*/
|
||||||
|
public static final class UtranBands {
|
||||||
|
public static final int BAND_1 = 1;
|
||||||
|
public static final int BAND_2 = 2;
|
||||||
|
public static final int BAND_3 = 3;
|
||||||
|
public static final int BAND_4 = 4;
|
||||||
|
public static final int BAND_5 = 5;
|
||||||
|
public static final int BAND_6 = 6;
|
||||||
|
public static final int BAND_7 = 7;
|
||||||
|
public static final int BAND_8 = 8;
|
||||||
|
public static final int BAND_9 = 9;
|
||||||
|
public static final int BAND_10 = 10;
|
||||||
|
public static final int BAND_11 = 11;
|
||||||
|
public static final int BAND_12 = 12;
|
||||||
|
public static final int BAND_13 = 13;
|
||||||
|
public static final int BAND_14 = 14;
|
||||||
|
/** band 15, 16, 17, 18 are reserved */
|
||||||
|
public static final int BAND_19 = 19;
|
||||||
|
public static final int BAND_20 = 20;
|
||||||
|
public static final int BAND_21 = 21;
|
||||||
|
public static final int BAND_22 = 22;
|
||||||
|
/** band 23, 24 are reserved */
|
||||||
|
public static final int BAND_25 = 25;
|
||||||
|
public static final int BAND_26 = 26;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frenquency bands for EUTRAN.
|
||||||
|
* http://www.etsi.org/deliver/etsi_ts/136100_136199/136101/14.03.00_60/ts_136101v140p.pdf
|
||||||
|
*/
|
||||||
|
public static final class EutranBands {
|
||||||
|
public static final int BAND_1 = 1;
|
||||||
|
public static final int BAND_2 = 2;
|
||||||
|
public static final int BAND_3 = 3;
|
||||||
|
public static final int BAND_4 = 4;
|
||||||
|
public static final int BAND_5 = 5;
|
||||||
|
public static final int BAND_6 = 6;
|
||||||
|
public static final int BAND_7 = 7;
|
||||||
|
public static final int BAND_8 = 8;
|
||||||
|
public static final int BAND_9 = 9;
|
||||||
|
public static final int BAND_10 = 10;
|
||||||
|
public static final int BAND_11 = 11;
|
||||||
|
public static final int BAND_12 = 12;
|
||||||
|
public static final int BAND_13 = 13;
|
||||||
|
public static final int BAND_14 = 14;
|
||||||
|
public static final int BAND_17 = 17;
|
||||||
|
public static final int BAND_18 = 18;
|
||||||
|
public static final int BAND_19 = 19;
|
||||||
|
public static final int BAND_20 = 20;
|
||||||
|
public static final int BAND_21 = 21;
|
||||||
|
public static final int BAND_22 = 22;
|
||||||
|
public static final int BAND_23 = 23;
|
||||||
|
public static final int BAND_24 = 24;
|
||||||
|
public static final int BAND_25 = 25;
|
||||||
|
public static final int BAND_26 = 26;
|
||||||
|
public static final int BAND_27 = 27;
|
||||||
|
public static final int BAND_28 = 28;
|
||||||
|
public static final int BAND_30 = 30;
|
||||||
|
public static final int BAND_31 = 31;
|
||||||
|
public static final int BAND_33 = 33;
|
||||||
|
public static final int BAND_34 = 34;
|
||||||
|
public static final int BAND_35 = 35;
|
||||||
|
public static final int BAND_36 = 36;
|
||||||
|
public static final int BAND_37 = 37;
|
||||||
|
public static final int BAND_38 = 38;
|
||||||
|
public static final int BAND_39 = 39;
|
||||||
|
public static final int BAND_40 = 40;
|
||||||
|
public static final int BAND_41 = 41;
|
||||||
|
public static final int BAND_42 = 42;
|
||||||
|
public static final int BAND_43 = 43;
|
||||||
|
public static final int BAND_44 = 44;
|
||||||
|
public static final int BAND_45 = 45;
|
||||||
|
public static final int BAND_46 = 46;
|
||||||
|
public static final int BAND_47 = 47;
|
||||||
|
public static final int BAND_48 = 48;
|
||||||
|
public static final int BAND_65 = 65;
|
||||||
|
public static final int BAND_66 = 66;
|
||||||
|
public static final int BAND_68 = 68;
|
||||||
|
public static final int BAND_70 = 70;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frenquency bands for CDMA2000.
|
||||||
|
* http://www.3gpp2.org/Public_html/Specs/C.S0057-E_v1.0_Bandclass_Specification.pdf
|
||||||
|
* @hide
|
||||||
|
*
|
||||||
|
* TODO(yinxu): Check with the nexus team about the definition of CDMA bands.
|
||||||
|
*/
|
||||||
|
public static final class CdmaBands {
|
||||||
|
public static final int BAND_0 = 1;
|
||||||
|
public static final int BAND_1 = 2;
|
||||||
|
public static final int BAND_2 = 3;
|
||||||
|
public static final int BAND_3 = 4;
|
||||||
|
public static final int BAND_4 = 5;
|
||||||
|
public static final int BAND_5 = 6;
|
||||||
|
public static final int BAND_6 = 7;
|
||||||
|
public static final int BAND_7 = 8;
|
||||||
|
public static final int BAND_8 = 9;
|
||||||
|
public static final int BAND_9 = 10;
|
||||||
|
public static final int BAND_10 = 11;
|
||||||
|
public static final int BAND_11 = 12;
|
||||||
|
public static final int BAND_12 = 13;
|
||||||
|
public static final int BAND_13 = 14;
|
||||||
|
public static final int BAND_14 = 15;
|
||||||
|
public static final int BAND_15 = 16;
|
||||||
|
public static final int BAND_16 = 17;
|
||||||
|
public static final int BAND_17 = 18;
|
||||||
|
public static final int BAND_18 = 19;
|
||||||
|
public static final int BAND_19 = 20;
|
||||||
|
public static final int BAND_20 = 21;
|
||||||
|
public static final int BAND_21 = 22;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,6 +39,11 @@ import android.provider.Settings;
|
|||||||
import android.provider.Settings.SettingNotFoundException;
|
import android.provider.Settings.SettingNotFoundException;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerThread;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.os.Messenger;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.os.PersistableBundle;
|
import android.os.PersistableBundle;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ResultReceiver;
|
import android.os.ResultReceiver;
|
||||||
@@ -144,6 +149,7 @@ public class TelephonyManager {
|
|||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final int mSubId;
|
private final int mSubId;
|
||||||
private SubscriptionManager mSubscriptionManager;
|
private SubscriptionManager mSubscriptionManager;
|
||||||
|
private TelephonyScanManager mTelephonyScanManager;
|
||||||
|
|
||||||
private static String multiSimConfig =
|
private static String multiSimConfig =
|
||||||
SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG);
|
SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG);
|
||||||
@@ -4572,6 +4578,32 @@ public class TelephonyManager {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request a network scan.
|
||||||
|
*
|
||||||
|
* This method is asynchronous, so the network scan results will be returned by callback.
|
||||||
|
* The returned NetworkScan will contain a callback method which can be used to stop the scan.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Requires Permission:
|
||||||
|
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
|
||||||
|
* Or the calling app has carrier privileges. @see #hasCarrierPrivileges
|
||||||
|
*
|
||||||
|
* @param request Contains all the RAT with bands/channels that need to be scanned.
|
||||||
|
* @param callback Returns network scan results or errors.
|
||||||
|
* @return A NetworkScan obj which contains a callback which can stop the scan.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public NetworkScan requestNetworkScan(
|
||||||
|
NetworkScanRequest request, TelephonyScanManager.NetworkScanCallback callback) {
|
||||||
|
synchronized (this) {
|
||||||
|
if (mTelephonyScanManager == null) {
|
||||||
|
mTelephonyScanManager = new TelephonyScanManager();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mTelephonyScanManager.requestNetworkScan(getSubId(), request, callback);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ask the radio to connect to the input network and change selection mode to manual.
|
* Ask the radio to connect to the input network and change selection mode to manual.
|
||||||
*
|
*
|
||||||
|
|||||||
186
telephony/java/android/telephony/TelephonyScanManager.java
Normal file
186
telephony/java/android/telephony/TelephonyScanManager.java
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 android.telephony;
|
||||||
|
|
||||||
|
import static com.android.internal.util.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerThread;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.os.Messenger;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.SparseArray;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.android.internal.telephony.ITelephony;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manages the radio access network scan requests and callbacks.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class TelephonyScanManager {
|
||||||
|
|
||||||
|
private static final String TAG = "TelephonyScanManager";
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
|
public static final int CALLBACK_SCAN_RESULTS = 1;
|
||||||
|
/** @hide */
|
||||||
|
public static final int CALLBACK_SCAN_ERROR = 2;
|
||||||
|
/** @hide */
|
||||||
|
public static final int CALLBACK_SCAN_COMPLETE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The caller of {@link #requestNetworkScan(NetworkScanRequest, NetworkScanCallback)} should
|
||||||
|
* implement and provide this callback so that the scan results or errors can be returned.
|
||||||
|
*/
|
||||||
|
public static abstract class NetworkScanCallback {
|
||||||
|
/** Returns the scan results to the user, this callback will be called multiple times. */
|
||||||
|
public void onResults(List<CellInfo> results) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Informs the user that the scan has stopped.
|
||||||
|
*
|
||||||
|
* This callback will be called when the scan is finished or cancelled by the user.
|
||||||
|
* The related NetworkScanRequest will be deleted after this callback.
|
||||||
|
*/
|
||||||
|
public void onComplete() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Informs the user that there is some error about the scan.
|
||||||
|
*
|
||||||
|
* This callback will be called whenever there is any error about the scan, but the scan
|
||||||
|
* won't stop unless the onComplete() callback is called.
|
||||||
|
*/
|
||||||
|
public void onError(int error) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NetworkScanInfo {
|
||||||
|
private final NetworkScanRequest mRequest;
|
||||||
|
private final NetworkScanCallback mCallback;
|
||||||
|
|
||||||
|
NetworkScanInfo(NetworkScanRequest request, NetworkScanCallback callback) {
|
||||||
|
mRequest = request;
|
||||||
|
mCallback = callback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Looper mLooper;
|
||||||
|
private final Messenger mMessenger;
|
||||||
|
private SparseArray<NetworkScanInfo> mScanInfo = new SparseArray<NetworkScanInfo>();
|
||||||
|
|
||||||
|
public TelephonyScanManager() {
|
||||||
|
HandlerThread thread = new HandlerThread(TAG);
|
||||||
|
thread.start();
|
||||||
|
mLooper = thread.getLooper();
|
||||||
|
mMessenger = new Messenger(new Handler(mLooper) {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message message) {
|
||||||
|
checkNotNull(message, "message cannot be null");
|
||||||
|
NetworkScanInfo nsi;
|
||||||
|
synchronized (mScanInfo) {
|
||||||
|
nsi = mScanInfo.get(message.arg2);
|
||||||
|
}
|
||||||
|
if (nsi == null) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Failed to find NetworkScanInfo with id " + message.arg2);
|
||||||
|
}
|
||||||
|
NetworkScanCallback callback = nsi.mCallback;
|
||||||
|
if (callback == null) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Failed to find NetworkScanCallback with id " + message.arg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (message.what) {
|
||||||
|
case CALLBACK_SCAN_RESULTS:
|
||||||
|
try {
|
||||||
|
callback.onResults((List<CellInfo>) message.obj);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Rlog.e(TAG, "Exception in networkscan callback onResults", e);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CALLBACK_SCAN_ERROR:
|
||||||
|
try {
|
||||||
|
callback.onError(message.arg1);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Rlog.e(TAG, "Exception in networkscan callback onError", e);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CALLBACK_SCAN_COMPLETE:
|
||||||
|
try {
|
||||||
|
callback.onComplete();
|
||||||
|
mScanInfo.remove(message.arg2);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Rlog.e(TAG, "Exception in networkscan callback onComplete", e);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Rlog.e(TAG, "Unhandled message " + Integer.toHexString(message.what));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request a network scan.
|
||||||
|
*
|
||||||
|
* This method is asynchronous, so the network scan results will be returned by callback.
|
||||||
|
* The returned NetworkScan will contain a callback method which can be used to stop the scan.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Requires Permission:
|
||||||
|
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
|
||||||
|
* Or the calling app has carrier privileges. @see #hasCarrierPrivileges
|
||||||
|
*
|
||||||
|
* @param request Contains all the RAT with bands/channels that need to be scanned.
|
||||||
|
* @param callback Returns network scan results or errors.
|
||||||
|
* @return A NetworkScan obj which contains a callback which can stop the scan.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public NetworkScan requestNetworkScan(int subId,
|
||||||
|
NetworkScanRequest request, NetworkScanCallback callback) {
|
||||||
|
try {
|
||||||
|
ITelephony telephony = getITelephony();
|
||||||
|
if (telephony != null) {
|
||||||
|
int scanId = telephony.requestNetworkScan(subId, request, mMessenger, new Binder());
|
||||||
|
saveScanInfo(scanId, request, callback);
|
||||||
|
return new NetworkScan(scanId, subId);
|
||||||
|
}
|
||||||
|
} catch (RemoteException ex) {
|
||||||
|
Rlog.e(TAG, "requestNetworkScan RemoteException", ex);
|
||||||
|
} catch (NullPointerException ex) {
|
||||||
|
Rlog.e(TAG, "requestNetworkScan NPE", ex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveScanInfo(int id, NetworkScanRequest request, NetworkScanCallback callback) {
|
||||||
|
synchronized (mScanInfo) {
|
||||||
|
mScanInfo.put(id, new NetworkScanInfo(request, callback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ITelephony getITelephony() {
|
||||||
|
return ITelephony.Stub.asInterface(
|
||||||
|
ServiceManager.getService(Context.TELEPHONY_SERVICE));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,8 @@ package com.android.internal.telephony;
|
|||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.os.Messenger;
|
||||||
import android.os.ResultReceiver;
|
import android.os.ResultReceiver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.service.carrier.CarrierIdentifier;
|
import android.service.carrier.CarrierIdentifier;
|
||||||
@@ -29,6 +31,7 @@ import android.telephony.ClientRequestStats;
|
|||||||
import android.telephony.IccOpenLogicalChannelResponse;
|
import android.telephony.IccOpenLogicalChannelResponse;
|
||||||
import android.telephony.ModemActivityInfo;
|
import android.telephony.ModemActivityInfo;
|
||||||
import android.telephony.NeighboringCellInfo;
|
import android.telephony.NeighboringCellInfo;
|
||||||
|
import android.telephony.NetworkScanRequest;
|
||||||
import android.telephony.RadioAccessFamily;
|
import android.telephony.RadioAccessFamily;
|
||||||
import android.telephony.ServiceState;
|
import android.telephony.ServiceState;
|
||||||
import android.telephony.SignalStrength;
|
import android.telephony.SignalStrength;
|
||||||
@@ -794,6 +797,26 @@ interface ITelephony {
|
|||||||
*/
|
*/
|
||||||
CellNetworkScanResult getCellNetworkScanResults(int subId);
|
CellNetworkScanResult getCellNetworkScanResults(int subId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a radio network scan and return the id of this scan.
|
||||||
|
*
|
||||||
|
* @param subId the id of the subscription.
|
||||||
|
* @param request Defines all the configs for network scan.
|
||||||
|
* @param messenger Callback messages will be sent using this messenger.
|
||||||
|
* @param binder the binder object instantiated in TelephonyManager.
|
||||||
|
* @return An id for this scan.
|
||||||
|
*/
|
||||||
|
int requestNetworkScan(int subId, in NetworkScanRequest request, in Messenger messenger,
|
||||||
|
in IBinder binder);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop an existing radio network scan.
|
||||||
|
*
|
||||||
|
* @param subId the id of the subscription.
|
||||||
|
* @param scanId The id of the scan that is going to be stopped.
|
||||||
|
*/
|
||||||
|
void stopNetworkScan(int subId, int scanId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ask the radio to connect to the input network and change selection mode to manual.
|
* Ask the radio to connect to the input network and change selection mode to manual.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user