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

Commit ad3f09bf authored by Youngtae Cha's avatar Youngtae Cha Committed by Android (Google) Code Review
Browse files

Merge "Put additional logs to check ResultReceiver created over limit" into main

parents 7f40d457 06809661
Loading
Loading
Loading
Loading
+101 −1
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPOR
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ESOS_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SUPPORTED_MSG_APPS_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_NIDD_APN_NAME_STRING;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_ESOS_INACTIVITY_TIMEOUT_SEC_INT;
@@ -41,6 +40,7 @@ import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_P2P_S
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_P2P_SMS_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE;
import static android.telephony.SubscriptionManager.SATELLITE_ATTACH_ENABLED_FOR_CARRIER;
import static android.telephony.SubscriptionManager.SATELLITE_ENTITLEMENT_STATUS;
import static android.telephony.SubscriptionManager.isValidSubscriptionId;
@@ -113,6 +113,7 @@ import android.provider.Settings;
import android.provider.Telephony;
import android.telecom.TelecomManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
import android.telephony.DropBoxManagerLoggerBackend;
import android.telephony.NetworkRegistrationInfo;
@@ -180,6 +181,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -656,6 +658,79 @@ public class SatelliteController extends Handler {
    // device.
    private List<DeviceState> mDeviceStates = new ArrayList();

    public static final int RESULT_RECEIVER_COUNT_ANOMALY_THRESHOLD = 100;
    protected final Object mResultReceiverTotalCountLock = new Object();
    @GuardedBy("mResultReceiverTotalCountLock")
    protected int mResultReceiverTotalCount;
    @GuardedBy("mResultReceiverTotalCountLock")
    protected HashMap<String, Integer> mResultReceiverCountPerMethodMap = new HashMap<>();

    // Satellite anomaly uuid -- ResultReceiver count threshold exceeded
    private final UUID mAnomalyUnexpectedResultReceiverCountUUID =
            UUID.fromString("e268f22d-9bba-4d27-b76a-1c7f5b42e241");

    private UUID generateAnomalyUnexpectedResultReceiverCountUUID(int error, int errorCode) {
        long lerror = error;
        long lerrorCode = errorCode;
        return new UUID(mAnomalyUnexpectedResultReceiverCountUUID.getMostSignificantBits(),
                mAnomalyUnexpectedResultReceiverCountUUID.getLeastSignificantBits()
                        + ((lerrorCode << 32) + lerror));
    }

    /**
     * Increments the ResultReceiver count and logs the caller information.
     * If the count exceeds the threshold, it reports an anomaly via AnomalyReporter.
     *
     * @param caller The caller information that created the ResultReceiver
     *               (e.g., class name and method name)
     */
    public void incrementResultReceiverCount(String caller) {
        if (mFeatureFlags.geofenceEnhancementForBetterUx()) {
            synchronized (mResultReceiverTotalCountLock) {
                mResultReceiverTotalCount++;
                logd("[incrementResultReceiverCount] : " + caller
                        + " | ResultReceiver total count= " + mResultReceiverTotalCount);
                mResultReceiverCountPerMethodMap.compute(caller, (k, v) -> v == null ? 1 : v + 1);

                if (mResultReceiverTotalCount > RESULT_RECEIVER_COUNT_ANOMALY_THRESHOLD) {
                    loge("[mResultReceiverTotalCount] is exceeds limits : "
                            + mResultReceiverTotalCount);
                    loge("[incrementResultReceiverCount] mResultReceiverCountPerMethodMap is "
                            + mResultReceiverCountPerMethodMap);
                    AnomalyReporter.reportAnomaly(
                            generateAnomalyUnexpectedResultReceiverCountUUID(0, 0),
                            "Satellite ResultReceiver total count= "
                                    + mResultReceiverTotalCount + " exceeds limit.");
                }
            }
        } else {
            logd("[incrementResultReceiverCount]: geofenceEnhancementForBetterUx is not enabled");
        }
    }

    /**
     * Decrements the ResultReceiver count and logs the caller information.
     * Prevents the count from going below zero.
     *
     * @param caller The caller information that released the ResultReceiver
     *               (e.g., class name and method name)
     */
    public void decrementResultReceiverCount(String caller) {
        if (mFeatureFlags.geofenceEnhancementForBetterUx()) {
            synchronized (mResultReceiverTotalCountLock) {
                if (mResultReceiverTotalCount > 0) {
                    mResultReceiverTotalCount--;
                }
                logd("[decrementResultReceiverCount] : " + caller
                        + " | ResultReceiver total count=" + mResultReceiverTotalCount);
                mResultReceiverCountPerMethodMap.computeIfPresent(caller,
                        (k, v) -> v > 0 ? v - 1 : v);
            }
        } else {
            logd("[decrementResultReceiverCount]: geofenceEnhancementForBetterUx is not enabled");
        }
    }

    /**
     * @return The singleton instance of SatelliteController.
     */
@@ -1454,6 +1529,7 @@ public class SatelliteController extends Handler {
                    updateSatelliteSupportedState(false);
                }
                ((ResultReceiver) request.argument).send(error, bundle);
                decrementResultReceiverCount("SC:requestIsSatelliteEnabled");
                break;
            }

