diff --git a/src/com/android/settings/biometrics/face/FaceEnrollAnimationDrawable.java b/src/com/android/settings/biometrics/face/FaceEnrollAnimationDrawable.java
index b6ad565..5be7c53 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollAnimationDrawable.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollAnimationDrawable.java
@@ -29,7 +29,6 @@
 import android.graphics.drawable.Drawable;
 
 import com.android.settings.biometrics.BiometricEnrollSidecar;
-import com.android.settings.overlay.FeatureFactory;
 
 /**
  * A drawable containing the circle cutout as well as the animations.
@@ -42,17 +41,17 @@
     private static final int BORDER_BOUNDS = 20;
 
     private final Context mContext;
-    private final FaceFeatureProvider.Listener mListener;
+    private final ParticleCollection.Listener mListener;
     private Rect mBounds;
     private final Paint mSquarePaint;
     private final Paint mCircleCutoutPaint;
 
-    private FaceFeatureProvider.EnrollingAnimation mEnrollingAnimation;
+    private ParticleCollection mParticleCollection;
 
     private TimeAnimator mTimeAnimator;
 
-    private final FaceFeatureProvider.Listener mAnimationListener
-            = new FaceFeatureProvider.Listener() {
+    private final ParticleCollection.Listener mAnimationListener
+            = new ParticleCollection.Listener() {
         @Override
         public void onEnrolled() {
             if (mTimeAnimator != null && mTimeAnimator.isStarted()) {
@@ -62,7 +61,7 @@
         }
     };
 
-    public FaceEnrollAnimationDrawable(Context context, FaceFeatureProvider.Listener listener) {
+    public FaceEnrollAnimationDrawable(Context context, ParticleCollection.Listener listener) {
         mContext = context;
         mListener = listener;
 
@@ -78,29 +77,29 @@
 
     @Override
     public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
-        mEnrollingAnimation.onEnrollmentHelp(helpMsgId, helpString);
+        mParticleCollection.onEnrollmentHelp(helpMsgId, helpString);
     }
 
     @Override
     public void onEnrollmentError(int errMsgId, CharSequence errString) {
-        mEnrollingAnimation.onEnrollmentError(errMsgId, errString);
+        mParticleCollection.onEnrollmentError(errMsgId, errString);
     }
 
     @Override
     public void onEnrollmentProgressChange(int steps, int remaining) {
-        mEnrollingAnimation.onEnrollmentProgressChange(steps, remaining);
+        mParticleCollection.onEnrollmentProgressChange(steps, remaining);
     }
 
     @Override
     protected void onBoundsChange(Rect bounds) {
         mBounds = bounds;
-        mEnrollingAnimation = FeatureFactory.getFactory(mContext).getFaceFeatureProvider()
-                .getEnrollingAnimation(mContext, mAnimationListener, bounds, BORDER_BOUNDS);
+        mParticleCollection =
+                new ParticleCollection(mContext, mAnimationListener, bounds, BORDER_BOUNDS);
 
         if (mTimeAnimator == null) {
             mTimeAnimator = new TimeAnimator();
             mTimeAnimator.setTimeListener((animation, totalTimeMs, deltaTimeMs) -> {
-                mEnrollingAnimation.update(totalTimeMs, deltaTimeMs);
+                mParticleCollection.update(totalTimeMs, deltaTimeMs);
                 FaceEnrollAnimationDrawable.this.invalidateSelf();
             });
             mTimeAnimator.start();
@@ -122,7 +121,7 @@
                 mBounds.height() / 2 - BORDER_BOUNDS, mCircleCutoutPaint);
 
         // Draw the animation
-        mEnrollingAnimation.draw(canvas);
+        mParticleCollection.draw(canvas);
 
         canvas.restore();
     }
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
index 9ef04cb..8cc7133 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
@@ -49,8 +49,7 @@
     private FaceEnrollPreviewFragment mPreviewFragment;
 
     private ArrayList<Integer> mDisabledFeatures = new ArrayList<>();
-
-    private FaceFeatureProvider.Listener mListener = new FaceFeatureProvider.Listener() {
+    private ParticleCollection.Listener mListener = new ParticleCollection.Listener() {
         @Override
         public void onEnrolled() {
             FaceEnrollEnrolling.this.launchFinish(mToken);
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java b/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
index a370875..a543584 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
@@ -63,7 +63,7 @@
     private CameraCaptureSession mCaptureSession;
     private CaptureRequest mPreviewRequest;
     private Size mPreviewSize;
-    private FaceFeatureProvider.Listener mListener;
+    private ParticleCollection.Listener mListener;
 
     // View used to contain the circular cutout and enrollment animation drawable
     private ImageView mCircleView;
@@ -75,8 +75,8 @@
     private FaceSquareTextureView mTextureView;
 
     // Listener sent to the animation drawable
-    private final FaceFeatureProvider.Listener mAnimationListener
-            = new FaceFeatureProvider.Listener() {
+    private final ParticleCollection.Listener mAnimationListener
+            = new ParticleCollection.Listener() {
         @Override
         public void onEnrolled() {
             mListener.onEnrolled();
@@ -234,7 +234,7 @@
         mAnimationDrawable.onEnrollmentProgressChange(steps, remaining);
     }
 
-    public void setListener(FaceFeatureProvider.Listener listener) {
+    public void setListener(ParticleCollection.Listener listener) {
         mListener = listener;
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceFeatureProvider.java b/src/com/android/settings/biometrics/face/FaceFeatureProvider.java
deleted file mode 100644
index e2f62d3..0000000
--- a/src/com/android/settings/biometrics/face/FaceFeatureProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.graphics.Canvas;
-import android.graphics.Rect;
-
-/**
- * Feature provider for face authentication.
- */
-public interface FaceFeatureProvider {
-
-    interface EnrollingAnimation {
-        void onEnrollmentHelp(int helpMsgId, CharSequence helpString);
-        void onEnrollmentError(int errMsgId, CharSequence errString);
-        void onEnrollmentProgressChange(int steps, int remaining);
-        void draw(Canvas canvas);
-        void update(long t, long dt);
-    }
-
-    interface Listener {
-        void onEnrolled();
-    }
-
-    EnrollingAnimation getEnrollingAnimation(Context context, Listener listener, Rect bounds,
-            int borderWidth);
-}
diff --git a/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java b/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java
deleted file mode 100644
index 3f65669..0000000
--- a/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.graphics.Rect;
-
-public class FaceFeatureProviderImpl implements FaceFeatureProvider {
-    @Override
-    public EnrollingAnimation getEnrollingAnimation(Context context, Listener listener, Rect bounds,
-            int borderWidth) {
-        return new ParticleCollection(context, listener, bounds, borderWidth);
-    }
-}
diff --git a/src/com/android/settings/biometrics/face/ParticleCollection.java b/src/com/android/settings/biometrics/face/ParticleCollection.java
index b345ab5..399beec 100644
--- a/src/com/android/settings/biometrics/face/ParticleCollection.java
+++ b/src/com/android/settings/biometrics/face/ParticleCollection.java
@@ -35,7 +35,7 @@
  * are updated/drawn in a special order so that the overlap is correct during the final completion
  * effect.
  */
