diff options
| author | 2023-09-21 23:22:54 +0000 | |
|---|---|---|
| committer | 2023-10-16 22:55:28 +0000 | |
| commit | 847c88c716de9766633365cc45fcf6029f2c5a3d (patch) | |
| tree | 83d2a9f6e3b4b7556f326e3fa2a8196bc6928d68 | |
| parent | 7631cf0c9ad60a77b89c25f0b6d70e6f68bc0888 (diff) | |
new public API and AIDL to get and listen for signal strength changes.
Below public APIs are added
requestNtnSignalStrength()
registerForNtnSignalStrengthChanged()
unregisterForNtnSignalStrengthChanged()
Bug: 301511156
Test: SatelliteManagerTest, SatelliteControllerTest,
SatelliteManagerTestOnMockService
Change-Id: I08490bb8b7bc5bcd27eacc153750b957741670ac
13 files changed, 657 insertions, 1 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index c72d09d66494..4ff0028e7c83 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -16741,6 +16741,23 @@ package android.telephony.satellite { field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @NonNull public static final android.os.Parcelable.Creator<android.telephony.satellite.AntennaPosition> CREATOR; } + @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public final class NtnSignalStrength implements android.os.Parcelable { + ctor @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public NtnSignalStrength(@Nullable android.telephony.satellite.NtnSignalStrength); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public int describeContents(); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public int getLevel(); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public void writeToParcel(@NonNull android.os.Parcel, int); + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @NonNull public static final android.os.Parcelable.Creator<android.telephony.satellite.NtnSignalStrength> CREATOR; + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public static final int NTN_SIGNAL_STRENGTH_GOOD = 3; // 0x3 + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public static final int NTN_SIGNAL_STRENGTH_GREAT = 4; // 0x4 + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public static final int NTN_SIGNAL_STRENGTH_MODERATE = 2; // 0x2 + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public static final int NTN_SIGNAL_STRENGTH_NONE = 0; // 0x0 + field @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public static final int NTN_SIGNAL_STRENGTH_POOR = 1; // 0x1 + } + + @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public interface NtnSignalStrengthCallback { + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public void onNtnSignalStrengthChanged(@NonNull android.telephony.satellite.NtnSignalStrength); + } + @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public final class PointingInfo implements android.os.Parcelable { method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public int describeContents(); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public float getSatelliteAzimuthDegrees(); @@ -16776,6 +16793,7 @@ package android.telephony.satellite { method @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") @NonNull @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public java.util.Set<java.lang.Integer> getSatelliteAttachRestrictionReasonsForCarrier(int); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void pollPendingSatelliteDatagrams(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void provisionSatelliteService(@NonNull String, @NonNull byte[], @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public int registerForNtnSignalStrengthChanged(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.satellite.NtnSignalStrengthCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public int registerForSatelliteDatagram(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.satellite.SatelliteDatagramCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public int registerForSatelliteModemStateChanged(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.satellite.SatelliteStateCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public int registerForSatelliteProvisionStateChanged(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.satellite.SatelliteProvisionStateCallback); @@ -16786,6 +16804,7 @@ package android.telephony.satellite { method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestIsSatelliteEnabled(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestIsSatelliteProvisioned(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public void requestIsSatelliteSupported(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Boolean,android.telephony.satellite.SatelliteManager.SatelliteException>); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @NonNull @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestNtnSignalStrength(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.satellite.NtnSignalStrength,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteAttachEnabledForCarrier(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteCapabilities(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.satellite.SatelliteCapabilities,android.telephony.satellite.SatelliteManager.SatelliteException>); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void requestSatelliteEnabled(boolean, boolean, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); @@ -16794,6 +16813,7 @@ package android.telephony.satellite { method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void setDeviceAlignedWithSatellite(boolean); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void startSatelliteTransmissionUpdates(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>, @NonNull android.telephony.satellite.SatelliteTransmissionUpdateCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void stopSatelliteTransmissionUpdates(@NonNull android.telephony.satellite.SatelliteTransmissionUpdateCallback, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); + method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void unregisterForNtnSignalStrengthChanged(@NonNull android.telephony.satellite.NtnSignalStrengthCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void unregisterForSatelliteDatagram(@NonNull android.telephony.satellite.SatelliteDatagramCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void unregisterForSatelliteModemStateChanged(@NonNull android.telephony.satellite.SatelliteStateCallback); method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void unregisterForSatelliteProvisionStateChanged(@NonNull android.telephony.satellite.SatelliteProvisionStateCallback); diff --git a/telephony/java/android/telephony/satellite/INtnSignalStrengthCallback.aidl b/telephony/java/android/telephony/satellite/INtnSignalStrengthCallback.aidl new file mode 100644 index 000000000000..54cab48dd1e4 --- /dev/null +++ b/telephony/java/android/telephony/satellite/INtnSignalStrengthCallback.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2023 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.satellite; + +import android.telephony.satellite.NtnSignalStrength; + +/** + * Interface for non-terrestrial signal strength notify callback. + * @hide + */ +oneway interface INtnSignalStrengthCallback { + /** + * Called when NTN signal strength changes. + * @param ntnSignalStrength The new NTN signal strength. + */ + void onNtnSignalStrengthChanged(in NtnSignalStrength ntnSignalStrength); +} diff --git a/telephony/java/android/telephony/satellite/NtnSignalStrength.aidl b/telephony/java/android/telephony/satellite/NtnSignalStrength.aidl new file mode 100644 index 000000000000..a79cb695ef24 --- /dev/null +++ b/telephony/java/android/telephony/satellite/NtnSignalStrength.aidl @@ -0,0 +1,19 @@ +/* + * Copyright 2023, 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.satellite; + +parcelable NtnSignalStrength; diff --git a/telephony/java/android/telephony/satellite/NtnSignalStrength.java b/telephony/java/android/telephony/satellite/NtnSignalStrength.java new file mode 100644 index 000000000000..16d765455d21 --- /dev/null +++ b/telephony/java/android/telephony/satellite/NtnSignalStrength.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2023 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.satellite; + +import android.annotation.FlaggedApi; +import android.annotation.IntDef; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +import com.android.internal.telephony.flags.Flags; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * NTN signal strength related information. + * @hide + */ +@SystemApi +@FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) +public final class NtnSignalStrength implements Parcelable { + /** Non-terrestrial network signal strength is not available. */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public static final int NTN_SIGNAL_STRENGTH_NONE = 0; + /** Non-terrestrial network signal strength is poor. */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public static final int NTN_SIGNAL_STRENGTH_POOR = 1; + /** Non-terrestrial network signal strength is moderate. */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public static final int NTN_SIGNAL_STRENGTH_MODERATE = 2; + /** Non-terrestrial network signal strength is good. */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public static final int NTN_SIGNAL_STRENGTH_GOOD = 3; + /** Non-terrestrial network signal strength is great. */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public static final int NTN_SIGNAL_STRENGTH_GREAT = 4; + @NtnSignalStrengthLevel private int mLevel; + + /** @hide */ + @IntDef(prefix = "NTN_SIGNAL_STRENGTH_", value = { + NTN_SIGNAL_STRENGTH_NONE, + NTN_SIGNAL_STRENGTH_POOR, + NTN_SIGNAL_STRENGTH_MODERATE, + NTN_SIGNAL_STRENGTH_GOOD, + NTN_SIGNAL_STRENGTH_GREAT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface NtnSignalStrengthLevel {} + + /** + * Create a parcelable object to inform the current non-terrestrial signal strength + * @hide + */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public NtnSignalStrength(@NtnSignalStrengthLevel int level) { + this.mLevel = level; + } + + /** + * This constructor is used to create a copy of an existing NtnSignalStrength object. + */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public NtnSignalStrength(@Nullable NtnSignalStrength source) { + this.mLevel = (source == null) ? NTN_SIGNAL_STRENGTH_NONE : source.getLevel(); + } + + private NtnSignalStrength(Parcel in) { + readFromParcel(in); + } + + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + @NtnSignalStrengthLevel public int getLevel() { + return mLevel; + } + + /** + * @return 0 + */ + @Override + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public int describeContents() { + return 0; + } + + /** + * @param out The Parcel in which the object should be written. + * @param flags Additional flags about how the object should be written. + * May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}. + */ + @Override + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public void writeToParcel(@NonNull Parcel out, int flags) { + out.writeInt(mLevel); + } + + private void readFromParcel(Parcel in) { + mLevel = in.readInt(); + } + + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + @NonNull public static final Creator<NtnSignalStrength> CREATOR = + new Creator<NtnSignalStrength>() { + @Override public NtnSignalStrength createFromParcel(Parcel in) { + return new NtnSignalStrength(in); + } + + @Override public NtnSignalStrength[] newArray(int size) { + return new NtnSignalStrength[size]; + } + }; + + @Override + public int hashCode() { + return mLevel; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + + NtnSignalStrength that = (NtnSignalStrength) obj; + return mLevel == that.mLevel; + } + + @Override public String toString() { + return "NtnSignalStrength{" + + "mLevel=" + mLevel + + '}'; + } +} diff --git a/telephony/java/android/telephony/satellite/NtnSignalStrengthCallback.java b/telephony/java/android/telephony/satellite/NtnSignalStrengthCallback.java new file mode 100644 index 000000000000..4b79590b9bc6 --- /dev/null +++ b/telephony/java/android/telephony/satellite/NtnSignalStrengthCallback.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2023 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.satellite; + +import android.annotation.FlaggedApi; +import android.annotation.NonNull; +import android.annotation.SystemApi; + +import com.android.internal.telephony.flags.Flags; + +/** + * A callback class for notifying satellite signal strength change. + * + * @hide + */ +@SystemApi +@FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) +public interface NtnSignalStrengthCallback { + /** + * Called when non-terrestrial network signal strength changes. + * @param ntnSignalStrength The new non-terrestrial network signal strength. + */ + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + void onNtnSignalStrengthChanged(@NonNull NtnSignalStrength ntnSignalStrength); +} diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java index 7322aeb8bfca..21d93bd3077f 100644 --- a/telephony/java/android/telephony/satellite/SatelliteManager.java +++ b/telephony/java/android/telephony/satellite/SatelliteManager.java @@ -35,7 +35,9 @@ import android.os.OutcomeReceiver; import android.os.RemoteException; import android.os.ResultReceiver; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyCallback; import android.telephony.TelephonyFrameworkInitializer; +import android.telephony.TelephonyManager; import com.android.internal.telephony.IIntegerConsumer; import com.android.internal.telephony.ITelephony; @@ -77,6 +79,8 @@ public final class SatelliteManager { private static final ConcurrentHashMap<SatelliteTransmissionUpdateCallback, ISatelliteTransmissionUpdateCallback> sSatelliteTransmissionUpdateCallbackMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap<NtnSignalStrengthCallback, INtnSignalStrengthCallback> + sNtnSignalStrengthCallbackMap = new ConcurrentHashMap<>(); private final int mSubId; @@ -192,6 +196,14 @@ public final class SatelliteManager { public static final String KEY_SATELLITE_NEXT_VISIBILITY = "satellite_next_visibility"; /** + * Bundle key to get the response from + * {@link #requestNtnSignalStrength(Executor, OutcomeReceiver)}. + * @hide + */ + + public static final String KEY_NTN_SIGNAL_STRENGTH = "ntn_signal_strength"; + + /** * The request was successfully processed. */ @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @@ -1866,6 +1878,165 @@ public final class SatelliteManager { return new HashSet<>(); } + /** + * Request to get the signal strength of the satellite connection. + * + * <p> + * Note: This API is specifically designed for OEM enabled satellite connectivity only. + * For satellite connectivity enabled using carrier roaming, please refer to + * {@link android.telephony.TelephonyCallback.SignalStrengthsListener}, and + * {@link TelephonyManager#registerTelephonyCallback(Executor, TelephonyCallback)}. + * </p> + * + * @param executor The executor on which the callback will be called. + * @param callback The callback object to which the result will be delivered. If the request is + * successful, {@link OutcomeReceiver#onResult(Object)} will return an instance of + * {@link NtnSignalStrength} with a value of {@link NtnSignalStrength.NtnSignalStrengthLevel} + * The {@link NtnSignalStrength#NTN_SIGNAL_STRENGTH_NONE} will be returned if there is no + * signal strength data available. + * If the request is not successful, {@link OutcomeReceiver#onError(Throwable)} will return a + * {@link SatelliteException} with the {@link SatelliteResult}. + * + * @throws SecurityException if the caller doesn't have required permission. + * @throws IllegalStateException if the Telephony process is not currently available or + * satellite is not supported. + */ + @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + @NonNull + public void requestNtnSignalStrength(@NonNull @CallbackExecutor Executor executor, + @NonNull OutcomeReceiver<NtnSignalStrength, SatelliteException> callback) { + Objects.requireNonNull(executor); + Objects.requireNonNull(callback); + + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + ResultReceiver receiver = new ResultReceiver(null) { + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + if (resultCode == SATELLITE_RESULT_SUCCESS) { + if (resultData.containsKey(KEY_NTN_SIGNAL_STRENGTH)) { + NtnSignalStrength ntnSignalStrength = + resultData.getParcelable(KEY_NTN_SIGNAL_STRENGTH, + NtnSignalStrength.class); + executor.execute(() -> Binder.withCleanCallingIdentity(() -> + callback.onResult(ntnSignalStrength))); + } else { + loge("KEY_NTN_SIGNAL_STRENGTH does not exist."); + executor.execute(() -> Binder.withCleanCallingIdentity(() -> + callback.onError(new SatelliteException( + SATELLITE_RESULT_REQUEST_FAILED)))); + } + } else { + executor.execute(() -> Binder.withCleanCallingIdentity(() -> + callback.onError(new SatelliteException(resultCode)))); + } + } + }; + telephony.requestNtnSignalStrength(mSubId, receiver); + } else { + throw new IllegalStateException("Telephony service is null."); + } + } catch (RemoteException ex) { + loge("requestNtnSignalStrength() RemoteException: " + ex); + ex.rethrowFromSystemServer(); + } + } + + /** + * Registers for NTN signal strength changed from satellite modem. + * + * <p> + * Note: This API is specifically designed for OEM enabled satellite connectivity only. + * For satellite connectivity enabled using carrier roaming, please refer to + * {@link android.telephony.TelephonyCallback.SignalStrengthsListener}, and + * {@link TelephonyManager#registerTelephonyCallback(Executor, TelephonyCallback)}. + * </p> + * + * @param executor The executor on which the callback will be called. + * @param callback The callback to handle the NTN signal strength changed event. + * + * @return The {@link SatelliteResult} result of the operation. + * + * @throws SecurityException if the caller doesn't have required permission. + * @throws IllegalStateException if the Telephony process is not currently available. + */ + @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + @SatelliteResult public int registerForNtnSignalStrengthChanged( + @NonNull @CallbackExecutor Executor executor, + @NonNull NtnSignalStrengthCallback callback) { + Objects.requireNonNull(executor); + Objects.requireNonNull(callback); + + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + INtnSignalStrengthCallback internalCallback = + new INtnSignalStrengthCallback.Stub() { + @Override + public void onNtnSignalStrengthChanged( + NtnSignalStrength ntnSignalStrength) { + executor.execute(() -> Binder.withCleanCallingIdentity( + () -> callback.onNtnSignalStrengthChanged( + ntnSignalStrength))); + } + }; + sNtnSignalStrengthCallbackMap.put(callback, internalCallback); + return telephony.registerForNtnSignalStrengthChanged(mSubId, internalCallback); + } else { + throw new IllegalStateException("Telephony service is null."); + } + } catch (RemoteException ex) { + loge("registerForNtnSignalStrengthChanged() RemoteException: " + ex); + ex.rethrowFromSystemServer(); + } + return SATELLITE_RESULT_REQUEST_FAILED; + } + + /** + * Unregisters for NTN signal strength changed from satellite modem. + * If callback was not registered before, the request will be ignored. + * + * <p> + * Note: This API is specifically designed for OEM enabled satellite connectivity only. + * For satellite connectivity enabled using carrier roaming, please refer to + * {@link TelephonyManager#unregisterTelephonyCallback(TelephonyCallback)}.. + * </p> + * + * @param callback The callback that was passed to + * {@link #registerForNtnSignalStrengthChanged(Executor, NtnSignalStrengthCallback)}. + * + * @throws SecurityException if the caller doesn't have required permission. + * @throws IllegalStateException if the Telephony process is not currently available. + */ + @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) + @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) + public void unregisterForNtnSignalStrengthChanged(@NonNull NtnSignalStrengthCallback callback) { + Objects.requireNonNull(callback); + INtnSignalStrengthCallback internalCallback = + sNtnSignalStrengthCallbackMap.remove(callback); + + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + if (internalCallback != null) { + telephony.unregisterForNtnSignalStrengthChanged(mSubId, internalCallback); + } else { + loge("unregisterForNtnSignalStrengthChanged: No internal callback."); + } + } else { + throw new IllegalStateException("Telephony service is null."); + } + } catch (RemoteException ex) { + loge("unregisterForNtnSignalStrengthChanged() RemoteException: " + ex); + ex.rethrowFromSystemServer(); + } + + } + + private static ITelephony getITelephony() { ITelephony binder = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer .getTelephonyServiceManager() diff --git a/telephony/java/android/telephony/satellite/stub/INtnSignalStrengthConsumer.aidl b/telephony/java/android/telephony/satellite/stub/INtnSignalStrengthConsumer.aidl new file mode 100644 index 000000000000..b7712bd83cf6 --- /dev/null +++ b/telephony/java/android/telephony/satellite/stub/INtnSignalStrengthConsumer.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2023 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.satellite.stub; + +import android.telephony.satellite.NtnSignalStrength; + +/** + * Consumer pattern for a request that receives the signal strength of non-terrestrial network from + * the SatelliteService. + * @hide + */ +oneway interface INtnSignalStrengthConsumer { + void accept(in NtnSignalStrength result); +} diff --git a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl index 7fda550c599c..6b47db1e2251 100644 --- a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl +++ b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl @@ -16,6 +16,7 @@ package android.telephony.satellite.stub; +import android.telephony.satellite.stub.INtnSignalStrengthConsumer; import android.telephony.satellite.stub.ISatelliteCapabilitiesConsumer; import android.telephony.satellite.stub.ISatelliteListener; import android.telephony.satellite.stub.SatelliteDatagram; @@ -454,4 +455,44 @@ oneway interface ISatellite { */ void requestIsSatelliteEnabledForCarrier(int simSlot, in IIntegerConsumer resultCallback, in IBooleanConsumer callback); + + /** + * Request to get the signal strength of the satellite connection. + * + * @param resultCallback The {@link SatelliteError} result of the operation. + * @param callback The callback to handle the NTN signal strength changed event. + */ + void requestSignalStrength(in IIntegerConsumer resultCallback, + in INtnSignalStrengthConsumer callback); + + /** + * The satellite service should report the NTN signal strength via + * ISatelliteListener#onNtnSignalStrengthChanged when the NTN signal strength changes. + * + * @param resultCallback The callback to receive the error code result of the operation. + * + * Valid result codes returned: + * SatelliteResult:SATELLITE_RESULT_SUCCESS + * SatelliteResult:SATELLITE_RESULT_SERVICE_ERROR + * SatelliteResult:SATELLITE_RESULT_INVALID_MODEM_STATE + * SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE + * SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED + */ + void startSendingNtnSignalStrength(in IIntegerConsumer resultCallback); + + /** + * The satellite service should stop reporting NTN signal strength to the framework. This will + * be called when device is screen off to save power by not letting signal strength updates to + * wake up application processor. + * + * @param resultCallback The callback to receive the error code result of the operation. + * + * Valid result codes returned: + * SatelliteResult:SATELLITE_RESULT_SUCCESS + * SatelliteResult:SATELLITE_RESULT_SERVICE_ERROR + * SatelliteResult:SATELLITE_RESULT_INVALID_MODEM_STATE + * SatelliteResult:SATELLITE_RESULT_RADIO_NOT_AVAILABLE + * SatelliteResult:SATELLITE_RESULT_REQUEST_NOT_SUPPORTED + */ + void stopSendingNtnSignalStrength(in IIntegerConsumer resultCallback); } diff --git a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl index d68716291b8e..d44ddfa1ee7f 100644 --- a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl +++ b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl @@ -16,6 +16,7 @@ package android.telephony.satellite.stub; +import android.telephony.satellite.stub.NtnSignalStrength; import android.telephony.satellite.stub.NTRadioTechnology; import android.telephony.satellite.stub.PointingInfo; import android.telephony.satellite.stub.SatelliteDatagram; @@ -58,4 +59,10 @@ oneway interface ISatelliteListener { * @param state The current satellite modem state. */ void onSatelliteModemStateChanged(in SatelliteModemState state); + + /** + * Called when NTN signal strength changes. + * @param ntnSignalStrength The new NTN signal strength. + */ + void onNtnSignalStrengthChanged(in NtnSignalStrength ntnSignalStrength); } diff --git a/telephony/java/android/telephony/satellite/stub/NtnSignalStrength.aidl b/telephony/java/android/telephony/satellite/stub/NtnSignalStrength.aidl new file mode 100644 index 000000000000..f48900583167 --- /dev/null +++ b/telephony/java/android/telephony/satellite/stub/NtnSignalStrength.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2023 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.satellite.stub; + +import android.telephony.satellite.stub.NtnSignalStrengthLevel; + +/** + * @hide + */ +parcelable NtnSignalStrength { + /** + * Non-terrestrial signal strength. The value represents the level of signal strength which can + * be translated to the number of signal bars. + */ + NtnSignalStrengthLevel signalStrengthLevel; +} diff --git a/telephony/java/android/telephony/satellite/stub/NtnSignalStrengthLevel.aidl b/telephony/java/android/telephony/satellite/stub/NtnSignalStrengthLevel.aidl new file mode 100644 index 000000000000..53b13733941c --- /dev/null +++ b/telephony/java/android/telephony/satellite/stub/NtnSignalStrengthLevel.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 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.satellite.stub; + +/** + * {@hide} + */ +@Backing(type="int") +enum NtnSignalStrengthLevel { + NTN_SIGNAL_STRENGTH_NONE = 0, + NTN_SIGNAL_STRENGTH_POOR = 1, + NTN_SIGNAL_STRENGTH_MODERATE = 2, + NTN_SIGNAL_STRENGTH_GOOD = 3, + NTN_SIGNAL_STRENGTH_GREAT = 4 +} diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java index 4cee01e8bd39..a636a6128e61 100644 --- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java +++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java @@ -241,6 +241,30 @@ public class SatelliteImplBase extends SatelliteService { "requestIsSatelliteEnabledForCarrier"); } + @Override + public void requestSignalStrength(IIntegerConsumer resultCallback, + INtnSignalStrengthConsumer callback) throws RemoteException { + executeMethodAsync( + () -> SatelliteImplBase.this.requestSignalStrength(resultCallback, callback), + "requestSignalStrength"); + } + + @Override + public void startSendingNtnSignalStrength(IIntegerConsumer resultCallback) + throws RemoteException { + executeMethodAsync( + () -> SatelliteImplBase.this.startSendingNtnSignalStrength(resultCallback), + "startSendingNtnSignalStrength"); + } + + @Override + public void stopSendingNtnSignalStrength(IIntegerConsumer resultCallback) + throws RemoteException { + executeMethodAsync( + () -> SatelliteImplBase.this.stopSendingNtnSignalStrength(resultCallback), + "stopSendingNtnSignalStrength"); + } + // Call the methods with a clean calling identity on the executor and wait indefinitely for // the future to return. private void executeMethodAsync(Runnable r, String errorLogName) throws RemoteException { @@ -728,4 +752,35 @@ public class SatelliteImplBase extends SatelliteService { @NonNull IIntegerConsumer resultCallback, @NonNull IBooleanConsumer callback) { // stub implementation } + + /** + * Request to get the signal strength of the satellite connection. + * + * @param resultCallback The {@link SatelliteError} result of the operation. + * @param callback The callback to handle the NTN signal strength changed event. + */ + public void requestSignalStrength(@NonNull IIntegerConsumer resultCallback, + INtnSignalStrengthConsumer callback) { + // stub implementation + } + + /** + * Requests to deliver signal strength changed events through the + * {@link ISatelliteListener#onNtnSignalStrengthChanged(NtnSignalStrength ntnSignalStrength)} + * callback. + * + * @param resultCallback The {@link SatelliteError} result of the operation. + */ + public void startSendingNtnSignalStrength(@NonNull IIntegerConsumer resultCallback) { + // stub implementation + } + + /** + * Requests to stop signal strength changed events + * + * @param resultCallback The {@link SatelliteError} result of the operation. + */ + public void stopSendingNtnSignalStrength(@NonNull IIntegerConsumer resultCallback){ + // stub implementation + } } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 3aa5a5a14bc8..58e702688bd3 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -67,10 +67,12 @@ import android.telephony.ims.aidl.IImsRcsFeature; import android.telephony.ims.aidl.IImsRegistration; import android.telephony.ims.aidl.IImsRegistrationCallback; import android.telephony.ims.aidl.IRcsConfigCallback; +import android.telephony.satellite.INtnSignalStrengthCallback; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteTransmissionUpdateCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; import android.telephony.satellite.ISatelliteStateCallback; +import android.telephony.satellite.NtnSignalStrength; import android.telephony.satellite.SatelliteCapabilities; import android.telephony.satellite.SatelliteDatagram; import com.android.ims.internal.IImsServiceFeatureCallback; @@ -2837,7 +2839,6 @@ interface ITelephony { + "android.Manifest.permission.SATELLITE_COMMUNICATION)") void deprovisionSatelliteService(int subId, in String token, in IIntegerConsumer callback); - /** * Registers for provision state changed from satellite modem. * @@ -3071,4 +3072,40 @@ interface ITelephony { @JavaPassthrough(annotation="@android.annotation.RequiresPermission(" + "android.Manifest.permission.SATELLITE_COMMUNICATION)") int[] getSatelliteAttachRestrictionReasonsForCarrier(int subId); + + /** + * Request to get the signal strength of the satellite connection. + * + * @param subId The subId of the subscription to request for. + * @param receiver Result receiver to get the error code of the request and the current signal + * strength of the satellite connection. + */ + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(" + + "android.Manifest.permission.SATELLITE_COMMUNICATION)") + void requestNtnSignalStrength(int subId, in ResultReceiver receiver); + + /** + * Registers for NTN signal strength changed from satellite modem. + * + * @param subId The subId of the subscription to request for. + * @param callback The callback to handle the NTN signal strength changed event. + * + * @return The {@link SatelliteResult} result of the operation. + */ + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(" + + "android.Manifest.permission.SATELLITE_COMMUNICATION)") + int registerForNtnSignalStrengthChanged(int subId, in INtnSignalStrengthCallback callback); + + /** + * Unregisters for NTN signal strength changed from satellite modem. + * If callback was not registered before, the request will be ignored. + * + * @param subId The subId of the subscription to unregister for provision state changed. + * @param callback The callback that was passed to + * {@link #registerForNtnSignalStrengthChanged(Executor, NtnSignalStrengthCallback)}. + */ + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(" + + "android.Manifest.permission.SATELLITE_COMMUNICATION)") + void unregisterForNtnSignalStrengthChanged(int subId, + in INtnSignalStrengthCallback callback); } |