@@ -1548,6 +1624,7 @@ public class SatelliteController extends Handler {
                    }
                }
                ((ResultReceiver) request.argument).send(error, bundle);
                decrementResultReceiverCount("SC:requestTimeForNextSatelliteVisibility");
                break;
            }

@@ -1573,16 +1650,19 @@ public class SatelliteController extends Handler {
                    if (mSatelliteModemInterface.isSatelliteServiceConnected()) {
                        synchronized (mIsSatelliteSupportedLock) {
                            if (mIsSatelliteSupported == null || !mIsSatelliteSupported) {
                                final String caller = "SC:CMD_IS_SATELLITE_SUPPORTED";
                                ResultReceiver receiver = new ResultReceiver(this) {
                                    @Override
                                    protected void onReceiveResult(
                                            int resultCode, Bundle resultData) {
                                        decrementResultReceiverCount(caller);
                                        plogd("onRadioStateChanged.requestIsSatelliteSupported: "
                                                + "resultCode=" + resultCode
                                                + ", resultData=" + resultData);
                                    }
                                };
                                sendRequestAsync(CMD_IS_SATELLITE_SUPPORTED, receiver, null);
                                incrementResultReceiverCount(caller);
                            }
                        }
                    }
@@ -1700,6 +1780,7 @@ public class SatelliteController extends Handler {
                    }
                    result.send(errorCode, null);
                }
                decrementResultReceiverCount("SC:requestNtnSignalStrength");
                break;
            }

@@ -1839,6 +1920,7 @@ public class SatelliteController extends Handler {
                        argument.mProvisioned ? SatelliteManager.KEY_PROVISION_SATELLITE_TOKENS
                                : SatelliteManager.KEY_DEPROVISION_SATELLITE_TOKENS, true);
                argument.mResult.send(SATELLITE_RESULT_SUCCESS, bundle);
                decrementResultReceiverCount("SC:provisionSatellite");
                break;
            }

