From 016e4c6dada363d631f444e2d7ac07f722a26670 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Thu, 27 Oct 2016 11:22:39 -0700 Subject: [PATCH] Hide next button when max fingerprints enrolled Hide the next button in FingerprintEnrollIntroduction when the maximum number of fingerprints is enrolled, and show a message telling the user about the error. Test: Added FingerprintEnrollIntroductionTest Bug: 32406375 Change-Id: If8e3c4f5eb13dd2b3edb5c0442d8f34a16a22674 --- .../fingerprint_enroll_introduction.xml | 6 + res/values/strings.xml | 4 + .../FingerprintEnrollIntroduction.java | 31 ++++- .../FingerprintEnrollIntroductionTest.java | 109 ++++++++++++++++++ 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 tests/unit/src/com/android/settings/fingerprint/FingerprintEnrollIntroductionTest.java diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml index 2348b6a6dee..ccd1f62dbbe 100644 --- a/res/layout/fingerprint_enroll_introduction.xml +++ b/res/layout/fingerprint_enroll_introduction.xml @@ -35,6 +35,12 @@ android:layout_height="wrap_content" android:text="@string/security_settings_fingerprint_enroll_introduction_message" /> + + You can add up to %d fingerprints + + You\u2019ve added the maximum number of fingerprints + + Can\u2019t add more fingerprints Remove all fingerprints? diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java index bbaf54c2aea..551564dea83 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java @@ -52,6 +52,7 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase private UserManager mUserManager; private boolean mHasPassword; private boolean mFingerprintUnlockDisabledByAdmin; + private TextView mErrorText; @Override protected void onCreate(Bundle savedInstanceState) { @@ -67,13 +68,41 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title); } - final Button cancelButton = (Button) findViewById(R.id.fingerprint_cancel_button); + Button cancelButton = (Button) findViewById(R.id.fingerprint_cancel_button); cancelButton.setOnClickListener(this); + mErrorText = (TextView) findViewById(R.id.error_text); + mUserManager = UserManager.get(this); updatePasswordQuality(); } + @Override + protected void onResume() { + super.onResume(); + + final FingerprintManager fingerprintManager = Utils.getFingerprintManagerOrNull(this); + int errorMsg = 0; + if (fingerprintManager != null) { + final int max = getResources().getInteger( + com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); + final int numEnrolledFingerprints = + fingerprintManager.getEnrolledFingerprints(mUserId).size(); + if (numEnrolledFingerprints >= max) { + errorMsg = R.string.fingerprint_intro_error_max; + } + } else { + errorMsg = R.string.fingerprint_intro_error_unknown; + } + if (errorMsg == 0) { + mErrorText.setText(null); + getNextButton().setVisibility(View.VISIBLE); + } else { + mErrorText.setText(errorMsg); + getNextButton().setVisibility(View.GONE); + } + } + private void updatePasswordQuality() { final int passwordQuality = new ChooseLockSettingsHelper(this).utils() .getActivePasswordQuality(mUserManager.getCredentialOwnerProfile(mUserId)); diff --git a/tests/unit/src/com/android/settings/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/unit/src/com/android/settings/fingerprint/FingerprintEnrollIntroductionTest.java new file mode 100644 index 00000000000..235ba1e43f0 --- /dev/null +++ b/tests/unit/src/com/android/settings/fingerprint/FingerprintEnrollIntroductionTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2016 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. + */ + +package com.android.settings.fingerprint; + + +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doReturn; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintManager; +import android.test.ActivityUnitTestCase; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.android.settings.R; + +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +public class FingerprintEnrollIntroductionTest + extends ActivityUnitTestCase { + + private TestContext mContext; + + @Mock + private FingerprintManager mFingerprintManager; + + private FingerprintEnrollIntroduction mActivity; + + public FingerprintEnrollIntroductionTest() { + super(FingerprintEnrollIntroduction.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + MockitoAnnotations.initMocks(this); + mContext = new TestContext(getInstrumentation().getTargetContext()); + setActivityContext(mContext); + + getInstrumentation().runOnMainSync(() -> { + final Intent intent = new Intent(); + mActivity = startActivity(intent, + null /* savedInstanceState */, null /* lastNonConfigurationInstance */); + }); + } + + public void testMaxFingerprint_shouldShowErrorMessage() { + final int max = mContext.getResources().getInteger( + com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); + doReturn(generateFingerprintList(max)).when(mFingerprintManager) + .getEnrolledFingerprints(anyInt()); + + getInstrumentation().runOnMainSync(() -> { + getInstrumentation().callActivityOnCreate(mActivity, null); + getInstrumentation().callActivityOnResume(mActivity); + }); + + final TextView errorTextView = (TextView) mActivity.findViewById(R.id.error_text); + assertNotNull(errorTextView.getText().toString()); + + final Button nextButton = (Button) mActivity.findViewById(R.id.fingerprint_next_button); + assertEquals(View.GONE, nextButton.getVisibility()); + } + + private List generateFingerprintList(int num) { + ArrayList list = new ArrayList<>(); + for (int i = 0; i < num; i++) { + list.add(new Fingerprint("Fingerprint " + i, 0, i, 0)); + } + return list; + } + + public class TestContext extends ContextWrapper { + + public TestContext(Context base) { + super(base); + } + + @Override + public Object getSystemService(String name) { + if (Context.FINGERPRINT_SERVICE.equals(name)) { + return mFingerprintManager; + } + return super.getSystemService(name); + } + } +}