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

Commit 51dde157 authored by Ling Ma's avatar Ling Ma Committed by Android (Google) Code Review
Browse files

Merge "Mock signal strength" into main

parents e32a4eec 44d20dfd
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.telephony.Rlog;

@@ -60,6 +61,7 @@ import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
@@ -101,7 +103,7 @@ public class SignalStrengthController extends Handler {
    private static final int EVENT_GET_SIGNAL_STRENGTH                      = 6;
    private static final int EVENT_POLL_SIGNAL_STRENGTH                     = 7;
    private static final int EVENT_SIGNAL_STRENGTH_UPDATE                   = 8;
    private static final int EVENT_POLL_SIGNAL_STRENGTH_DONE                = 9;
    public static final int EVENT_POLL_SIGNAL_STRENGTH_DONE                = 9;
    private static final int EVENT_SERVICE_STATE_CHANGED                    = 10;

    @NonNull
@@ -330,7 +332,7 @@ public class SignalStrengthController extends Handler {
     * @param signalStrength The new SignalStrength used for updating {@code mSignalStrength}.
     */
    private void updateSignalStrength(@NonNull SignalStrength signalStrength) {
        mSignalStrength = signalStrength;
        mSignalStrength = maybeOverrideSignalStrengthForTest(signalStrength);
        ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
        if (serviceStateTracker != null) {
            mSignalStrength.updateLevel(mCarrierConfig, serviceStateTracker.mSS);
@@ -341,6 +343,18 @@ public class SignalStrengthController extends Handler {
        notifySignalStrength();
    }

    /**
     * For debug test build, override signal strength for testing.
     * @param original The real signal strength to use if not in testing mode.
     * @return The signal strength to broadcast to the external.
     */
    @NonNull private SignalStrength maybeOverrideSignalStrengthForTest(
            @NonNull SignalStrength original) {
        return TelephonyUtils.IS_DEBUGGABLE && mPhone.getTelephonyTester() != null
                ? Objects.requireNonNullElse(mPhone.getTelephonyTester()
                .getOverriddenSignalStrength(), original) : original;
    }

    /**
     * @return signal strength
     */
@@ -750,7 +764,7 @@ public class SignalStrengthController extends Handler {
    }

    void setSignalStrengthDefaultValues() {
        mSignalStrength = new SignalStrength();
        mSignalStrength = maybeOverrideSignalStrengthForTest(new SignalStrength());
        mSignalStrengthUpdatedTime = System.currentTimeMillis();
    }

+64 −4
Original line number Diff line number Diff line
@@ -17,16 +17,21 @@
package com.android.internal.telephony;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.AsyncResult;
import android.os.BadParcelableException;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.telephony.AccessNetworkConstants;
import android.telephony.CellSignalStrengthLte;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsConferenceState;
@@ -46,6 +51,7 @@ import com.android.telephony.Rlog;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -163,6 +169,7 @@ public class TelephonyTester {
    private static List<ImsExternalCallState> mImsExternalCallStates = null;

    private Intent mServiceStateTestIntent;
    private SignalStrengthTestable mSignalStrengthTest;

    private Phone mPhone;

@@ -385,12 +392,69 @@ public class TelephonyTester {
        }
    }

    /**
     * Testable signal strength that mocks its fields.
     */
    private class SignalStrengthTestable extends SignalStrength {
        private SignalStrengthTestable() {
            super();
        }

        public void mockLevel(int level) {
            try {
                Field lteField = SignalStrength.class.getDeclaredField("mLte");
                lteField.setAccessible(true);
                CellSignalStrengthLte lte = (CellSignalStrengthLte) lteField.get(this);

                Field lvlField = CellSignalStrengthLte.class.getDeclaredField("mLevel");
                lvlField.setAccessible(true);
                lvlField.set(lte, level);
            } catch (Exception e) {
                log("SignalStrengthTestable: mockLevel " + e);
            }
        }

        @Override
        public void updateLevel(PersistableBundle cc, ServiceState ss) {
            log("SignalStrengthTestable: updateLevel: do nothing ");
        }

        @Override
        public String toString() {
            return "SignalStrengthTestable-" + getLevel();
        }
    }

    /** {@link android.telephony.SignalStrength} */
    public void setSignalStrength(int level) {
        if (level > -1) {
            log("setSignalStrength: level " + level);
            mSignalStrengthTest = new SignalStrengthTestable();
            mSignalStrengthTest.mockLevel(level);
            AsyncResult ar = new AsyncResult(null, mSignalStrengthTest, null);
            mPhone.getSignalStrengthController().sendMessage(mPhone.getSignalStrengthController()
                    .obtainMessage(SignalStrengthController.EVENT_POLL_SIGNAL_STRENGTH_DONE, ar));
        } else {
            log("setSignalStrength: clear mock");
            mSignalStrengthTest = null;
            mPhone.getSignalStrengthController().getSignalStrengthFromCi();
        }
    }

    /** {@link android.telephony.SignalStrength} */
    @Nullable
    public SignalStrength getOverriddenSignalStrength() {
        return mSignalStrengthTest;
    }

    /**
     * Set the service state test intent.
     *
     * @param intent The service state test intent.
     */
    public void setServiceStateTestIntent(@NonNull Intent intent) {
        // Don't process if the intent is not prepared for this phone slot.
        if (mPhone.getPhoneId() != intent.getIntExtra(EXTRA_PHONE_ID, mPhone.getPhoneId())) return;
        mServiceStateTestIntent = intent;
        // Trigger the service state update. The replacement will be done in
        // overrideServiceState().
@@ -400,10 +464,6 @@ public class TelephonyTester {

    void overrideServiceState(ServiceState ss) {
        if (mServiceStateTestIntent == null || ss == null) return;
        if (mPhone.getPhoneId() != mServiceStateTestIntent.getIntExtra(
                EXTRA_PHONE_ID, mPhone.getPhoneId())) {
            return;
        }
        if (mServiceStateTestIntent.hasExtra(EXTRA_ACTION)
                && ACTION_RESET.equals(mServiceStateTestIntent.getStringExtra(EXTRA_ACTION))) {
            log("Service state override reset");