@@ -2289,6 +2371,7 @@ public class SatelliteController extends Handler {
        }

        sendRequestAsync(CMD_IS_SATELLITE_ENABLED, result, null);
        incrementResultReceiverCount("SC:requestIsSatelliteEnabled");
    }

    /**
@@ -2696,6 +2779,7 @@ public class SatelliteController extends Handler {
        }

        sendRequestAsync(CMD_IS_SATELLITE_PROVISIONED, result, null);
        incrementResultReceiverCount("SC:requestIsSatelliteProvisioned");
    }

    /**
@@ -2871,6 +2955,7 @@ public class SatelliteController extends Handler {
        }

        sendRequestAsync(CMD_GET_TIME_SATELLITE_NEXT_VISIBLE, result, null);
        incrementResultReceiverCount("SC:requestTimeForNextSatelliteVisibility");
    }

    /**
@@ -3023,6 +3108,7 @@ public class SatelliteController extends Handler {

        Phone phone = SatelliteServiceUtils.getPhone();
        sendRequestAsync(CMD_REQUEST_NTN_SIGNAL_STRENGTH, result, phone);
        incrementResultReceiverCount("SC:requestNtnSignalStrength");
    }

    /**
@@ -3435,15 +3521,18 @@ public class SatelliteController extends Handler {
            plogd("onSatelliteServiceConnected");
            // Vendor service might have just come back from a crash
            moveSatelliteToOffStateAndCleanUpResources(SATELLITE_RESULT_MODEM_ERROR);
            final String caller = "SC:onSatelliteServiceConnected";
            ResultReceiver receiver = new ResultReceiver(this) {
                @Override
                protected void onReceiveResult(
                        int resultCode, Bundle resultData) {
                    decrementResultReceiverCount(caller);
                    plogd("onSatelliteServiceConnected.requestIsSatelliteSupported:"
                            + " resultCode=" + resultCode);
                }
            };
            requestIsSatelliteSupported(receiver);
            incrementResultReceiverCount(caller);
        } else {
            plogd("onSatelliteServiceConnected: Satellite vendor service is not supported."
                    + " Ignored the event");
@@ -4072,10 +4161,13 @@ public class SatelliteController extends Handler {
                new ResultReceiver(this) {
                    @Override
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        decrementResultReceiverCount(
                                "SC:isSatelliteSupportedViaOemInternal");
                        plogd("isSatelliteSupportedViaOemInternal.requestIsSatelliteSupported:"
                                + " resultCode=" + resultCode);
                    }
                });
        incrementResultReceiverCount("SC:isSatelliteSupportedViaOemInternal");
        return null;
    }

@@ -4301,6 +4393,7 @@ public class SatelliteController extends Handler {
                        protected void onReceiveResult(int resultCode, Bundle resultData) {
                            plogd("updateSatelliteSupportedState.requestIsSatelliteProvisioned: "
                                    + "resultCode=" + resultCode + ", resultData=" + resultData);
                            decrementResultReceiverCount("SC:requestIsSatelliteProvisioned");
                            requestSatelliteEnabled(false, false, false,
                                    new IIntegerConsumer.Stub() {
                                        @Override
@@ -4311,14 +4404,18 @@ public class SatelliteController extends Handler {
                                    });
                        }
                    });
            incrementResultReceiverCount("SC:requestIsSatelliteProvisioned");

            requestSatelliteCapabilities(
                    new ResultReceiver(this) {
                        @Override
                        protected void onReceiveResult(int resultCode, Bundle resultData) {
                            plogd("updateSatelliteSupportedState.requestSatelliteCapabilities: "
                                    + "resultCode=" + resultCode + ", resultData=" + resultData);
                            decrementResultReceiverCount("SC:requestSatelliteCapabilities");
                        }
                    });
            incrementResultReceiverCount("SC:requestSatelliteCapabilities");
        }
        registerForSatelliteSupportedStateChanged();
        selectBindingSatelliteSubscription(false);
@@ -5909,6 +6006,7 @@ public class SatelliteController extends Handler {
        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED,
                Boolean.TRUE.equals(isDeviceProvisioned()));
        ((ResultReceiver) request.argument).send(SATELLITE_RESULT_SUCCESS, bundle);
        decrementResultReceiverCount("SC:requestIsSatelliteProvisioned");
    }

    private long getWaitForSatelliteEnablingResponseTimeoutMillis() {
@@ -6960,6 +7058,7 @@ public class SatelliteController extends Handler {
        RequestProvisionSatelliteArgument request = new RequestProvisionSatelliteArgument(list,
                result, true);
        sendRequestAsync(CMD_UPDATE_PROVISION_SATELLITE_TOKEN, request, null);
        incrementResultReceiverCount("SC:provisionSatellite");
    }

    /**
@@ -6985,6 +7084,7 @@ public class SatelliteController extends Handler {
        RequestProvisionSatelliteArgument request = new RequestProvisionSatelliteArgument(list,
                result, false);
        sendRequestAsync(CMD_UPDATE_PROVISION_SATELLITE_TOKEN, request, null);
        incrementResultReceiverCount("SC:provisionSatellite");
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+75 −0
Original line number Diff line number Diff line
@@ -5891,5 +5891,80 @@ public class SatelliteControllerTest extends TelephonyTest {
        public boolean isAnyWaitForSatelliteEnablingResponseTimerStarted() {
            return hasMessages(EVENT_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMED_OUT);
        }

        public int getResultReceiverTotalCount() {
            synchronized (mResultReceiverTotalCountLock) {
                return mResultReceiverTotalCount;
            }
        }

        public HashMap<String, Integer> getResultReceiverCountPerMethodMap() {
            synchronized (mResultReceiverTotalCountLock) {
                return mResultReceiverCountPerMethodMap;
            }
        }
    }

    @Test
    public void testLoggingCodeForResultReceiverCount() throws Exception {
        final String callerSC =  "SC:ResultReceiver";
        final String callerSAC =  "SAC:ResultReceiver";

        doReturn(false).when(mFeatureFlags).geofenceEnhancementForBetterUx();

        mSatelliteControllerUT.incrementResultReceiverCount(callerSC);
        assertEquals(0, mSatelliteControllerUT.getResultReceiverTotalCount());
        mSatelliteControllerUT.decrementResultReceiverCount(callerSC);
        assertEquals(0, mSatelliteControllerUT.getResultReceiverTotalCount());

        doReturn(true).when(mFeatureFlags).geofenceEnhancementForBetterUx();

        mSatelliteControllerUT.incrementResultReceiverCount(callerSC);
        assertEquals(1, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(1, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(1, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(0, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));

        mSatelliteControllerUT.incrementResultReceiverCount(callerSC);
        assertEquals(2, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(1, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(2, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(0, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));

        mSatelliteControllerUT.incrementResultReceiverCount(callerSAC);
        assertEquals(3, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(2, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(2, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(1, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));

        mSatelliteControllerUT.decrementResultReceiverCount(callerSC);
        assertEquals(2, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(2, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(1, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(1, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));

        mSatelliteControllerUT.decrementResultReceiverCount(callerSC);
        assertEquals(1, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(2, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(0, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(1, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));

        mSatelliteControllerUT.decrementResultReceiverCount(callerSAC);
        assertEquals(0, mSatelliteControllerUT.getResultReceiverTotalCount());
        assertEquals(2, mSatelliteControllerUT.getResultReceiverCountPerMethodMap().size());
        assertEquals(0, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSC)).orElse(0));
        assertEquals(0, (int) Optional.ofNullable(mSatelliteControllerUT
                .getResultReceiverCountPerMethodMap().get(callerSAC)).orElse(0));
    }
}