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

Commit 7b111724 authored by Gavin Corkery's avatar Gavin Corkery Committed by Android (Google) Code Review
Browse files

Merge "Return incremented rescue level when bootlooping"

parents 2dfbfccd bb3a5048
Loading
Loading
Loading
Loading
+6 −11
Original line number Original line Diff line number Diff line
@@ -213,10 +213,10 @@ public class RescueParty {
    }
    }


    /**
    /**
     * Get the current rescue level.
     * Get the next rescue level. This indicates the next level of mitigation that may be taken.
     */
     */
    private static int getRescueLevel() {
    private static int getNextRescueLevel() {
        return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE),
        return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1,
                LEVEL_NONE, LEVEL_FACTORY_RESET);
                LEVEL_NONE, LEVEL_FACTORY_RESET);
    }
    }


@@ -225,9 +225,7 @@ public class RescueParty {
     * probably want to call {@link #executeRescueLevel(Context, String)}.
     * probably want to call {@link #executeRescueLevel(Context, String)}.
     */
     */
    private static void incrementRescueLevel(int triggerUid) {
    private static void incrementRescueLevel(int triggerUid) {
        final int level = MathUtils.constrain(
        final int level = getNextRescueLevel();
                SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1,
                LEVEL_NONE, LEVEL_FACTORY_RESET);
        SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level));
        SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level));


        EventLogTags.writeRescueLevel(level, triggerUid);
        EventLogTags.writeRescueLevel(level, triggerUid);
@@ -397,10 +395,7 @@ public class RescueParty {
                @FailureReasons int failureReason) {
                @FailureReasons int failureReason) {
            if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH
            if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH
                    || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) {
                    || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) {
                int rescueLevel = MathUtils.constrain(
                return mapRescueLevelToUserImpact(getNextRescueLevel());
                        SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1,
                        LEVEL_NONE, LEVEL_FACTORY_RESET);
                return mapRescueLevelToUserImpact(rescueLevel);
            } else {
            } else {
                return PackageHealthObserverImpact.USER_IMPACT_NONE;
                return PackageHealthObserverImpact.USER_IMPACT_NONE;
            }
            }
@@ -449,7 +444,7 @@ public class RescueParty {
            if (isDisabled()) {
            if (isDisabled()) {
                return PackageHealthObserverImpact.USER_IMPACT_NONE;
                return PackageHealthObserverImpact.USER_IMPACT_NONE;
            }
            }
            return mapRescueLevelToUserImpact(getRescueLevel());
            return mapRescueLevelToUserImpact(getNextRescueLevel());
        }
        }


        @Override
        @Override
+29 −0
Original line number Original line Diff line number Diff line
@@ -374,6 +374,35 @@ public class RescuePartyTest {
                PackageHealthObserverImpact.USER_IMPACT_HIGH);
                PackageHealthObserverImpact.USER_IMPACT_HIGH);
    }
    }


    @Test
    public void testBootLoopLevels() {
        RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);

        /*
         Ensure that the returned user impact corresponds with the user impact of the next available
         rescue level, not the current one.
         */
        SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(
                RescueParty.LEVEL_NONE));
        assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW);

        SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(
                RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS));
        assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW);

        SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(
                RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES));
        assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH);

        SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(
                RescueParty.LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS));
        assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH);

        SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(
                LEVEL_FACTORY_RESET));
        assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH);
    }

    @Test
    @Test
    public void testRescueLevelIncrementsWhenExecuted() {
    public void testRescueLevelIncrementsWhenExecuted() {
        RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);
        RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);