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

Commit 44d20dfd authored by Ling Ma's avatar Ling Ma
Browse files

Mock signal strength

Add a code path to override signal strength.

Fix: 333599045
Test: observe successful auto data switch back and forth and confirmed
log

Change-Id: Id3200d65c72238c9f64d32155813c53f1dcca093
parent fd892335
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");