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

Commit af45b60e authored by Adrian Roos's avatar Adrian Roos
Browse files

Fix flakey KeyguardIndicationControllerTest

The test in question would pass only when the device was
not charging, because the KeyguardIndicationController registers
itself with the KeyguardUpdateMonitor and shows indications when
the device starts charging.

Fixed by not registering the controller with the KeyguardUpdateMonitor
and instead driving the controller's callback directly.

Change-Id: I6828a97a36572be9e7520ce9a82afddf474d4008
Fixes: 36211361
Test: runtest -x frameworks/base/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java -m transientIndication_releasesWakeLock_afterHidingDelayed
parent 082d21c1
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.os.BatteryManager;
import android.os.BatteryStats;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -95,12 +94,20 @@ public class KeyguardIndicationController {
    private final DevicePolicyManager mDevicePolicyManager;
    private boolean mDozing;

    /**
     * Creates a new KeyguardIndicationController and registers callbacks.
     */
    public KeyguardIndicationController(Context context, ViewGroup indicationArea,
            LockIcon lockIcon) {
        this(context, indicationArea, lockIcon,
                WakeLock.createPartial(context, "Doze:KeyguardIndication"));

        registerCallbacks(KeyguardUpdateMonitor.getInstance(context));
    }

    /**
     * Creates a new KeyguardIndicationController for testing. Does *not* register callbacks.
     */
    @VisibleForTesting
    KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon,
                WakeLock wakeLock) {
@@ -124,12 +131,15 @@ public class KeyguardIndicationController {
        mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(
                Context.DEVICE_POLICY_SERVICE);

        KeyguardUpdateMonitor.getInstance(context).registerCallback(getKeyguardCallback());
        context.registerReceiverAsUser(mTickReceiver, UserHandle.SYSTEM,
        updateDisclosure();
    }

    private void registerCallbacks(KeyguardUpdateMonitor monitor) {
        monitor.registerCallback(getKeyguardCallback());

        mContext.registerReceiverAsUser(mTickReceiver, UserHandle.SYSTEM,
                new IntentFilter(Intent.ACTION_TIME_TICK), null,
                Dependency.get(Dependency.TIME_TICK_HANDLER));

        updateDisclosure();
    }

    /**
@@ -331,7 +341,7 @@ public class KeyguardIndicationController {
        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
    }

    BroadcastReceiver mTickReceiver = new BroadcastReceiver() {
    private final BroadcastReceiver mTickReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mHandler.post(() -> {
+4 −11
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.systemui.statusbar;

import static android.support.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
@@ -34,19 +32,17 @@ import android.hardware.fingerprint.FingerprintManager;
import android.os.Looper;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.internal.runner.junit4.statement.UiThreadStatement;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.util.wakelock.WakeLockFake;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@@ -125,7 +121,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
        createController();

        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
        final KeyguardUpdateMonitorCallback monitor = mController.getKeyguardCallback();
        reset(mDisclosure);

        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
@@ -176,7 +172,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        assertFalse(mWakeLock.isHeld());
    }

    @Ignore("Flaky")
    @Test
    public void transientIndication_releasesWakeLock_afterHidingDelayed() throws Throwable {
        mInstrumentation.runOnMainSync(() -> {
@@ -188,12 +183,10 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        });
        mInstrumentation.waitForIdleSync();

        boolean[] held = new boolean[2];
        Boolean[] held = new Boolean[1];
        mInstrumentation.runOnMainSync(() -> {
            held[0] = mWakeLock.isHeld();
            held[1] = true;
        });
        assertFalse("wake lock still held", held[0]);
        assertTrue("held was not written yet", held[1]);
        assertFalse("WakeLock expected: RELEASED, was: HELD", held[0]);
    }
}