-public class ParticleCollection implements FaceFeatureProviderImpl.EnrollingAnimation {
+public class ParticleCollection implements BiometricEnrollSidecar.Listener {
 
     private static final String TAG = "AnimationController";
 
@@ -49,7 +49,11 @@
     private final List<AnimationParticle> mParticleList;
     private final List<Integer> mPrimariesInProgress; // primary particles not done animating yet
     private int mState;
-    private FaceFeatureProvider.Listener mListener;
+    private Listener mListener;
+
+    public interface Listener {
+        void onEnrolled();
+    }
 
     private final AnimationParticle.Listener mParticleListener = new AnimationParticle.Listener() {
         @Override
@@ -68,8 +72,7 @@
         }
     };
 
-    public ParticleCollection(Context context, FaceFeatureProvider.Listener listener, Rect bounds,
-            int borderWidth) {
+    public ParticleCollection(Context context, Listener listener, Rect bounds, int borderWidth) {
         mParticleList = new ArrayList<>();
         mListener = listener;
 
@@ -100,14 +103,12 @@
         updateState(STATE_STARTED);
     }
 
-    @Override
     public void update(long t, long dt) {
         for (int i = 0; i < mParticleList.size(); i++) {
             mParticleList.get(i).update(t, dt);
         }
     }
 
-    @Override
     public void draw(Canvas canvas) {
         for (int i = 0; i < mParticleList.size(); i++) {
             mParticleList.get(i).draw(canvas);
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index cf7df8d..1d12c95 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -23,7 +23,6 @@
 import com.android.settings.R;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
-import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
@@ -113,8 +112,6 @@
 
     public abstract ContextualCardFeatureProvider getContextualCardFeatureProvider(Context context);
 
-    public abstract FaceFeatureProvider getFaceFeatureProvider();
-
     public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
 
     public static final class FactoryNotFoundException extends RuntimeException {
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index e10aa41..ff40158 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -28,8 +28,6 @@
 import com.android.settings.accounts.AccountFeatureProviderImpl;
 import com.android.settings.applications.ApplicationFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProviderImpl;
-import com.android.settings.biometrics.face.FaceFeatureProvider;
-import com.android.settings.biometrics.face.FaceFeatureProviderImpl;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProviderImpl;
 import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl;
@@ -82,7 +80,6 @@
     private AccountFeatureProvider mAccountFeatureProvider;
     private PanelFeatureProvider mPanelFeatureProvider;
     private ContextualCardFeatureProvider mContextualCardFeatureProvider;
-    private FaceFeatureProvider mFaceFeatureProvider;
     private BluetoothFeatureProvider mBluetoothFeatureProvider;
 
     @Override
@@ -240,14 +237,6 @@
     }
 
     @Override
-    public FaceFeatureProvider getFaceFeatureProvider() {
-        if (mFaceFeatureProvider == null) {
-            mFaceFeatureProvider = new FaceFeatureProviderImpl();
-        }
-        return mFaceFeatureProvider;
-    }
-
-    @Override
     public BluetoothFeatureProvider getBluetoothFeatureProvider(Context context) {
         if (mBluetoothFeatureProvider == null) {
             mBluetoothFeatureProvider = new BluetoothFeatureProviderImpl(
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index bf86898..41935fe 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -23,7 +23,6 @@
 
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
-import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
@@ -66,7 +65,6 @@
     public final AssistGestureFeatureProvider assistGestureFeatureProvider;
     public final AccountFeatureProvider mAccountFeatureProvider;
     public final ContextualCardFeatureProvider mContextualCardFeatureProvider;
-    public final FaceFeatureProvider mFaceFeatureProvider;
     public final BluetoothFeatureProvider mBluetoothFeatureProvider;
 
     public PanelFeatureProvider panelFeatureProvider;
@@ -112,7 +110,6 @@
         mAccountFeatureProvider = mock(AccountFeatureProvider.class);
         mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class);
         panelFeatureProvider = mock(PanelFeatureProvider.class);
-        mFaceFeatureProvider = mock(FaceFeatureProvider.class);
         mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
     }
 
@@ -201,16 +198,12 @@
         return panelFeatureProvider;
     }
 
+    @Override
     public ContextualCardFeatureProvider getContextualCardFeatureProvider(Context context) {
         return mContextualCardFeatureProvider;
     }
 
     @Override
-    public FaceFeatureProvider getFaceFeatureProvider() {
-        return mFaceFeatureProvider;
-    }
-
-    @Override
     public BluetoothFeatureProvider getBluetoothFeatureProvider(Context context) {
         return mBluetoothFeatureProvider;
     }
