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

Commit 9e9b8ccf authored by brycelee's avatar brycelee
Browse files

Do not try to access service in DreamActivityCallbacks after destroy.

This changelist ensures that DreamActivityCallbacks takes no action on
the service once it's cleared in onActivityDestroyed.

Test: atest DreamServiceTest#testCallbackInvalidAfterDestroy
Fixes: 394086457
Flag: EXEMPT bugfix
Change-Id: If2f7d6d9c908628813b00c775d6c6524ffbec346
parent f97b7136
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -2049,13 +2049,17 @@ public class DreamService extends Service implements Window.Callback {
        private final IBinder mActivityDreamToken;
        private WeakReference<DreamService> mService;

        DreamActivityCallbacks(IBinder token, WeakReference<DreamService> service)  {
        public DreamActivityCallbacks(IBinder token, WeakReference<DreamService> service)  {
            mActivityDreamToken = token;
            mService = service;
        }

        /** Callback when the {@link DreamActivity} has been created */
        public void onActivityCreated(DreamActivity activity) {
            if (mService == null) {
                return;
            }

            final DreamService service = mService.get();

            if (service == null) {
@@ -2067,6 +2071,10 @@ public class DreamService extends Service implements Window.Callback {

        /** Callback when the {@link DreamActivity} has been destroyed */
        public void onActivityDestroyed() {
            if (mService == null) {
                return;
            }

            final DreamService service = mService.get();

            if (service == null) {
+20 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mockingDetails;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -32,6 +34,8 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.TypedArray;
import android.os.Binder;
import android.os.IBinder;
import android.os.Looper;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -52,6 +56,8 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;

import java.lang.ref.WeakReference;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class DreamServiceTest {
@@ -210,6 +216,20 @@ public class DreamServiceTest {
        verify(environment.getDreamOverlayClient()).onWakeRequested();
    }

    @Test
    public void testCallbackInvalidAfterDestroy() {
        final IBinder binder = new Binder();
        final DreamService service = Mockito.mock(DreamService.class);
        final WeakReference<DreamService> serviceRef = new WeakReference<>(service);
        DreamService.DreamActivityCallbacks callbacks = new DreamService.DreamActivityCallbacks(
                binder, serviceRef);
        callbacks.onActivityDestroyed();
        assertThat(mockingDetails(service).getInvocations().size()).isNotEqualTo(0);
        clearInvocations(service);
        callbacks.onActivityDestroyed();
        assertThat(mockingDetails(service).getInvocations().size()).isEqualTo(0);
    }

    @Test
    @EnableFlags(Flags.FLAG_DREAM_HANDLES_CONFIRM_KEYS)
    public void testPartialKeyHandling() throws Exception {