Landscape PIN bouncer: refactor of portrait layout
Portrait layout moved to a separate file and is now included in keyguard_pin_view. This is done in preparation for the implementation of a landscape layout for the pin view where the portrait layout will be referenced multiple times, so the refactor is to avoid code duplication in the future (as the separate portrait layout file can be included multiple times, avoiding duplication). Bug: 293427037 Test: KeyguardSecurityViewFlipperControllerTest Change-Id: I5d7c8c02f6c448755cb5726fd9d59524d9f2719a
This commit is contained in:
committed by
Jonathon Axford
parent
51056127dc
commit
e11fb91ddb
@@ -16,202 +16,10 @@
|
||||
** limitations under the License.
|
||||
*/
|
||||
-->
|
||||
|
||||
<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"
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
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"
|
||||
androidprv:layout_maxWidth="@dimen/keyguard_security_width">
|
||||
<include layout="@layout/keyguard_bouncer_message_area"/>
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<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" />
|
||||
<include layout="@layout/keyguard_pin_view_portrait" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/pin_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
android:layout_weight="1"
|
||||
android:layoutDirection="ltr"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- 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_constraintTop_toTopOf="parent"
|
||||
androidprv:layout_constraintEnd_toEndOf="parent"
|
||||
androidprv:layout_constraintStart_toStartOf="parent"
|
||||
androidprv:layout_constraintBottom_toTopOf="@id/key1"
|
||||
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>
|
||||
|
||||
<!-- 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"
|
||||
androidprv:layout_constraintGuide_percent="0"
|
||||
android:orientation="horizontal" />
|
||||
|
||||
<com.android.keyguard.KeyguardPinFlowView
|
||||
android:id="@+id/flow1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="horizontal"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
|
||||
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_toBottomOf="parent"
|
||||
androidprv:layout_constraintEnd_toEndOf="parent"
|
||||
androidprv:layout_constraintStart_toStartOf="parent"
|
||||
androidprv:layout_constraintTop_toBottomOf="@id/pin_pad_top_guideline" />
|
||||
|
||||
<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.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.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" />
|
||||
|
||||
<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" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<include layout="@layout/keyguard_eca"
|
||||
android:id="@+id/keyguard_selector_fade_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_marginTop="@dimen/keyguard_eca_top_margin"
|
||||
android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
</com.android.keyguard.KeyguardPINView>
|
||||
</FrameLayout>
|
||||
|
||||
@@ -0,0 +1,218 @@
|
||||
<?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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<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"
|
||||
androidprv:layout_maxWidth="@dimen/keyguard_security_width">
|
||||
|
||||
<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" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/pin_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
android:layout_weight="1"
|
||||
android:layoutDirection="ltr"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- 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_constraintTop_toTopOf="parent"
|
||||
androidprv:layout_constraintEnd_toEndOf="parent"
|
||||
androidprv:layout_constraintStart_toStartOf="parent"
|
||||
androidprv:layout_constraintBottom_toTopOf="@id/key1"
|
||||
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>
|
||||
|
||||
<!-- 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"
|
||||
androidprv:layout_constraintGuide_percent="0"
|
||||
android:orientation="horizontal" />
|
||||
|
||||
<com.android.keyguard.KeyguardPinFlowView
|
||||
android:id="@+id/flow1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="horizontal"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
|
||||
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_toBottomOf="parent"
|
||||
androidprv:layout_constraintEnd_toEndOf="parent"
|
||||
androidprv:layout_constraintStart_toStartOf="parent"
|
||||
androidprv:layout_constraintTop_toBottomOf="@id/pin_pad_top_guideline" />
|
||||
|
||||
<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.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.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" />
|
||||
|
||||
<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" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<include layout="@layout/keyguard_eca"
|
||||
android:id="@+id/keyguard_selector_fade_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_marginTop="@dimen/keyguard_eca_top_margin"
|
||||
android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
</com.android.keyguard.KeyguardPINView>
|
||||
@@ -117,15 +117,19 @@ public class KeyguardSecurityViewFlipperController
|
||||
KeyguardSecurityCallback keyguardSecurityCallback,
|
||||
@Nullable OnViewInflatedCallback onViewInflatedListener) {
|
||||
int layoutId = getLayoutIdFor(securityMode);
|
||||
if (layoutId != 0) {
|
||||
if (DEBUG) Log.v(TAG, "inflating on bg thread id = " + layoutId);
|
||||
int viewID = getKeyguardInputViewId(securityMode);
|
||||
if (layoutId != 0 && viewID != 0) {
|
||||
if (DEBUG) {
|
||||
Log.v(TAG, "inflating on bg thread id = "
|
||||
+ layoutId + " . viewID = " + viewID);
|
||||
}
|
||||
mAsyncLayoutInflater.inflate(layoutId, mView,
|
||||
(view, resId, parent) -> {
|
||||
mView.addView(view);
|
||||
KeyguardInputViewController<KeyguardInputView> childController =
|
||||
mKeyguardSecurityViewControllerFactory.create(
|
||||
(KeyguardInputView) view, securityMode,
|
||||
keyguardSecurityCallback);
|
||||
(KeyguardInputView) view.findViewById(viewID),
|
||||
securityMode, keyguardSecurityCallback);
|
||||
childController.init();
|
||||
mChildren.add(childController);
|
||||
if (onViewInflatedListener != null) {
|
||||
@@ -147,6 +151,19 @@ public class KeyguardSecurityViewFlipperController
|
||||
}
|
||||
}
|
||||
|
||||
private int getKeyguardInputViewId(SecurityMode securityMode) {
|
||||
//Keyguard Input View is not the root view of the layout, use these IDs for lookup.
|
||||
switch (securityMode) {
|
||||
case Pattern: return R.id.keyguard_pattern_view;
|
||||
case PIN: return R.id.keyguard_pin_view;
|
||||
case Password: return R.id.keyguard_password_view;
|
||||
case SimPin: return R.id.keyguard_sim_pin_view;
|
||||
case SimPuk: return R.id.keyguard_sim_puk_view;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** Makes the supplied child visible if it is contained win this view, */
|
||||
public void show(KeyguardInputViewController<KeyguardInputView> childController) {
|
||||
int index = childController.getIndexIn(mView);
|
||||
|
||||
@@ -138,6 +138,11 @@ public class KeyguardSecurityViewFlipperControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void asynchronouslyInflateView_setNeedsInput() {
|
||||
when(mKeyguardSecurityViewControllerFactory.create(
|
||||
any(), any(SecurityMode.class),
|
||||
any(KeyguardSecurityCallback.class)))
|
||||
.thenReturn(mKeyguardInputViewController);
|
||||
|
||||
ArgumentCaptor<AsyncLayoutInflater.OnInflateFinishedListener> argumentCaptor =
|
||||
ArgumentCaptor.forClass(AsyncLayoutInflater.OnInflateFinishedListener.class);
|
||||
mKeyguardSecurityViewFlipperController.asynchronouslyInflateView(SecurityMode.PIN,
|
||||
|
||||
Reference in New Issue
Block a user