summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp1
-rwxr-xr-xapi/current.txt6
-rw-r--r--api/system-current.txt1
-rw-r--r--telephony/java/android/telephony/ICellInfoCallback.aidl30
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java145
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl19
6 files changed, 173 insertions, 29 deletions
diff --git a/Android.bp b/Android.bp
index abeeb4395015..3095ca5d0052 100644
--- a/Android.bp
+++ b/Android.bp
@@ -536,6 +536,7 @@ java_defaults {
"telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl",
"telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl",
"telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl",
+ "telephony/java/android/telephony/ICellInfoCallback.aidl",
"telephony/java/android/telephony/INetworkService.aidl",
"telephony/java/android/telephony/INetworkServiceCallback.aidl",
"telephony/java/com/android/ims/internal/IImsCallSession.aidl",
diff --git a/api/current.txt b/api/current.txt
index 42758c87ade5..b458fac0067c 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -43730,6 +43730,7 @@ package android.telephony {
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
+ method public void requestCellInfoUpdate(java.util.concurrent.Executor, android.telephony.TelephonyManager.CellInfoCallback);
method public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
method public void sendDialerSpecialCode(java.lang.String);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
@@ -43832,6 +43833,11 @@ package android.telephony {
field public static final java.lang.String VVM_TYPE_OMTP = "vvm_type_omtp";
}
+ public static abstract class TelephonyManager.CellInfoCallback {
+ ctor public TelephonyManager.CellInfoCallback();
+ method public abstract void onCellInfo(java.util.List<android.telephony.CellInfo>);
+ }
+
public static abstract class TelephonyManager.UssdResponseCallback {
ctor public TelephonyManager.UssdResponseCallback();
method public void onReceiveUssdResponse(android.telephony.TelephonyManager, java.lang.String, java.lang.CharSequence);
diff --git a/api/system-current.txt b/api/system-current.txt
index 4524e752a1bd..6d3abe9813d1 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5697,6 +5697,7 @@ package android.telephony {
method public deprecated boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
method public boolean needsOtaServiceProvisioning();
method public boolean rebootRadio();
+ method public void requestCellInfoUpdate(android.os.WorkSource, java.util.concurrent.Executor, android.telephony.TelephonyManager.CellInfoCallback);
method public boolean resetRadioConfig();
method public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
method public void setCarrierDataEnabled(boolean);
diff --git a/telephony/java/android/telephony/ICellInfoCallback.aidl b/telephony/java/android/telephony/ICellInfoCallback.aidl
new file mode 100644
index 000000000000..7fb62682703a
--- /dev/null
+++ b/telephony/java/android/telephony/ICellInfoCallback.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 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.telephony.CellInfo;
+
+import java.util.List;
+
+/**
+ * Callback to provide asynchronous CellInfo.
+ * @hide
+ */
+oneway interface ICellInfoCallback
+{
+ void onCellInfo(in List<CellInfo> state);
+}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index c6e8d81612e4..d72b5ecd9da8 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -21,6 +21,7 @@ import static android.content.Context.TELECOM_SERVICE;
import static com.android.internal.util.Preconditions.checkNotNull;
import android.Manifest;
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -43,6 +44,7 @@ import android.net.NetworkStats;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.BatteryStats;
+import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -52,6 +54,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.SystemProperties;
+import android.os.WorkSource;
import android.provider.Settings.SettingNotFoundException;
import android.service.carrier.CarrierIdentifier;
import android.telecom.PhoneAccount;
@@ -4750,37 +4753,42 @@ public class TelephonyManager {
}
/**
- * Returns all observed cell information from all radios on the
- * device including the primary and neighboring cells. Calling this method does
- * not trigger a call to {@link android.telephony.PhoneStateListener#onCellInfoChanged
- * onCellInfoChanged()}, or change the rate at which
- * {@link android.telephony.PhoneStateListener#onCellInfoChanged
- * onCellInfoChanged()} is called.
+ * Requests all available cell information from all radios on the device including the
+ * camped/registered, serving, and neighboring cells.
*
- *<p>
- * The list can include one or more {@link android.telephony.CellInfoGsm CellInfoGsm},
+ * <p>The response can include one or more {@link android.telephony.CellInfoGsm CellInfoGsm},
* {@link android.telephony.CellInfoCdma CellInfoCdma},
+ * {@link android.telephony.CellInfoTdscdma CellInfoTdscdma},
* {@link android.telephony.CellInfoLte CellInfoLte}, and
* {@link android.telephony.CellInfoWcdma CellInfoWcdma} objects, in any combination.
- * On devices with multiple radios it is typical to see instances of
- * one or more of any these in the list. In addition, zero, one, or more
- * of the returned objects may be considered registered; that is, their
+ * It is typical to see instances of one or more of any these in the list. In addition, zero
+ * or more of the returned objects may be considered registered; that is, their
* {@link android.telephony.CellInfo#isRegistered CellInfo.isRegistered()}
- * methods may return true.
- *
- * <p>This method returns valid data for registered cells on devices with
- * {@link android.content.pm.PackageManager#FEATURE_TELEPHONY}. In cases where only
- * partial information is available for a particular CellInfo entry, unavailable fields
- * will be reported as Integer.MAX_VALUE. All reported cells will include at least a
- * valid set of technology-specific identification info and a power level measurement.
- *
- *<p>
- * This method is preferred over using {@link
+ * methods may return true, indicating that the cell is being used or would be used for
+ * signaling communication if necessary.
+ *
+ * <p>Beginning with {@link android.os.Build.VERSION_CODES#Q Android Q},
+ * if this API results in a change of the cached CellInfo, that change will be reported via
+ * {@link android.telephony.PhoneStateListener#onCellInfoChanged onCellInfoChanged()}.
+ *
+ * <p>Apps targeting {@link android.os.Build.VERSION_CODES#Q Android Q} or higher will no
+ * longer trigger a refresh of the cached CellInfo by invoking this API. Instead, those apps
+ * will receive the latest cached results. Apps targeting
+ * {@link android.os.Build.VERSION_CODES#Q Android Q} or higher that wish to request updated
+ * CellInfo should call
+ * {android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()} and
+ * listen for responses via {@link android.telephony.PhoneStateListener#onCellInfoChanged
+ * onCellInfoChanged()}.
+ *
+ * <p>This method returns valid data for devices with
+ * {@link android.content.pm.PackageManager#FEATURE_TELEPHONY FEATURE_TELEPHONY}. In cases
+ * where only partial information is available for a particular CellInfo entry, unavailable
+ * fields will be reported as {@link android.telephony.CellInfo#UNAVAILABLE}. All reported
+ * cells will include at least a valid set of technology-specific identification info and a
+ * power level measurement.
+ *
+ * <p>This method is preferred over using {@link
* android.telephony.TelephonyManager#getCellLocation getCellLocation()}.
- * However, for older devices, <code>getAllCellInfo()</code> may return
- * null. In these cases, you should call {@link
- * android.telephony.TelephonyManager#getCellLocation getCellLocation()}
- * instead.
*
* @return List of {@link android.telephony.CellInfo}; null if cell
* information is unavailable.
@@ -4791,11 +4799,92 @@ public class TelephonyManager {
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- return telephony.getAllCellInfo(getOpPackageName());
+ return telephony.getAllCellInfo(
+ getOpPackageName());
} catch (RemoteException ex) {
- return null;
} catch (NullPointerException ex) {
- return null;
+ }
+ return null;
+ }
+
+ /** Callback for providing asynchronous {@link CellInfo} on request */
+ public abstract static class CellInfoCallback {
+ /**
+ * Response to
+ * {@link android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()}.
+ *
+ * <p>Invoked when there is a response to
+ * {@link android.telephony.TelephonyManager#requestCellInfoUpdate requestCellInfoUpdate()}
+ * to provide a list of {@link CellInfo}. If no {@link CellInfo} is available then an empty
+ * list will be provided. If an error occurs, null will be provided.
+ *
+ * @param cellInfo a list of {@link CellInfo}, an empty list, or null.
+ *
+ * {@see android.telephony.TelephonyManager#getAllCellInfo getAllCellInfo()}
+ */
+ public abstract void onCellInfo(List<CellInfo> cellInfo);
+ };
+
+ /**
+ * Requests all available cell information from the current subscription for observed
+ * camped/registered, serving, and neighboring cells.
+ *
+ * <p>Any available results from this request will be provided by calls to
+ * {@link android.telephony.PhoneStateListener#onCellInfoChanged onCellInfoChanged()}
+ * for each active subscription.
+ *
+ * @param executor the executor on which callback will be invoked.
+ * @param callback a callback to receive CellInfo.
+ */
+ @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+ public void requestCellInfoUpdate(
+ @NonNull Executor executor, @NonNull CellInfoCallback callback) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) return;
+ telephony.requestCellInfoUpdate(
+ getSubId(),
+ new ICellInfoCallback.Stub() {
+ public void onCellInfo(List<CellInfo> cellInfo) {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> callback.onCellInfo(cellInfo)));
+ }
+ }, getOpPackageName());
+
+ } catch (RemoteException ex) {
+ }
+ }
+
+ /**
+ * Requests all available cell information from the current subscription for observed
+ * camped/registered, serving, and neighboring cells.
+ *
+ * <p>Any available results from this request will be provided by calls to
+ * {@link android.telephony.PhoneStateListener#onCellInfoChanged onCellInfoChanged()}
+ * for each active subscription.
+ *
+ * @param workSource the requestor to whom the power consumption for this should be attributed.
+ * @param executor the executor on which callback will be invoked.
+ * @param callback a callback to receive CellInfo.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(allOf = {android.Manifest.permission.ACCESS_COARSE_LOCATION,
+ android.Manifest.permission.MODIFY_PHONE_STATE})
+ public void requestCellInfoUpdate(@NonNull WorkSource workSource,
+ @NonNull @CallbackExecutor Executor executor, @NonNull CellInfoCallback callback) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) return;
+ telephony.requestCellInfoUpdateWithWorkSource(
+ getSubId(),
+ new ICellInfoCallback.Stub() {
+ public void onCellInfo(List<CellInfo> cellInfo) {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> callback.onCellInfo(cellInfo)));
+ }
+ }, getOpPackageName(), workSource);
+ } catch (RemoteException ex) {
}
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 85a9cf57ed4b..f0e858692ffe 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -22,6 +22,7 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.Messenger;
import android.os.ResultReceiver;
+import android.os.WorkSource;
import android.net.NetworkStats;
import android.net.Uri;
import android.service.carrier.CarrierIdentifier;
@@ -30,6 +31,7 @@ import android.telecom.PhoneAccountHandle;
import android.telephony.CellInfo;
import android.telephony.ClientRequestStats;
import android.telephony.IccOpenLogicalChannelResponse;
+import android.telephony.ICellInfoCallback;
import android.telephony.ModemActivityInfo;
import android.telephony.NeighboringCellInfo;
import android.telephony.NetworkScanRequest;
@@ -507,11 +509,26 @@ interface ITelephony {
int getLteOnCdmaModeForSubscriber(int subId, String callingPackage);
/**
- * Returns the all observed cell information of the device.
+ * Returns all observed cell information of the device.
*/
List<CellInfo> getAllCellInfo(String callingPkg);
/**
+ * Request a cell information update for the specified subscription,
+ * reported via the CellInfoCallback.
+ */
+ void requestCellInfoUpdate(int subId, in ICellInfoCallback cb, String callingPkg);
+
+ /**
+ * Request a cell information update for the specified subscription,
+ * reported via the CellInfoCallback.
+ *
+ * @param workSource the requestor to whom the power consumption for this should be attributed.
+ */
+ void requestCellInfoUpdateWithWorkSource(
+ int subId, in ICellInfoCallback cb, in String callingPkg, in WorkSource ws);
+
+ /**
* Sets minimum time in milli-seconds between onCellInfoChanged
*/
void setCellInfoListRate(int rateInMillis);