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

Commit 7f0416a3 authored by Bryce Lee's avatar Bryce Lee
Browse files

Protect against receiving partial key event sequences.

This changelist addresses the possibility of receiving only the latter
portions of a key event sequence in DreamService. In this case, some
initialization/tracking might not be in place. Values are now checked
before being used.

Test: atest DreamServiceTest#testPartialKeyHandling
Flag: android.service.dreams.dream_handles_confirm_keys
Fixes: 341920661
Change-Id: I7e416dc96ed8871eb7f5bb18a4521150b846bfb9
parent bada8743
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -433,7 +433,8 @@ public class DreamService extends Service implements Window.Callback {
                        mTrackingConfirmKey = event.getKeyCode();
                    }
                    case KeyEvent.ACTION_UP -> {
                        if (mTrackingConfirmKey != event.getKeyCode()) {
                        if (mTrackingConfirmKey == null
                                || mTrackingConfirmKey != event.getKeyCode()) {
                            return true;
                        }

+12 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.service.dreams.DreamService;
import android.service.dreams.Flags;
import android.service.dreams.IDreamOverlayCallback;
import android.testing.TestableLooper;
import android.view.KeyEvent;

import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -181,4 +182,15 @@ public class DreamServiceTest {
        environment.advance(TestDreamEnvironment.DREAM_STATE_WOKEN);
        verify(environment.getDreamOverlayClient()).onWakeRequested();
    }

    @Test
    @EnableFlags(Flags.FLAG_DREAM_HANDLES_CONFIRM_KEYS)
    public void testPartialKeyHandling() throws Exception {
        TestDreamEnvironment environment = new TestDreamEnvironment.Builder(mTestableLooper)
                .build();
        environment.advance(TestDreamEnvironment.DREAM_STATE_STARTED);

        // Ensure service does not crash from only receiving up event.
        environment.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SPACE));
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.service.dreams.IDreamOverlayCallback;
import android.service.dreams.IDreamOverlayClient;
import android.service.dreams.IDreamService;
import android.testing.TestableLooper;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowInsetsController;
@@ -390,6 +391,13 @@ public class TestDreamEnvironment {
        }
    }

    /**
     * Sends a key event to the dream.
     */
    public void dispatchKeyEvent(KeyEvent event) {
        mService.dispatchKeyEvent(event);
    }

    private void wakeDream() throws RemoteException {
        mService.wakeUp();
    }