Delete all work fingerprints when unified lock changes to None/Swipe

Bug: 27551139
Change-Id: I64105621057e04be0e4d8073626ac3ed0f1e72d2
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index edd59af..775cf77 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -27,6 +27,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.UserInfo;
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
@@ -50,6 +51,8 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedPreference;
 
+import java.util.List;
+
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 public class ChooseLockGeneric extends SettingsActivity {
@@ -117,25 +120,6 @@
         private FingerprintManager mFingerprintManager;
         private int mUserId;
         private boolean mHideDrawer = false;
-        private RemovalCallback mRemovalCallback = new RemovalCallback() {
-
-            @Override
-            public void onRemovalSucceeded(Fingerprint fingerprint) {
-                Log.v(TAG, "Fingerprint removed: " + fingerprint.getFingerId());
-                if (mFingerprintManager.getEnrolledFingerprints().size() == 0) {
-                    finish();
-                }
-            }
-
-            @Override
-            public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
-                Activity activity = getActivity();
-                if (activity != null) {
-                    Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT);
-                }
-                finish();
-            }
-        };
 
         protected boolean mForFingerprint = false;
 
@@ -599,10 +583,10 @@
                 mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
                 mChooseLockSettingsHelper.utils().clearLock(mUserId);
                 mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
-                removeAllFingerprintTemplatesAndFinish();
+                removeAllFingerprintForUserAndFinish(mUserId);
                 getActivity().setResult(Activity.RESULT_OK);
             } else {
-                removeAllFingerprintTemplatesAndFinish();
+                removeAllFingerprintForUserAndFinish(mUserId);
             }
         }
 
@@ -637,24 +621,27 @@
             return intent;
         }
 
-        private void removeAllFingerprintTemplatesAndFinish() {
+        private void removeAllFingerprintForUserAndFinish(final int userId) {
             if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
-                    && mFingerprintManager.hasEnrolledFingerprints(mUserId)) {
-                mFingerprintManager.setActiveUser(mUserId);
+                    && mFingerprintManager.hasEnrolledFingerprints(userId)) {
+                mFingerprintManager.setActiveUser(userId);
                 mFingerprintManager.remove(
-                        new Fingerprint(null, mUserId, 0, 0), mUserId,
+                        new Fingerprint(null, userId, 0, 0), userId,
                         new RemovalCallback() {
                             @Override
                             public void onRemovalError(Fingerprint fp, int errMsgId,
                                     CharSequence errString) {
-                                mRemovalCallback.onRemovalError(fp, errMsgId, errString);
-                                mFingerprintManager.setActiveUser(UserHandle.myUserId());
+                                Log.v(TAG, "Fingerprint removed: " + fp.getFingerId());
+                                if (fp.getFingerId() == 0) {
+                                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
+                                }
                             }
 
                             @Override
                             public void onRemovalSucceeded(Fingerprint fingerprint) {
-                                mRemovalCallback.onRemovalSucceeded(fingerprint);
-                                mFingerprintManager.setActiveUser(UserHandle.myUserId());
+                                if (fingerprint.getFingerId() == 0) {
+                                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
+                                }
                             }
                         });
             } else {
@@ -666,6 +653,29 @@
             }
         }
 
+        private void removeManagedProfileFingerprintsAndFinishIfNecessary(final int parentUserId) {
+            mFingerprintManager.setActiveUser(UserHandle.myUserId());
+            final UserManager um = UserManager.get(getActivity());
+            boolean hasChildProfile = false;
+            if (!um.getUserInfo(parentUserId).isManagedProfile()) {
+                // Current user is primary profile, remove work profile fingerprints if necessary
+                final List<UserInfo> profiles = um.getProfiles(parentUserId);
+                final int profilesSize = profiles.size();
+                for (int i = 0; i < profilesSize; i++) {
+                    final UserInfo userInfo = profiles.get(i);
+                    if (userInfo.isManagedProfile() && !mLockPatternUtils
+                            .isSeparateProfileChallengeEnabled(userInfo.id)) {
+                        removeAllFingerprintForUserAndFinish(userInfo.id);
+                        hasChildProfile = true;
+                        break;
+                    }
+                }
+            }
+            if (!hasChildProfile) {
+                finish();
+            }
+        }
+
         @Override
         public void onDestroy() {
             super.onDestroy();