Loading res/layout/choose_lock_pattern_common.xml +1 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,11 @@ <com.google.android.setupdesign.GlifLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:id="@+id/setup_wizard_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:icon="@drawable/ic_lock" android:layout="@layout/sud_glif_blank_template" settings:sucFooter="@layout/choose_lock_pattern_common_footer" settings:sucHeaderText="@string/lockpassword_choose_your_screen_lock_header"> <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient Loading res/layout/choose_lock_pattern_common_footer.xmldeleted 100644 → 0 +0 −52 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2017 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. --> <!-- TODO: Use aapt:attr when it is fixed (b/36809755) --> <com.google.android.setupdesign.view.ButtonBarLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/SudGlifButtonBar.Stackable" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- left : skip --> <Button android:id="@+id/skip_button" style="@style/SudGlifButton.Secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/skip_label" android:visibility="gone" /> <!-- left : retry --> <Button android:id="@+id/footerLeftButton" style="@style/SudGlifButton.Secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lockpattern_tutorial_cancel_label" /> <Space android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <!-- right : confirm or ok --> <Button android:id="@+id/footerRightButton" style="@style/SudGlifButton.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lockpattern_tutorial_continue_label" /> </com.google.android.setupdesign.view.ButtonBarLayout> src/com/android/settings/password/ChooseLockPattern.java +41 −25 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ import com.android.settings.core.InstrumentedFragment; import com.android.settings.notification.RedactionInterstitial; import com.google.android.collect.Lists; import com.google.android.setupcompat.item.FooterButton; import com.google.android.setupcompat.template.ButtonFooterMixin; import com.google.android.setupdesign.GlifLayout; import java.util.ArrayList; Loading Loading @@ -171,7 +173,7 @@ public class ChooseLockPattern extends SettingsActivity { } public static class ChooseLockPatternFragment extends InstrumentedFragment implements View.OnClickListener, SaveAndFinishWorker.Listener { implements SaveAndFinishWorker.Listener { public static final int CONFIRM_EXISTING_REQUEST = 55; Loading @@ -193,8 +195,8 @@ public class ChooseLockPattern extends SettingsActivity { protected TextView mMessageText; protected LockPatternView mLockPatternView; protected TextView mFooterText; private TextView mFooterLeftButton; private TextView mFooterRightButton; protected FooterButton mSkipOrClearButton; private FooterButton mNextButton; protected List<LockPatternView.Cell> mChosenPattern = null; private ColorStateList mDefaultHeaderColorList; Loading Loading @@ -232,11 +234,11 @@ public class ChooseLockPattern extends SettingsActivity { } protected void setRightButtonEnabled(boolean enabled) { mFooterRightButton.setEnabled(enabled); mNextButton.setEnabled(enabled); } protected void setRightButtonText(int text) { mFooterRightButton.setText(text); mNextButton.setText(getActivity(), text); } /** Loading Loading @@ -287,8 +289,7 @@ public class ChooseLockPattern extends SettingsActivity { mHeaderText.setTextColor(mDefaultHeaderColorList); } mFooterText.setText(""); mFooterLeftButton.setEnabled(false); mFooterRightButton.setEnabled(false); mNextButton.setEnabled(false); if (mTitleHeaderScrollView != null) { mTitleHeaderScrollView.post(new Runnable() { Loading Loading @@ -487,6 +488,27 @@ public class ChooseLockPattern extends SettingsActivity { layout.setIcon(getActivity().getDrawable(R.drawable.ic_face_header)); } } final ButtonFooterMixin mixin = layout.getMixin(ButtonFooterMixin.class); mixin.setSecondaryButton( new FooterButton.Builder(getActivity()) .setText(R.string.lockpattern_tutorial_cancel_label) .setListener(this::onSkipOrClearButtonClick) .setButtonType(FooterButton.ButtonType.OTHER) .setTheme(R.style.SudGlifButton_Secondary) .build() ); mixin.setPrimaryButton( new FooterButton.Builder(getActivity()) .setText(R.string.lockpattern_tutorial_continue_label) .setListener(this::onNextButtonClick) .setButtonType(FooterButton.ButtonType.NEXT) .setTheme(R.style.SudGlifButton_Primary) .build() ); mSkipOrClearButton = mixin.getSecondaryButton(); mNextButton = mixin.getPrimaryButton(); return layout; } Loading @@ -506,15 +528,9 @@ public class ChooseLockPattern extends SettingsActivity { mFooterText = (TextView) view.findViewById(R.id.footerText); mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); mTitleHeaderScrollView = (ScrollView) view.findViewById(R.id .scroll_layout_title_header); mFooterLeftButton.setOnClickListener(this); mFooterRightButton.setOnClickListener(this); // make it so unhandled touch events within the unlock screen go to the // lock pattern view. final LinearLayoutWithDefaultTouchRecepient topLayout Loading Loading @@ -623,12 +639,12 @@ public class ChooseLockPattern extends SettingsActivity { } } public void onClick(View v) { if (v == mFooterLeftButton) { protected void onSkipOrClearButtonClick(View view) { handleLeftButton(); } else if (v == mFooterRightButton) { handleRightButton(); } protected void onNextButtonClick(View view) { handleRightButton(); } public boolean onKeyDown(int keyCode, KeyEvent event) { Loading Loading @@ -711,7 +727,7 @@ public class ChooseLockPattern extends SettingsActivity { } } updateFooterLeftButton(stage, mFooterLeftButton); updateFooterLeftButton(stage); setRightButtonText(stage.rightMode.text); setRightButtonEnabled(stage.rightMode.enabled); Loading Loading @@ -761,13 +777,13 @@ public class ChooseLockPattern extends SettingsActivity { } } protected void updateFooterLeftButton(Stage stage, TextView footerLeftButton) { protected void updateFooterLeftButton(Stage stage) { if (stage.leftMode == LeftButtonMode.Gone) { footerLeftButton.setVisibility(View.GONE); mSkipOrClearButton.setVisibility(View.GONE); } else { footerLeftButton.setVisibility(View.VISIBLE); footerLeftButton.setText(stage.leftMode.text); footerLeftButton.setEnabled(stage.leftMode.enabled); mSkipOrClearButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setText(getActivity(), stage.leftMode.text); mSkipOrClearButton.setEnabled(stage.leftMode.enabled); } } Loading src/com/android/settings/password/SetupChooseLockPattern.java +15 −7 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ public class SetupChooseLockPattern extends ChooseLockPattern { @Nullable private Button mOptionsButton; private Button mSkipButton; private boolean mLeftButtonIsSkip; @Override public View onCreateView( Loading @@ -72,14 +72,20 @@ public class SetupChooseLockPattern extends ChooseLockPattern { .show(getChildFragmentManager(), null)); } // Show the skip button during SUW but not during Settings > Biometric Enrollment mSkipButton = view.findViewById(R.id.skip_button); mSkipButton.setOnClickListener(v -> { mSkipOrClearButton.setOnClickListener(this::onSkipOrClearButtonClick); return view; } @Override protected void onSkipOrClearButtonClick(View view) { if (mLeftButtonIsSkip) { SetupSkipDialog dialog = SetupSkipDialog.newInstance( getActivity().getIntent() .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false)); dialog.show(getFragmentManager()); }); return view; return; } super.onSkipOrClearButtonClick(view); } @Override Loading @@ -102,9 +108,11 @@ public class SetupChooseLockPattern extends ChooseLockPattern { } if (stage.leftMode == LeftButtonMode.Gone && stage == Stage.Introduction) { mSkipButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setText(getActivity(), R.string.skip_label); mLeftButtonIsSkip = true; } else { mSkipButton.setVisibility(View.GONE); mLeftButtonIsSkip = false; } } Loading tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java +27 −15 Original line number Diff line number Diff line Loading @@ -40,6 +40,9 @@ import com.android.settings.password.ChooseLockPattern.IntentBuilder; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import com.google.android.setupcompat.PartnerCustomizationLayout; import com.google.android.setupcompat.template.ButtonFooterMixin; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -143,11 +146,13 @@ public class SetupChooseLockPatternTest { @Test public void skipButton_shouldBeVisible_duringNonFingerprintFlow() { Button skipButton = mActivity.findViewById(R.id.skip_button); assertThat(skipButton).isNotNull(); assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton).isNotNull(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); skipButton.performClick(); skipOrClearButton.performClick(); AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(chooserDialog).isNotNull(); } Loading @@ -156,26 +161,33 @@ public class SetupChooseLockPatternTest { public void clearButton_shouldBeVisible_duringRetryStage() { enterPattern(); Button clearButton = mActivity.findViewById(R.id.footerLeftButton); assertThat(clearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(clearButton.isEnabled()).isTrue(); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.isEnabled()).isTrue(); clearButton.performClick(); skipOrClearButton.performClick(); assertThat(findFragment(mActivity).mChosenPattern).isNull(); } @Test public void createActivity_enterPattern_clearButtonShouldBeVisible() { public void createActivity_enterPattern_clearButtonShouldBeShown() { ChooseLockPatternFragment fragment = findFragment(mActivity); Button skipButton = mActivity.findViewById(R.id.skip_button); Button clearButton = mActivity.findViewById(R.id.footerLeftButton); assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(clearButton.getVisibility()).isEqualTo(View.GONE); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton.isEnabled()).isTrue(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.getText()) .isEqualTo(application.getString(R.string.skip_label)); enterPattern(); assertThat(skipButton.getVisibility()).isEqualTo(View.GONE); assertThat(clearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.isEnabled()).isTrue(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.getText()) .isEqualTo(application.getString(R.string.lockpattern_retry_button_text)); } private ChooseLockPatternFragment findFragment(FragmentActivity activity) { Loading Loading
res/layout/choose_lock_pattern_common.xml +1 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,11 @@ <com.google.android.setupdesign.GlifLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:id="@+id/setup_wizard_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:icon="@drawable/ic_lock" android:layout="@layout/sud_glif_blank_template" settings:sucFooter="@layout/choose_lock_pattern_common_footer" settings:sucHeaderText="@string/lockpassword_choose_your_screen_lock_header"> <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient Loading
res/layout/choose_lock_pattern_common_footer.xmldeleted 100644 → 0 +0 −52 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2017 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. --> <!-- TODO: Use aapt:attr when it is fixed (b/36809755) --> <com.google.android.setupdesign.view.ButtonBarLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/SudGlifButtonBar.Stackable" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- left : skip --> <Button android:id="@+id/skip_button" style="@style/SudGlifButton.Secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/skip_label" android:visibility="gone" /> <!-- left : retry --> <Button android:id="@+id/footerLeftButton" style="@style/SudGlifButton.Secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lockpattern_tutorial_cancel_label" /> <Space android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <!-- right : confirm or ok --> <Button android:id="@+id/footerRightButton" style="@style/SudGlifButton.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lockpattern_tutorial_continue_label" /> </com.google.android.setupdesign.view.ButtonBarLayout>
src/com/android/settings/password/ChooseLockPattern.java +41 −25 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ import com.android.settings.core.InstrumentedFragment; import com.android.settings.notification.RedactionInterstitial; import com.google.android.collect.Lists; import com.google.android.setupcompat.item.FooterButton; import com.google.android.setupcompat.template.ButtonFooterMixin; import com.google.android.setupdesign.GlifLayout; import java.util.ArrayList; Loading Loading @@ -171,7 +173,7 @@ public class ChooseLockPattern extends SettingsActivity { } public static class ChooseLockPatternFragment extends InstrumentedFragment implements View.OnClickListener, SaveAndFinishWorker.Listener { implements SaveAndFinishWorker.Listener { public static final int CONFIRM_EXISTING_REQUEST = 55; Loading @@ -193,8 +195,8 @@ public class ChooseLockPattern extends SettingsActivity { protected TextView mMessageText; protected LockPatternView mLockPatternView; protected TextView mFooterText; private TextView mFooterLeftButton; private TextView mFooterRightButton; protected FooterButton mSkipOrClearButton; private FooterButton mNextButton; protected List<LockPatternView.Cell> mChosenPattern = null; private ColorStateList mDefaultHeaderColorList; Loading Loading @@ -232,11 +234,11 @@ public class ChooseLockPattern extends SettingsActivity { } protected void setRightButtonEnabled(boolean enabled) { mFooterRightButton.setEnabled(enabled); mNextButton.setEnabled(enabled); } protected void setRightButtonText(int text) { mFooterRightButton.setText(text); mNextButton.setText(getActivity(), text); } /** Loading Loading @@ -287,8 +289,7 @@ public class ChooseLockPattern extends SettingsActivity { mHeaderText.setTextColor(mDefaultHeaderColorList); } mFooterText.setText(""); mFooterLeftButton.setEnabled(false); mFooterRightButton.setEnabled(false); mNextButton.setEnabled(false); if (mTitleHeaderScrollView != null) { mTitleHeaderScrollView.post(new Runnable() { Loading Loading @@ -487,6 +488,27 @@ public class ChooseLockPattern extends SettingsActivity { layout.setIcon(getActivity().getDrawable(R.drawable.ic_face_header)); } } final ButtonFooterMixin mixin = layout.getMixin(ButtonFooterMixin.class); mixin.setSecondaryButton( new FooterButton.Builder(getActivity()) .setText(R.string.lockpattern_tutorial_cancel_label) .setListener(this::onSkipOrClearButtonClick) .setButtonType(FooterButton.ButtonType.OTHER) .setTheme(R.style.SudGlifButton_Secondary) .build() ); mixin.setPrimaryButton( new FooterButton.Builder(getActivity()) .setText(R.string.lockpattern_tutorial_continue_label) .setListener(this::onNextButtonClick) .setButtonType(FooterButton.ButtonType.NEXT) .setTheme(R.style.SudGlifButton_Primary) .build() ); mSkipOrClearButton = mixin.getSecondaryButton(); mNextButton = mixin.getPrimaryButton(); return layout; } Loading @@ -506,15 +528,9 @@ public class ChooseLockPattern extends SettingsActivity { mFooterText = (TextView) view.findViewById(R.id.footerText); mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); mTitleHeaderScrollView = (ScrollView) view.findViewById(R.id .scroll_layout_title_header); mFooterLeftButton.setOnClickListener(this); mFooterRightButton.setOnClickListener(this); // make it so unhandled touch events within the unlock screen go to the // lock pattern view. final LinearLayoutWithDefaultTouchRecepient topLayout Loading Loading @@ -623,12 +639,12 @@ public class ChooseLockPattern extends SettingsActivity { } } public void onClick(View v) { if (v == mFooterLeftButton) { protected void onSkipOrClearButtonClick(View view) { handleLeftButton(); } else if (v == mFooterRightButton) { handleRightButton(); } protected void onNextButtonClick(View view) { handleRightButton(); } public boolean onKeyDown(int keyCode, KeyEvent event) { Loading Loading @@ -711,7 +727,7 @@ public class ChooseLockPattern extends SettingsActivity { } } updateFooterLeftButton(stage, mFooterLeftButton); updateFooterLeftButton(stage); setRightButtonText(stage.rightMode.text); setRightButtonEnabled(stage.rightMode.enabled); Loading Loading @@ -761,13 +777,13 @@ public class ChooseLockPattern extends SettingsActivity { } } protected void updateFooterLeftButton(Stage stage, TextView footerLeftButton) { protected void updateFooterLeftButton(Stage stage) { if (stage.leftMode == LeftButtonMode.Gone) { footerLeftButton.setVisibility(View.GONE); mSkipOrClearButton.setVisibility(View.GONE); } else { footerLeftButton.setVisibility(View.VISIBLE); footerLeftButton.setText(stage.leftMode.text); footerLeftButton.setEnabled(stage.leftMode.enabled); mSkipOrClearButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setText(getActivity(), stage.leftMode.text); mSkipOrClearButton.setEnabled(stage.leftMode.enabled); } } Loading
src/com/android/settings/password/SetupChooseLockPattern.java +15 −7 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ public class SetupChooseLockPattern extends ChooseLockPattern { @Nullable private Button mOptionsButton; private Button mSkipButton; private boolean mLeftButtonIsSkip; @Override public View onCreateView( Loading @@ -72,14 +72,20 @@ public class SetupChooseLockPattern extends ChooseLockPattern { .show(getChildFragmentManager(), null)); } // Show the skip button during SUW but not during Settings > Biometric Enrollment mSkipButton = view.findViewById(R.id.skip_button); mSkipButton.setOnClickListener(v -> { mSkipOrClearButton.setOnClickListener(this::onSkipOrClearButtonClick); return view; } @Override protected void onSkipOrClearButtonClick(View view) { if (mLeftButtonIsSkip) { SetupSkipDialog dialog = SetupSkipDialog.newInstance( getActivity().getIntent() .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false)); dialog.show(getFragmentManager()); }); return view; return; } super.onSkipOrClearButtonClick(view); } @Override Loading @@ -102,9 +108,11 @@ public class SetupChooseLockPattern extends ChooseLockPattern { } if (stage.leftMode == LeftButtonMode.Gone && stage == Stage.Introduction) { mSkipButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setVisibility(View.VISIBLE); mSkipOrClearButton.setText(getActivity(), R.string.skip_label); mLeftButtonIsSkip = true; } else { mSkipButton.setVisibility(View.GONE); mLeftButtonIsSkip = false; } } Loading
tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java +27 −15 Original line number Diff line number Diff line Loading @@ -40,6 +40,9 @@ import com.android.settings.password.ChooseLockPattern.IntentBuilder; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import com.google.android.setupcompat.PartnerCustomizationLayout; import com.google.android.setupcompat.template.ButtonFooterMixin; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -143,11 +146,13 @@ public class SetupChooseLockPatternTest { @Test public void skipButton_shouldBeVisible_duringNonFingerprintFlow() { Button skipButton = mActivity.findViewById(R.id.skip_button); assertThat(skipButton).isNotNull(); assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton).isNotNull(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); skipButton.performClick(); skipOrClearButton.performClick(); AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(chooserDialog).isNotNull(); } Loading @@ -156,26 +161,33 @@ public class SetupChooseLockPatternTest { public void clearButton_shouldBeVisible_duringRetryStage() { enterPattern(); Button clearButton = mActivity.findViewById(R.id.footerLeftButton); assertThat(clearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(clearButton.isEnabled()).isTrue(); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.isEnabled()).isTrue(); clearButton.performClick(); skipOrClearButton.performClick(); assertThat(findFragment(mActivity).mChosenPattern).isNull(); } @Test public void createActivity_enterPattern_clearButtonShouldBeVisible() { public void createActivity_enterPattern_clearButtonShouldBeShown() { ChooseLockPatternFragment fragment = findFragment(mActivity); Button skipButton = mActivity.findViewById(R.id.skip_button); Button clearButton = mActivity.findViewById(R.id.footerLeftButton); assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(clearButton.getVisibility()).isEqualTo(View.GONE); PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout); final Button skipOrClearButton = layout.getMixin(ButtonFooterMixin.class).getSecondaryButtonView(); assertThat(skipOrClearButton.isEnabled()).isTrue(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.getText()) .isEqualTo(application.getString(R.string.skip_label)); enterPattern(); assertThat(skipButton.getVisibility()).isEqualTo(View.GONE); assertThat(clearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.isEnabled()).isTrue(); assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE); assertThat(skipOrClearButton.getText()) .isEqualTo(application.getString(R.string.lockpattern_retry_button_text)); } private ChooseLockPatternFragment findFragment(FragmentActivity activity) { Loading