Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 751de372 authored by Ricky Wai's avatar Ricky Wai
Browse files

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

Bug: 27551139
Change-Id: I64105621057e04be0e4d8073626ac3ed0f1e72d2
parent 996d0dfa
Loading
Loading
Loading
Loading
+39 −29
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.app.admin.DevicePolicyManager;
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.internal.widget.LockPatternUtils;
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 @@ public class ChooseLockGeneric extends SettingsActivity {
        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 @@ public class ChooseLockGeneric extends SettingsActivity {
                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 @@ public class ChooseLockGeneric extends SettingsActivity {
            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 @@ public class ChooseLockGeneric extends SettingsActivity {
            }
        }

        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();