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

Commit 412aa82d authored by axfordjc's avatar axfordjc
Browse files

PIN bouncer refactor with motion layout - change constraints on rotate

- refactored PIN bouncer into a single motion layout
- transition between single or split bouncer constrains on rotate
- Changed "num_pad_key_ratio" to 1 on small landscape so num pad keys are rounded

why are we doing this?
- to add support for landscape bouncers on small screens

"Split" bouncer constraints (https://hsv.googleplex.com/4878958005846016) will be used on small landscape screens only

"Single" bouncer constraints (https://hsv.googleplex.com/5484669056319488) are used otherwise, such as for large screen port/land and small screens port - this is the same as the previous behaviour.

Use of "split or single" bouncer constraints is not strictly related to device orientation.

Fixes: 293290851 - bouncer message reset
Fixes: 291544499 - pin shape animation not showing
Fixes: 293291553 - pin value reset
Fixes: 293576466 - round key buttons
Bug: 293252410
Bug: 296567469

Test: KeyguardPinViewControllerTest
Change-Id: Ie180492ca800d8d1a40f2c2f6fec6c7833c0fb6f
parent 9f1c9359
Loading
Loading
Loading
Loading
+243 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?><!--
**
** Copyright 2023, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->

<!-- This file is needed when flag lockscreen.enable_landscape is on
     Required for landscape lockscreen on small screens. -->
<com.android.keyguard.KeyguardPINView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:androidprv="http://schemas.android.com/apk/res-auto"
    android:id="@+id/keyguard_pin_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal|bottom"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:orientation="vertical">

    <!-- Layout here is visually identical to the previous keyguard_pin_view.
         I.E., 'constraints here effectively the same as the previous linear layout '-->
    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/pin_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        android:clipToPadding="false"
        android:layoutDirection="ltr"
        android:orientation="vertical"
        androidprv:layoutDescription="@xml/keyguard_pin_scene"
        android:layout_gravity="center_horizontal">

        <!-- Guideline need to align PIN pad left of centre,
        when on small screen landscape layout -->
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/pin_pad_center_guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            androidprv:layout_constraintGuide_percent="0.5" />

        <!-- Guideline used to place the top row of keys relative to the screen height. This will be
        updated in KeyguardPINView to reduce the height of the PIN pad. -->
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/pin_pad_top_guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            androidprv:layout_constraintGuide_percent="0" />

        <LinearLayout
            android:id="@+id/keyguard_bouncer_message_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:layoutDirection="ltr"
            android:orientation="vertical"
            androidprv:layout_constraintTop_toTopOf="parent">

            <include layout="@layout/keyguard_bouncer_message_area" />

            <com.android.systemui.bouncer.ui.BouncerMessageView
                android:id="@+id/bouncer_message_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" />

        </LinearLayout>

        <!-- Set this to be just above key1. It would be better to introduce a barrier above
          key1/key2/key3, then place this View above that. Sadly, that doesn't work (the Barrier
          drops to the bottom of the page, and key1/2/3 all shoot up to the top-left). In any
          case, the Flow should ensure that key1/2/3 all have the same top, so this should be
          fine. -->
        <com.android.keyguard.AlphaOptimizedRelativeLayout
            android:id="@+id/row0"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="@dimen/num_pad_entry_row_margin_bottom"
            androidprv:layout_constraintBottom_toTopOf="@id/key1"
            androidprv:layout_constraintEnd_toEndOf="parent"
            androidprv:layout_constraintStart_toStartOf="parent"
            androidprv:layout_constraintTop_toBottomOf="@id/keyguard_bouncer_message_container"
            androidprv:layout_constraintVertical_bias="0.5">

            <com.android.keyguard.PasswordTextView
                android:id="@+id/pinEntry"
                style="@style/Widget.TextView.Password"
                android:layout_width="@dimen/keyguard_security_width"
                android:layout_height="@dimen/keyguard_password_height"
                android:layout_centerHorizontal="true"
                android:layout_marginRight="72dp"
                android:contentDescription="@string/keyguard_accessibility_pin_area"
                androidprv:scaledTextSize="@integer/scaled_password_text_size" />

        </com.android.keyguard.AlphaOptimizedRelativeLayout>

        <com.android.keyguard.KeyguardPinFlowView
            android:id="@+id/flow1"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginBottom="8dp"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:orientation="horizontal"

            androidprv:constraint_referenced_ids="key1,key2,key3,key4,key5,key6,key7,key8,key9,delete_button,key0,key_enter"

            androidprv:flow_horizontalGap="@dimen/num_pad_key_margin_end"
            androidprv:flow_horizontalStyle="packed"
            androidprv:flow_maxElementsWrap="3"

            androidprv:flow_verticalBias="1.0"
            androidprv:flow_verticalGap="@dimen/num_pad_entry_row_margin_bottom"
            androidprv:flow_verticalStyle="packed"
            androidprv:flow_wrapMode="aligned"

            androidprv:layout_constraintBottom_toTopOf="@+id/keyguard_selector_fade_container"
            androidprv:layout_constraintEnd_toEndOf="parent"
            androidprv:layout_constraintStart_toStartOf="parent"
            androidprv:layout_constraintTop_toBottomOf="@id/pin_pad_top_guideline" />

        <com.android.keyguard.NumPadButton
            android:id="@+id/delete_button"
            style="@style/NumPadKey.Delete"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key0"
            android:contentDescription="@string/keyboardview_keycode_delete" />

        <com.android.keyguard.NumPadButton
            android:id="@+id/key_enter"
            style="@style/NumPadKey.Enter"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:contentDescription="@string/keyboardview_keycode_enter" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key1"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key2"
            androidprv:digit="1"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key2"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key3"
            androidprv:digit="2"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key3"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key4"
            androidprv:digit="3"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key4"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key5"
            androidprv:digit="4"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key5"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key6"
            androidprv:digit="5"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key6"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key7"
            androidprv:digit="6"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key7"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key8"
            androidprv:digit="7"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key8"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key9"
            androidprv:digit="8"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key9"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/delete_button"
            androidprv:digit="9"
            androidprv:textView="@+id/pinEntry" />

        <com.android.keyguard.NumPadKey
            android:id="@+id/key0"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:accessibilityTraversalBefore="@id/key_enter"
            androidprv:digit="0"
            androidprv:textView="@+id/pinEntry" />

        <include
            android:id="@+id/keyguard_selector_fade_container"
            layout="@layout/keyguard_eca"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin"
            android:layout_marginTop="@dimen/keyguard_eca_top_margin"
            android:orientation="vertical"
            androidprv:layout_constraintBottom_toBottomOf="parent"
            androidprv:layout_constraintTop_toBottomOf="@+id/flow1" />

    </androidx.constraintlayout.motion.widget.MotionLayout>

</com.android.keyguard.KeyguardPINView>
 No newline at end of file
+0 −19
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="num_pad_key_ratio">1.51</string>
</resources>
+0 −21
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2021 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <!-- Don't use the smaller PIN pad keys if we have the screen space to support it. -->
    <string name="num_pad_key_ratio">1.0</string>
</resources>
+73 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2023, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->

<MotionScene
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto"
    xmlns:androidprv="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetStart="@id/single_constraints"
        motion:constraintSetEnd="@+id/split_constraints"
        motion:duration="0"
        motion:autoTransition="none">
    </Transition>

    <ConstraintSet android:id="@+id/single_constraints">
        <!-- No changes to default layout -->
    </ConstraintSet>

    <ConstraintSet android:id="@+id/split_constraints">

        <Constraint
            android:id="@+id/keyguard_bouncer_message_container"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            androidprv:layout_constraintEnd_toStartOf="@+id/pin_pad_center_guideline"
            androidprv:layout_constraintStart_toStartOf="parent"
            androidprv:layout_constraintTop_toTopOf="parent" />
        <Constraint
            android:id="@+id/row0"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            androidprv:layout_constraintEnd_toStartOf="@+id/pin_pad_center_guideline"
            androidprv:layout_constraintStart_toStartOf="parent"
            androidprv:layout_constraintTop_toBottomOf="@+id/keyguard_bouncer_message_container" />
        <Constraint
            android:id="@+id/flow1"
            android:layout_width="0dp"
            android:layout_height="0dp"
            androidprv:layout_constraintBottom_toBottomOf="parent"
            androidprv:layout_constraintEnd_toEndOf="parent"
            androidprv:layout_constraintStart_toStartOf="@+id/pin_pad_center_guideline"
            androidprv:layout_constraintTop_toTopOf="parent"
            android:layout_marginBottom="0dp"
            androidprv:flow_verticalBias="0.5" />
        <Constraint
            android:id="@+id/keyguard_selector_fade_container"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            androidprv:layout_constraintBottom_toBottomOf="parent"
            androidprv:layout_constraintEnd_toStartOf="@+id/pin_pad_center_guideline"
            androidprv:layout_constraintStart_toStartOf="parent"
            android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin"
            android:layout_marginTop="@dimen/keyguard_eca_top_margin" />

    </ConstraintSet>
</MotionScene>
 No newline at end of file
+4 −2
Original line number Diff line number Diff line
@@ -64,8 +64,10 @@ public abstract class KeyguardInputView extends LinearLayout {
        return false;
    }

    /** Change motion layout constraint set based on orientation */
    protected void updateConstraints(int orientation) {
    /** Updates the keyguard view's constraints (single or split constraints).
     *  Split constraints are only used for small landscape screens.
     *  Only called when flag LANDSCAPE_ENABLE_LOCKSCREEN is enabled. */
    protected void updateConstraints(boolean useSplitBouncer) {
        //Unless overridden, never update constrains (keeping default portrait constraints)
    }

Loading