Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdaf3afb authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "satellite-state-change-listener" into main

* changes:
  Add READ_BASIC_PHONE_STATE permission to Shell for CTS
  Implements satellite state change listener APIs
  Introduce satellite state change listener APIs
  Expose SatelliteManager as public manager class
parents 848bcb0e 14a8d903
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -10949,6 +10949,7 @@ package android.content {
    field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
    field public static final String RESTRICTIONS_SERVICE = "restrictions";
    field public static final String ROLE_SERVICE = "role";
    field @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") public static final String SATELLITE_SERVICE = "satellite";
    field public static final String SEARCH_SERVICE = "search";
    field @FlaggedApi("android.os.security_state_service") public static final String SECURITY_STATE_SERVICE = "security_state";
    field public static final String SENSOR_SERVICE = "sensor";
@@ -47866,6 +47867,19 @@ package android.telephony.mbms {
}
package android.telephony.satellite {
  @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") public final class SatelliteManager {
    method @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") @RequiresPermission(anyOf={android.Manifest.permission.READ_BASIC_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE, "carrier privileges"}) public void registerStateChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.satellite.SatelliteStateChangeListener);
    method @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") @RequiresPermission(anyOf={android.Manifest.permission.READ_BASIC_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE, "carrier privileges"}) public void unregisterStateChangeListener(@NonNull android.telephony.satellite.SatelliteStateChangeListener);
  }
  @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") public interface SatelliteStateChangeListener {
    method public void onEnabledStateChanged(boolean);
  }
}
package android.text {
  @Deprecated public class AlteredCharSequence implements java.lang.CharSequence android.text.GetChars {
+1 −1
Original line number Diff line number Diff line
@@ -18253,7 +18253,7 @@ package android.telephony.satellite {
    method @FlaggedApi("com.android.internal.telephony.flags.oem_enabled_satellite_flag") public void onSatelliteDatagramReceived(long, @NonNull android.telephony.satellite.SatelliteDatagram, int, @NonNull java.util.function.Consumer<java.lang.Void>);
  }
  public final class SatelliteManager {
  @FlaggedApi("com.android.internal.telephony.flags.satellite_state_change_listener") public final class SatelliteManager {
    method @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") @RequiresPermission(android.Manifest.permission.SATELLITE_COMMUNICATION) public void addAttachRestrictionForCarrier(int, int, @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 deprovisionService(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    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> getAttachRestrictionReasonsForCarrier(int);
+1 −1
Original line number Diff line number Diff line
@@ -6677,8 +6677,8 @@ public abstract class Context {
     *
     * @see #getSystemService(String)
     * @see android.telephony.satellite.SatelliteManager
     * @hide
     */
    @FlaggedApi(com.android.internal.telephony.flags.Flags.FLAG_SATELLITE_STATE_CHANGE_LISTENER)
    public static final String SATELLITE_SERVICE = "satellite";

    /**
+109 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsCallSession;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.MediaQualityStatus;
import android.telephony.satellite.SatelliteStateChangeListener;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;

@@ -55,12 +57,14 @@ import com.android.internal.listeners.ListenerExecutor;
import com.android.internal.telephony.ICarrierConfigChangeListener;
import com.android.internal.telephony.ICarrierPrivilegesCallback;
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
import com.android.internal.telephony.ISatelliteStateChangeListener;
import com.android.internal.telephony.ITelephonyRegistry;
import com.android.server.telecom.flags.Flags;

import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.WeakHashMap;
@@ -1482,6 +1486,111 @@ public class TelephonyRegistryManager {
                pkgName, attributionTag, callback, new int[0], notifyNow);
    }

    @NonNull
    @GuardedBy("sSatelliteStateChangeListeners")
    private static final Map<SatelliteStateChangeListener,
                WeakReference<SatelliteStateChangeListenerWrapper>>
            sSatelliteStateChangeListeners = new ArrayMap<>();

    /**
     * Register a {@link SatelliteStateChangeListener} to receive notification when Satellite state
     * has changed.
     *
     * @param executor The {@link Executor} where the {@code listener} will be invoked
     * @param listener The listener to monitor the satellite state change
     * @hide
     */
    public void addSatelliteStateChangeListener(@NonNull @CallbackExecutor Executor executor,
            @NonNull SatelliteStateChangeListener listener) {
        if (listener == null || executor == null) {
            throw new IllegalArgumentException("Listener and executor must be non-null");
        }

        synchronized (sSatelliteStateChangeListeners) {
            WeakReference<SatelliteStateChangeListenerWrapper> existing =
                    sSatelliteStateChangeListeners.get(listener);
            if (existing != null && existing.get() != null) {
                Log.d(TAG, "addSatelliteStateChangeListener: listener already registered");
                return;
            }
            SatelliteStateChangeListenerWrapper wrapper =
                    new SatelliteStateChangeListenerWrapper(executor, listener);
            try {
                sRegistry.addSatelliteStateChangeListener(
                        wrapper,
                        mContext.getOpPackageName(),
                        mContext.getAttributionTag());
                sSatelliteStateChangeListeners.put(listener, new WeakReference<>(wrapper));
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

    /**
     * Unregister a {@link SatelliteStateChangeListener} to stop receiving notification when
     * satellite state has changed.
     *
     * @param listener The listener previously registered with addSatelliteStateChangeListener.
     * @hide
     */
    public void removeSatelliteStateChangeListener(@NonNull SatelliteStateChangeListener listener) {
        if (listener == null) {
            throw new IllegalArgumentException("listener must be non-null");
        }

        synchronized (sSatelliteStateChangeListeners) {
            WeakReference<SatelliteStateChangeListenerWrapper> ref =
                    sSatelliteStateChangeListeners.get(listener);
            if (ref == null) return;
            SatelliteStateChangeListenerWrapper wrapper = ref.get();
            if (wrapper == null) return;
            try {
                sRegistry.removeSatelliteStateChangeListener(wrapper, mContext.getOpPackageName());
                sSatelliteStateChangeListeners.remove(listener);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

    /**
     * Notify the registrants that the satellite state has changed.
     *
     * @param isEnabled True if the satellite modem is enabled, false otherwise
     * @hide
     */
    public void notifySatelliteStateChanged(boolean isEnabled) {
        try {
            sRegistry.notifySatelliteStateChanged(isEnabled);
        } catch (RemoteException ex) {
            // system process is dead
            throw ex.rethrowFromSystemServer();
        }
    }

    private static class SatelliteStateChangeListenerWrapper extends
            ISatelliteStateChangeListener.Stub implements ListenerExecutor {
        @NonNull private final WeakReference<SatelliteStateChangeListener> mListener;
        @NonNull private final Executor mExecutor;

        SatelliteStateChangeListenerWrapper(@NonNull Executor executor,
                @NonNull SatelliteStateChangeListener listener) {
            mExecutor = executor;
            mListener = new WeakReference<>(listener);
        }

        @Override
        public void onSatelliteEnabledStateChanged(boolean isEnabled) {
            Binder.withCleanCallingIdentity(
                    () ->
                            executeSafely(
                                    mExecutor,
                                    mListener::get,
                                    sscl -> sscl.onEnabledStateChanged(isEnabled)));
        }
    }

    private static class CarrierPrivilegesCallbackWrapper extends ICarrierPrivilegesCallback.Stub
            implements ListenerExecutor {
        @NonNull private final WeakReference<CarrierPrivilegesCallback> mCallback;
+21 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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 com.android.internal.telephony;

oneway interface ISatelliteStateChangeListener {
    void onSatelliteEnabledStateChanged(boolean isEnabled);
}
 No newline at end of file
Loading