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

Commit 3921877a authored by Thomas Nguyen's avatar Thomas Nguyen Committed by Android (Google) Code Review
Browse files

Merge "Handle provisioning APIs when they are not supported by vendor service" into main

parents 3cb9b30c 334a812d
Loading
Loading
Loading
Loading
+152 −39
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SAT
import static android.telephony.satellite.SatelliteManager.KEY_NTN_SIGNAL_STRENGTH;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;

import android.annotation.ArrayRes;
@@ -38,6 +39,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.wifi.WifiManager;
@@ -125,6 +127,10 @@ public class SatelliteController extends Handler {
    public static final int SATELLITE_MODE_ENABLED_FALSE = 0;
    public static final int INVALID_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE = -1;

    /** Key used to read/write OEM-enabled satellite provision status in shared preferences. */
    private static final String OEM_ENABLED_SATELLITE_PROVISION_STATUS_KEY =
            "oem_enabled_satellite_provision_status_key";

    /** Message codes used in handleMessage() */
    //TODO: Move the Commands and events related to position updates to PointingAppController
    private static final int CMD_START_SATELLITE_TRANSMISSION_UPDATES = 1;
@@ -248,9 +254,11 @@ public class SatelliteController extends Handler {
    @GuardedBy("mIsSatelliteEnabledLock")
    private Boolean mIsSatelliteEnabled = null;
    private boolean mIsRadioOn = false;
    private final Object mIsSatelliteProvisionedLock = new Object();
    @GuardedBy("mIsSatelliteProvisionedLock")
    private Boolean mIsSatelliteProvisioned = null;
    private final Object mSatelliteViaOemProvisionLock = new Object();
    @GuardedBy("mSatelliteViaOemProvisionLock")
    private Boolean mIsSatelliteViaOemProvisioned = null;
    @GuardedBy("mSatelliteViaOemProvisionLock")
    private Boolean mOverriddenIsSatelliteViaOemProvisioned = null;
    private final Object mSatelliteCapabilitiesLock = new Object();
    @GuardedBy("mSatelliteCapabilitiesLock")
    private SatelliteCapabilities mSatelliteCapabilities;
@@ -311,6 +319,8 @@ public class SatelliteController extends Handler {
            INVALID_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE;
    private int mDelayInSendingEventDisplayEmergencyMessage = 0;
    private boolean mCarrierSatelliteEnabled;
    @NonNull private SharedPreferences mSharedPreferences = null;

    /**
     * @return The singleton instance of SatelliteController.
     */
@@ -402,6 +412,7 @@ public class SatelliteController extends Handler {
                        new HandlerExecutor(new Handler(looper)), mCarrierConfigChangeListener);
        mDSM.registerForSignalStrengthReportDecision(this, CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING,
                null);
        loadSatelliteSharedPreferences();
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -1020,25 +1031,7 @@ public class SatelliteController extends Handler {
            }

            case EVENT_IS_SATELLITE_PROVISIONED_DONE: {
                ar = (AsyncResult) msg.obj;
                request = (SatelliteControllerHandlerRequest) ar.userObj;
                int error =  SatelliteServiceUtils.getSatelliteError(ar,
                        "isSatelliteProvisioned");
                Bundle bundle = new Bundle();
                if (error == SATELLITE_RESULT_SUCCESS) {
                    if (ar.result == null) {
                        loge("isSatelliteProvisioned: result is null");
                        error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
                    } else {
                        boolean provisioned = ((int[]) ar.result)[0] == 1;
                        if (DBG) logd("isSatelliteProvisioned: " + provisioned);
                        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED, provisioned);
                        synchronized (mIsSatelliteProvisionedLock) {
                            mIsSatelliteProvisioned = provisioned;
                        }
                    }
                }
                ((ResultReceiver) request.argument).send(error, bundle);
                handleIsSatelliteProvisionedDoneEvent((AsyncResult) msg.obj);
                break;
            }

@@ -1638,11 +1631,11 @@ public class SatelliteController extends Handler {
            return;
        }

        synchronized (mIsSatelliteProvisionedLock) {
            if (mIsSatelliteProvisioned != null) {
        synchronized (mSatelliteViaOemProvisionLock) {
            if (mIsSatelliteViaOemProvisioned != null) {
                Bundle bundle = new Bundle();
                bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED,
                        mIsSatelliteProvisioned);
                        mIsSatelliteViaOemProvisioned);
                result.send(SATELLITE_RESULT_SUCCESS, bundle);
                return;
            }
@@ -2088,8 +2081,8 @@ public class SatelliteController extends Handler {
        synchronized (mIsSatelliteSupportedLock) {
            mIsSatelliteSupported = null;
        }
        synchronized (mIsSatelliteProvisionedLock) {
            mIsSatelliteProvisioned = null;
        synchronized (mSatelliteViaOemProvisionLock) {
            mIsSatelliteViaOemProvisioned = null;
        }
        synchronized (mIsSatelliteEnabledLock) {
            mIsSatelliteEnabled = null;
@@ -2202,6 +2195,29 @@ public class SatelliteController extends Handler {
        return true;
    }

    /**
     * This API can be used in only testing to override oem-enabled satellite provision status.
     *
     * @param reset {@code true} mean the overriding status should not be used, {@code false}
     *              otherwise.
     * @param isProvisioned The overriding provision status.
     * @return {@code true} if the provision status is set successfully, {@code false} otherwise.
     */
    public boolean setOemEnabledSatelliteProvisionStatus(boolean reset, boolean isProvisioned) {
        if (!isMockModemAllowed()) {
            loge("setOemEnabledSatelliteProvisionStatus: mock modem not allowed");
            return false;
        }
        synchronized (mSatelliteViaOemProvisionLock) {
            if (reset) {
                mOverriddenIsSatelliteViaOemProvisioned = null;
            } else {
                mOverriddenIsSatelliteViaOemProvisioned = isProvisioned;
            }
        }
        return true;
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected int getEnforcedEmergencyCallToSatelliteHandoverType() {
        return mEnforcedEmergencyCallToSatelliteHandoverType;
@@ -2528,8 +2544,18 @@ public class SatelliteController extends Handler {
                    SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE);
            return;
        }
        if (result == SATELLITE_RESULT_SUCCESS
                || result == SATELLITE_RESULT_REQUEST_NOT_SUPPORTED) {
            persistOemEnabledSatelliteProvisionStatus(true);
            synchronized (mSatelliteViaOemProvisionLock) {
                mIsSatelliteViaOemProvisioned = true;
            }
            callback.accept(SATELLITE_RESULT_SUCCESS);
            handleEventSatelliteProvisionStateChanged(true);
        } else {
            callback.accept(result);
        }
    }

    private void handleEventDeprovisionSatelliteServiceDone(
            @NonNull ProvisionSatelliteServiceArgument arg,
@@ -2541,14 +2567,24 @@ public class SatelliteController extends Handler {
        logd("handleEventDeprovisionSatelliteServiceDone: result="
                + result + ", subId=" + arg.subId);

        if (result == SATELLITE_RESULT_SUCCESS
                || result == SATELLITE_RESULT_REQUEST_NOT_SUPPORTED) {
            persistOemEnabledSatelliteProvisionStatus(false);
            synchronized (mSatelliteViaOemProvisionLock) {
                mIsSatelliteViaOemProvisioned = false;
            }
            if (arg.callback != null) {
                arg.callback.accept(SATELLITE_RESULT_SUCCESS);
            }
            handleEventSatelliteProvisionStateChanged(false);
        } else if (arg.callback != null) {
            arg.callback.accept(result);
        }
        mProvisionMetricsStats.setResultCode(result)
                .setIsProvisionRequest(false)
                .reportProvisionMetrics();
        mControllerMetricsStats.reportDeprovisionCount(result);
    }
    }

    private void handleStartSatelliteTransmissionUpdatesDone(@NonNull AsyncResult ar) {
        SatelliteControllerHandlerRequest request = (SatelliteControllerHandlerRequest) ar.userObj;
@@ -2621,9 +2657,13 @@ public class SatelliteController extends Handler {
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected Boolean isSatelliteViaOemProvisioned() {
        synchronized (mIsSatelliteProvisionedLock) {
            if (mIsSatelliteProvisioned != null) {
                return mIsSatelliteProvisioned;
        synchronized (mSatelliteViaOemProvisionLock) {
            if (mOverriddenIsSatelliteViaOemProvisioned != null) {
                return mOverriddenIsSatelliteViaOemProvisioned;
            }

            if (mIsSatelliteViaOemProvisioned != null) {
                return mIsSatelliteViaOemProvisioned;
            }
        }

@@ -2631,7 +2671,7 @@ public class SatelliteController extends Handler {
                new ResultReceiver(this) {
                    @Override
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        logd("requestIsSatelliteProvisioned: resultCode=" + resultCode);
                        logd("isSatelliteViaOemProvisioned: resultCode=" + resultCode);
                    }
                });
        return null;
@@ -2780,8 +2820,9 @@ public class SatelliteController extends Handler {
    private void handleEventSatelliteProvisionStateChanged(boolean provisioned) {
        logd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned);

        synchronized (mIsSatelliteProvisionedLock) {
            mIsSatelliteProvisioned = provisioned;
        synchronized (mSatelliteViaOemProvisionLock) {
            persistOemEnabledSatelliteProvisionStatus(provisioned);
            mIsSatelliteViaOemProvisioned = provisioned;
        }

        List<ISatelliteProvisionStateCallback> deadCallersList = new ArrayList<>();
@@ -3397,6 +3438,78 @@ public class SatelliteController extends Handler {
        }
    }

    private void persistOemEnabledSatelliteProvisionStatus(boolean isProvisioned) {
        synchronized (mSatelliteViaOemProvisionLock) {
            logd("persistOemEnabledSatelliteProvisionStatus: isProvisioned=" + isProvisioned);

            if (!loadSatelliteSharedPreferences()) return;

            if (mSharedPreferences == null) {
                loge("persistOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
            } else {
                mSharedPreferences.edit().putBoolean(
                        OEM_ENABLED_SATELLITE_PROVISION_STATUS_KEY, isProvisioned).apply();
            }
        }
    }

    private boolean getPersistedOemEnabledSatelliteProvisionStatus() {
        synchronized (mSatelliteViaOemProvisionLock) {
            if (!loadSatelliteSharedPreferences()) return false;

            if (mSharedPreferences == null) {
                loge("getPersistedOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
                return false;
            } else {
                return mSharedPreferences.getBoolean(
                        OEM_ENABLED_SATELLITE_PROVISION_STATUS_KEY, false);
            }
        }
    }

    private boolean loadSatelliteSharedPreferences() {
        if (mSharedPreferences == null) {
            try {
                mSharedPreferences =
                        mContext.getSharedPreferences(SATELLITE_SHARED_PREF,
                                Context.MODE_PRIVATE);
            } catch (Exception e) {
                loge("loadSatelliteSharedPreferences: Cannot get default "
                        + "shared preferences, e=" + e);
                return false;
            }
        }
        return true;
    }

    private void handleIsSatelliteProvisionedDoneEvent(@NonNull AsyncResult ar) {
        SatelliteControllerHandlerRequest request = (SatelliteControllerHandlerRequest) ar.userObj;
        int error = SatelliteServiceUtils.getSatelliteError(
                ar, "handleIsSatelliteProvisionedDoneEvent");
        boolean isSatelliteProvisionedInModem = false;
        if (error == SATELLITE_RESULT_SUCCESS) {
            if (ar.result == null) {
                loge("handleIsSatelliteProvisionedDoneEvent: result is null");
                error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
            } else {
                isSatelliteProvisionedInModem = ((int[]) ar.result)[0] == 1;
            }
        } else if (error == SATELLITE_RESULT_REQUEST_NOT_SUPPORTED) {
            logd("handleIsSatelliteProvisionedDoneEvent: Modem does not support this request");
            isSatelliteProvisionedInModem = true;
        }
        boolean isSatelliteViaOemProvisioned =
                isSatelliteProvisionedInModem && getPersistedOemEnabledSatelliteProvisionStatus();
        logd("isSatelliteProvisionedInModem=" + isSatelliteProvisionedInModem
                + ", isSatelliteViaOemProvisioned=" + isSatelliteViaOemProvisioned);
        Bundle bundle = new Bundle();
        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED, isSatelliteViaOemProvisioned);
        synchronized (mSatelliteViaOemProvisionLock) {
            mIsSatelliteViaOemProvisioned = isSatelliteViaOemProvisioned;
        }
        ((ResultReceiver) request.argument).send(error, bundle);
    }

    /**
     * This API can be used by only CTS to override the cached value for the device overlay config
     * value : config_send_satellite_datagram_to_modem_in_demo_mode, which determines whether