From 82f1652e350befb64cd3bcc6bdc6035b0da8c1ed Mon Sep 17 00:00:00 2001 From: Jamie Garside Date: Fri, 16 Apr 2021 15:15:32 +0100 Subject: [PATCH] Move bouncer to bottom of screen when in one handed mode. If one handed bouncer is enabled, both in the SysUI config (i.e. sw600dp-land) and in the device config, then use a different gravity for the keyguard host view. This is used to move the bouncer to the bottom of the screen when the bouncer is one handed. Of course, password entry isn't one-handed, but we don't bother checking which security mode is in use. In that mode, the password line is just on top of the keyboard anyway, so even using gravity = BOTTOM, it doesn't render differently. Bug: 170858298 Test: atest SystemUITests: com.android.keyguard.KeyguardHostViewControllerTest Change-Id: Ia24d74ca1993d667c46b8ebb8bde6ea4888a0f97 --- .../SystemUI/res-keyguard/values/integers.xml | 7 +++ .../keyguard/KeyguardHostViewController.java | 13 ++++- .../KeyguardHostViewControllerTest.java | 52 +++++++++++++++++-- 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values/integers.xml b/packages/SystemUI/res-keyguard/values/integers.xml index 6f14dc9ba2e17..c6e90c0fcdec6 100644 --- a/packages/SystemUI/res-keyguard/values/integers.xml +++ b/packages/SystemUI/res-keyguard/values/integers.xml @@ -20,4 +20,11 @@ 0x50 = bottom, 0x01 = center_horizontal --> 0x51 + + + 0x51 diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java index 31f1332b265c7..d06c8bc6bffeb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java @@ -475,7 +475,18 @@ public class KeyguardHostViewController extends ViewController * configuration. */ public void updateResources() { - int gravity = mView.getResources().getInteger(R.integer.keyguard_host_view_gravity); + int gravity; + + Resources resources = mView.getResources(); + + if (resources.getBoolean(R.bool.can_use_one_handed_bouncer) + && resources.getBoolean( + com.android.internal.R.bool.config_enableOneHandedKeyguard)) { + gravity = resources.getInteger( + R.integer.keyguard_host_view_one_handed_gravity); + } else { + gravity = resources.getInteger(R.integer.keyguard_host_view_gravity); + } // Android SysUI uses a FrameLayout as the top-level, but Auto uses RelativeLayout. // We're just changing the gravity here though (which can't be applied to RelativeLayout), diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java index 4d526508ce0f6..42314bf3643f1 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java @@ -29,6 +29,7 @@ import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.testing.TestableResources; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -49,7 +50,6 @@ import org.mockito.junit.MockitoRule; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class KeyguardHostViewControllerTest extends SysuiTestCase { - @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -68,14 +68,21 @@ public class KeyguardHostViewControllerTest extends SysuiTestCase { @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); + private TestableResources mTestableResources; private KeyguardHostViewController mKeyguardHostViewController; @Before public void setup() { - mContext.ensureTestableResources(); + mTestableResources = mContext.getOrCreateTestableResources(); mKeyguardHostView = new KeyguardHostView(mContext); + // Explicitly disable one handed keyguard. + mTestableResources.addOverride( + R.bool.can_use_one_handed_bouncer, false); + mTestableResources.addOverride( + com.android.internal.R.bool.config_enableOneHandedKeyguard, false); + when(mKeyguardSecurityContainerControllerFactory.create(any( KeyguardSecurityContainer.SecurityCallback.class))) .thenReturn(mKeyguardSecurityContainerController); @@ -106,7 +113,7 @@ public class KeyguardHostViewControllerTest extends SysuiTestCase { mKeyguardHostView.setLayoutParams(lp); // Set initial gravity - mContext.getOrCreateTestableResources().addOverride(R.integer.keyguard_host_view_gravity, + mTestableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER); // Kick off the initial pass... @@ -116,7 +123,7 @@ public class KeyguardHostViewControllerTest extends SysuiTestCase { Gravity.CENTER); // Now simulate a config change - mContext.getOrCreateTestableResources().addOverride(R.integer.keyguard_host_view_gravity, + mTestableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); mKeyguardHostViewController.updateResources(); @@ -125,6 +132,43 @@ public class KeyguardHostViewControllerTest extends SysuiTestCase { Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); } + @Test + public void testGravityUsesOneHandGravityWhenApplicable() { + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + mKeyguardHostView.setLayoutParams(lp); + + mTestableResources.addOverride( + R.integer.keyguard_host_view_gravity, + Gravity.CENTER); + mTestableResources.addOverride( + R.integer.keyguard_host_view_one_handed_gravity, + Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); + + // Start disabled. + mTestableResources.addOverride( + R.bool.can_use_one_handed_bouncer, false); + mTestableResources.addOverride( + com.android.internal.R.bool.config_enableOneHandedKeyguard, false); + + mKeyguardHostViewController.init(); + assertEquals( + ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity, + Gravity.CENTER); + + // And enable + mTestableResources.addOverride( + R.bool.can_use_one_handed_bouncer, true); + mTestableResources.addOverride( + com.android.internal.R.bool.config_enableOneHandedKeyguard, true); + + mKeyguardHostViewController.updateResources(); + assertEquals( + ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity, + Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); + } + @Test public void testUpdateKeyguardPositionDelegatesToSecurityContainer() { mKeyguardHostViewController.updateKeyguardPosition(1.0f);