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

Commit 6f0ad152 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Smoothly hide the keyboard

Fixes: 155980369
Test: manual
Test: atest KeyguardSecurityContainerTest
Change-Id: I678d9a04fdea6895c24cd4bdb77348cdeb2daced
parent 69804835
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -103,7 +103,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
    private KeyguardSecurityModel mSecurityModel;
    private KeyguardSecurityModel mSecurityModel;
    private LockPatternUtils mLockPatternUtils;
    private LockPatternUtils mLockPatternUtils;


    private KeyguardSecurityViewFlipper mSecurityViewFlipper;
    @VisibleForTesting
    KeyguardSecurityViewFlipper mSecurityViewFlipper;
    private boolean mIsVerifyUnlockOnly;
    private boolean mIsVerifyUnlockOnly;
    private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid;
    private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid;
    private KeyguardSecurityView mCurrentSecurityView;
    private KeyguardSecurityView mCurrentSecurityView;
@@ -375,6 +376,9 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
    }
    }


    public boolean startDisappearAnimation(Runnable onFinishRunnable) {
    public boolean startDisappearAnimation(Runnable onFinishRunnable) {
        if (mCurrentSecuritySelection == SecurityMode.Password) {
            mSecurityViewFlipper.getWindowInsetsController().hide(WindowInsets.Type.ime());
        }
        if (mCurrentSecuritySelection != SecurityMode.None) {
        if (mCurrentSecuritySelection != SecurityMode.None) {
            return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation(
            return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation(
                    onFinishRunnable);
                    onFinishRunnable);
@@ -397,7 +401,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
        return mSecurityViewFlipper.getTitle();
        return mSecurityViewFlipper.getTitle();
    }
    }


    private KeyguardSecurityView getSecurityView(SecurityMode securityMode) {
    @VisibleForTesting
    protected KeyguardSecurityView getSecurityView(SecurityMode securityMode) {
        final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);
        final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);
        KeyguardSecurityView view = null;
        KeyguardSecurityView view = null;
        final int children = mSecurityViewFlipper.getChildCount();
        final int children = mSecurityViewFlipper.getChildCount();
+64 −9
Original line number Original line Diff line number Diff line
@@ -16,31 +16,75 @@


package com.android.keyguard;
package com.android.keyguard;


import static android.view.WindowInsets.Type.ime;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.Context;
import android.test.UiThreadTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.WindowInsetsController;


import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;


import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;


import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4.class)
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper()
public class KeyguardSecurityContainerTest extends SysuiTestCase {
public class KeyguardSecurityContainerTest extends SysuiTestCase {


    @UiThreadTest
    @Mock
    private KeyguardSecurityModel mKeyguardSecurityModel;
    @Mock
    private KeyguardStateController mKeyguardStateController;
    @Mock
    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock
    private KeyguardSecurityContainer.SecurityCallback mSecurityCallback;
    @Mock
    private KeyguardSecurityView mSecurityView;
    @Mock
    private WindowInsetsController mWindowInsetsController;
    @Mock
    private KeyguardSecurityViewFlipper mSecurityViewFlipper;
    @Rule
    public MockitoRule mRule = MockitoJUnit.rule();
    private KeyguardSecurityContainer mKeyguardSecurityContainer;

    @Before
    public void setup() {
        mDependency.injectTestDependency(KeyguardStateController.class, mKeyguardStateController);
        mDependency.injectTestDependency(KeyguardSecurityModel.class, mKeyguardSecurityModel);
        mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor);
        mKeyguardSecurityContainer = new KeyguardSecurityContainer(getContext()) {
            @Override
            protected KeyguardSecurityView getSecurityView(
                    KeyguardSecurityModel.SecurityMode securityMode) {
                return mSecurityView;
            }
        };
        mKeyguardSecurityContainer.mSecurityViewFlipper = mSecurityViewFlipper;
        when(mSecurityViewFlipper.getWindowInsetsController()).thenReturn(mWindowInsetsController);
        mKeyguardSecurityContainer.setSecurityCallback(mSecurityCallback);
    }

    @Test
    @Test
    public void showSecurityScreen_canInflateAllModes() {
    public void showSecurityScreen_canInflateAllModes() {
        mDependency.injectMockDependency(KeyguardStateController.class);
        KeyguardSecurityContainer keyguardSecurityContainer =
                new KeyguardSecurityContainer(getContext());

        Context context = getContext();
        Context context = getContext();


        for (int theme : new int[] {R.style.Theme_SystemUI, R.style.Theme_SystemUI_Light}) {
        for (int theme : new int[] {R.style.Theme_SystemUI, R.style.Theme_SystemUI_Light}) {
@@ -49,7 +93,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
            KeyguardSecurityModel.SecurityMode[] modes =
            KeyguardSecurityModel.SecurityMode[] modes =
                    KeyguardSecurityModel.SecurityMode.values();
                    KeyguardSecurityModel.SecurityMode.values();
            for (KeyguardSecurityModel.SecurityMode mode : modes) {
            for (KeyguardSecurityModel.SecurityMode mode : modes) {
                final int resId = keyguardSecurityContainer.getLayoutIdFor(mode);
                final int resId = mKeyguardSecurityContainer.getLayoutIdFor(mode);
                if (resId == 0) {
                if (resId == 0) {
                    continue;
                    continue;
                }
                }
@@ -57,4 +101,15 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
            }
            }
        }
        }
    }
    }

    @Test
    public void startDisappearAnimation_animatesKeyboard() {
        when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(
                KeyguardSecurityModel.SecurityMode.Password);
        mKeyguardSecurityContainer.showPrimarySecurityScreen(false /* turningOff */);

        mKeyguardSecurityContainer.startDisappearAnimation(null);
        verify(mSecurityView).startDisappearAnimation(eq(null));
        verify(mWindowInsetsController).hide(eq(ime()));
    }
}
}
 No newline at end of file