diff --git a/res/layout/face_enroll_accessibility_toggle.xml b/res/layout/face_enroll_accessibility_toggle.xml
new file mode 100644
index 00000000000..4dda2a76920
--- /dev/null
+++ b/res/layout/face_enroll_accessibility_toggle.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml
index 7a5c172dac6..025c2396c01 100644
--- a/res/layout/face_enroll_introduction.xml
+++ b/res/layout/face_enroll_introduction.xml
@@ -18,6 +18,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 383506dbb1d..806e148bc9d 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -146,6 +146,11 @@
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d07cc53fe80..da05a41cd33 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -877,6 +877,12 @@
Tap to set up face authentication
Face authentication
+
+ Use accessibility setup
+
+
+
+
Cancel
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 2597b297346..7a066711773 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -40,8 +40,10 @@ import com.google.android.setupdesign.GlifLayout;
*/
public abstract class BiometricEnrollBase extends InstrumentedActivity
implements View.OnClickListener {
- public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock";
+ public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock";
+ public static final String EXTRA_KEY_REQUIRE_VISION = "accessibility_vision";
+ public static final String EXTRA_KEY_REQUIRE_DIVERSITY = "accessibility_diversity";
/**
* Used by the choose fingerprint wizard to indicate the wizard is
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
new file mode 100644
index 00000000000..49f4f7fd660
--- /dev/null
+++ b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 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.biometrics.face;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+/**
+ * A layout that contains a start-justified title, and an end-justified switch.
+ */
+public class FaceEnrollAccessibilityToggle extends LinearLayout {
+
+ private Switch mSwitch;
+
+ public FaceEnrollAccessibilityToggle(Context context) {
+ this(context, null /* attrs */);
+ }
+
+ public FaceEnrollAccessibilityToggle(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public FaceEnrollAccessibilityToggle(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+
+ LayoutInflater.from(context).inflate(R.layout.face_enroll_accessibility_toggle,
+ this, true /* attachToRoot */);
+
+ final TypedArray a =
+ context.obtainStyledAttributes(attrs, R.styleable.FaceEnrollAccessibilityToggle);
+ try {
+ final CharSequence title =
+ a.getText(R.styleable.FaceEnrollAccessibilityToggle_messageText);
+ final TextView titleTextView = findViewById(R.id.title);
+ titleTextView.setText(title);
+ } finally {
+ a.recycle();
+ }
+ mSwitch = findViewById(R.id.toggle);
+ }
+
+ public boolean isChecked() {
+ return mSwitch.isChecked();
+ }
+}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
index bb46b1896f4..990eef47de9 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
@@ -29,11 +29,12 @@ import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.Utils;
+import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricEnrollSidecar;
import com.android.settings.biometrics.BiometricErrorDialog;
import com.android.settings.biometrics.BiometricsEnrollEnrolling;
-import com.android.settings.password.ChooseLockSettingsHelper;
+
+import java.util.ArrayList;
public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling {
@@ -46,6 +47,8 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling {
private Interpolator mLinearOutSlowInInterpolator;
private FaceEnrollPreviewFragment mPreviewFragment;
+ private ArrayList mDisabledFeatures = new ArrayList<>();
+
private FaceFeatureProvider.Listener mListener = new FaceFeatureProvider.Listener() {
@Override
public void onEnrolled() {
@@ -91,6 +94,13 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling {
Button skipButton = findViewById(R.id.skip_button);
skipButton.setOnClickListener(this);
+ if (!getIntent().getBooleanExtra(BiometricEnrollBase.EXTRA_KEY_REQUIRE_DIVERSITY, true)) {
+ mDisabledFeatures.add(FaceManager.FEATURE_REQUIRE_REQUIRE_DIVERSITY);
+ }
+ if (!getIntent().getBooleanExtra(BiometricEnrollBase.EXTRA_KEY_REQUIRE_VISION, true)) {
+ mDisabledFeatures.add(FaceManager.FEATURE_REQUIRE_ATTENTION);
+ }
+
startEnrollment();
}
@@ -114,7 +124,12 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling {
@Override
protected BiometricEnrollSidecar getSidecar() {
- return new FaceEnrollSidecar();
+ final int[] disabledFeatures = new int[mDisabledFeatures.size()];
+ for (int i = 0; i < mDisabledFeatures.size(); i++) {
+ disabledFeatures[i] = mDisabledFeatures.get(i);
+ }
+
+ return new FaceEnrollSidecar(disabledFeatures);
}
@Override
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index b720ff4c728..e221c965863 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -20,7 +20,9 @@ import android.app.admin.DevicePolicyManager;
import android.content.Intent;
import android.hardware.face.FaceManager;
import android.os.Bundle;
+import android.view.View;
import android.widget.Button;
+import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
@@ -37,11 +39,22 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
private static final String TAG = "FaceIntro";
private FaceManager mFaceManager;
+ private FaceEnrollAccessibilityToggle mSwitchVision;
+ private FaceEnrollAccessibilityToggle mSwitchDiversity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFaceManager = Utils.getFaceManagerOrNull(this);
+ final LinearLayout accessibilityLayout = findViewById(R.id.accessibility_layout);
+ final Button accessibilityButton = findViewById(R.id.accessibility_button);
+ accessibilityButton.setOnClickListener(view -> {
+ accessibilityButton.setVisibility(View.INVISIBLE);
+ accessibilityLayout.setVisibility(View.VISIBLE);
+ });
+
+ mSwitchVision = findViewById(R.id.toggle_vision);
+ mSwitchDiversity = findViewById(R.id.toggle_diversity);
}
@Override
@@ -116,7 +129,10 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
@Override
protected Intent getEnrollingIntent() {
- return new Intent(this, FaceEnrollEnrolling.class);
+ final Intent intent = new Intent(this, FaceEnrollEnrolling.class);
+ intent.putExtra(EXTRA_KEY_REQUIRE_VISION, mSwitchVision.isChecked());
+ intent.putExtra(EXTRA_KEY_REQUIRE_DIVERSITY, mSwitchDiversity.isChecked());
+ return intent;
}
@Override
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java
index 2433fcb7892..75195305093 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java
@@ -24,13 +24,22 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollSidecar;
+import java.util.ArrayList;
+import java.util.Arrays;
+
/**
* Sidecar fragment to handle the state around face enrollment
*/
public class FaceEnrollSidecar extends BiometricEnrollSidecar {
+ private final int[] mDisabledFeatures;
+
private FaceManager mFaceManager;
+ public FaceEnrollSidecar(int[] disabledFeatures) {
+ mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length);
+ }
+
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
@@ -43,9 +52,9 @@ public class FaceEnrollSidecar extends BiometricEnrollSidecar {
if (mUserId != UserHandle.USER_NULL) {
mFaceManager.setActiveUser(mUserId);
}
- // TODO: Send the list of disabled features
+
mFaceManager.enroll(mToken, mEnrollmentCancel,
- mEnrollmentCallback, new int[0] /* disabledFeatures */);
+ mEnrollmentCallback, mDisabledFeatures);
}
private FaceManager.EnrollmentCallback mEnrollmentCallback