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

Commit c24adcdf authored by Jim Miller's avatar Jim Miller Committed by Android (Google) Code Review
Browse files

Merge "FingerprintSettings improvements"

parents 754b5669 4f6f7c86
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -384,15 +384,6 @@ public class FingerprintEnroll extends SettingsActivity {
            }
        };

        private boolean runConfirmDeviceCredentials(int request) {
            if (DEBUG) Log.v(TAG, "runKeyguardConfirmation(" + request + ")");
            Resources res = getResources();
            return new ChooseLockSettingsHelper(getActivity(), this)
                    .launchConfirmationActivity(request,
                            res.getText(R.string.master_clear_gesture_prompt),
                            res.getText(R.string.master_clear_gesture_explanation));
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
+128 −18
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceGroup;
@@ -30,12 +32,13 @@ import android.preference.PreferenceScreen;
import android.service.fingerprint.FingerprintManager;
import android.service.fingerprint.FingerprintManagerReceiver;
import android.service.fingerprint.FingerprintManager.FingerprintItem;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import com.android.settings.search.Indexable;

import java.util.HashMap;
import java.util.List;

/**
@@ -73,14 +76,28 @@ public class FingerprintSettings extends SettingsActivity {
        private static final String KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE =
                "fingerprint_enable_keyguard_toggle";

        private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
        private static final int MSG_HIGHLIGHT_FINGERPRINT_ITEM = 1001;

        private static final int ADD_FINGERPRINT_REQUEST = 10;

        private static final boolean ENABLE_USAGE_CATEGORY = false;

        private FingerprintManager mFingerprintManager;
        private HashMap<Preference, FingerprintItem> mFingerprintMap
                = new HashMap<Preference, FingerprintManager.FingerprintItem>();
        private EditText mDialogTextField;
        private PreferenceGroup mManageCategory;
        private final Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case MSG_REFRESH_FINGERPRINT_TEMPLATES:
                        removeFingerprintPreference(msg.arg1);
                    break;
                    case MSG_HIGHLIGHT_FINGERPRINT_ITEM:
                        highlightFingerprintItem(msg.arg1);
                    break;
                }
            };
        };

        @Override
        public void onCreate(Bundle savedInstanceState) {
@@ -90,17 +107,42 @@ public class FingerprintSettings extends SettingsActivity {
            mFingerprintManager.startListening(new FingerprintManagerReceiver() {
                @Override
                public void onRemoved(int fingerprintId) {
                    Log.v(TAG, "Fingerprint template " + fingerprintId + " removed");
                    // TODO: this is a bit wasteful; just remove the fingerprint id item
                    createPreferenceHierarchy();
                    mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES, fingerprintId, 0)
                            .sendToTarget();
                }
                @Override
                public void onProcessed(int fingerprintId) {
                    Log.v(TAG, "Fingerprint " + fingerprintId + " detected");
                    if (fingerprintId != 0) {
                        mHandler.obtainMessage(MSG_HIGHLIGHT_FINGERPRINT_ITEM, fingerprintId, 0)
                                .sendToTarget();
                    }
                }
            });
        }

        protected void removeFingerprintPreference(int fingerprintId) {
            String name = genKey(fingerprintId);
            Preference prefToRemove = mManageCategory.findPreference(name);
            if (prefToRemove != null) {
                if (!mManageCategory.removePreference(prefToRemove)) {
                    Log.w(TAG, "Failed to remove preference with key " + name);
                }
            } else {
                Log.w(TAG, "Can't find preference to remove: " + name);
            }
        }

        private void highlightFingerprintItem(int fpId) {
            String prefName = genKey(fpId);
            Preference pref = mManageCategory.findPreference(prefName);
            if (pref instanceof FingerprintPreference) {
                final FingerprintPreference fpref = (FingerprintPreference) pref;
                fpref.highlight();
            } else {
                Log.w(TAG, "Wrong pref " + (pref != null ? pref.getKey() : "null"));
            }
        }

        /**
         * Important!
         *
@@ -116,10 +158,9 @@ public class FingerprintSettings extends SettingsActivity {
            root = getPreferenceScreen();

            // Fingerprint items
            PreferenceGroup manageCategory = (PreferenceGroup) root.findPreference(
                    KEY_MANAGE_CATEGORY);
            if (manageCategory != null) {
                addFingerprintItemPreferences(manageCategory);
            mManageCategory = (PreferenceGroup) root.findPreference(KEY_MANAGE_CATEGORY);
            if (mManageCategory != null) {
                addFingerprintItemPreferences(mManageCategory);
            }

            // Fingerprint usage options
@@ -142,15 +183,16 @@ public class FingerprintSettings extends SettingsActivity {
            manageFingerprintCategory.removeAll();
            List<FingerprintItem> items = mFingerprintManager.getEnrolledFingerprints();
            final int fingerprintCount = items.size();
            mFingerprintMap.clear();
            for (int i = 0; i < fingerprintCount; i++) {
                Preference pref = new Preference(manageFingerprintCategory.getContext());
                pref.setKey(KEY_FINGERPRINT_ITEM);
                FingerprintItem item = items.get(i);
                final FingerprintItem item = items.get(i);
                FingerprintPreference pref = new FingerprintPreference(
                        manageFingerprintCategory.getContext());
                pref.setKey(genKey(item.id));
                pref.setTitle(item.name);
                pref.setFingerprintItem(item);
                pref.setPersistent(false);
                manageFingerprintCategory.addPreference(pref);
                pref.setOnPreferenceChangeListener(this);
                mFingerprintMap.put(pref, item);
            }
            Preference addPreference = new Preference(manageFingerprintCategory.getContext());
            addPreference.setKey(KEY_FINGERPRINT_ADD);
@@ -159,6 +201,10 @@ public class FingerprintSettings extends SettingsActivity {
            addPreference.setOnPreferenceChangeListener(this);
        }

        private static String genKey(int id) {
            return KEY_FINGERPRINT_ITEM + "_" + id;
        }

        @Override
        public void onResume() {
            super.onResume();
@@ -174,8 +220,9 @@ public class FingerprintSettings extends SettingsActivity {
                Intent intent = new Intent();
                intent.setClassName("com.android.settings", FingerprintEnroll.class.getName());
                startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
            } else if (KEY_FINGERPRINT_ITEM.equals(key)) {
                final FingerprintItem item = mFingerprintMap.get(pref);
            } else if (pref instanceof FingerprintPreference) {
                FingerprintPreference fpref = (FingerprintPreference) pref;
                final FingerprintItem item =fpref.getFingerprintItem();
                showRenameDeleteDialog(item.name, pref, item.id);
                return super.onPreferenceTreeClick(preferenceScreen, pref);
            }
@@ -232,4 +279,67 @@ public class FingerprintSettings extends SettingsActivity {
            return R.string.help_url_security;
        }
    }

    public static class FingerprintPreference extends Preference {
        private static final int RESET_HIGHLIGHT_DELAY_MS = 500;
        private FingerprintItem mFingerprintItem;
        private View mView;
        private Drawable mHighlightDrawable;
        private Context mContext;

        public FingerprintPreference(Context context, AttributeSet attrs, int defStyleAttr,
                int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            mContext = context;
        }
        public FingerprintPreference(Context context, AttributeSet attrs, int defStyleAttr) {
            this(context, attrs, defStyleAttr, 0);
        }

        public FingerprintPreference(Context context, AttributeSet attrs) {
            this(context, attrs, com.android.internal.R.attr.preferenceStyle);
        }

        public FingerprintPreference(Context context) {
            this(context, null);
        }

        public void setFingerprintItem(FingerprintItem item) {
            mFingerprintItem = item;
        }

        public FingerprintItem getFingerprintItem() {
            return mFingerprintItem;
        }

        private Drawable getHighlightDrawable() {
            if (mHighlightDrawable == null) {
                mHighlightDrawable = mContext.getDrawable(R.drawable.preference_highlight);
            }
            return mHighlightDrawable;
        }

        public void highlight() {
            Drawable highlight = getHighlightDrawable();
            final View view = mView;
            view.setBackground(highlight);
            final int centerX = view.getWidth() / 2;
            final int centerY = view.getHeight() / 2;
            highlight.setHotspot(centerX, centerY);
            view.setPressed(true);
            view.postDelayed(new Runnable() {
                @Override
                public void run() {
                    view.setPressed(false);
                    view.setBackground(null);
                }
            }, RESET_HIGHLIGHT_DELAY_MS);
        }

        @Override
        protected void onBindView(View view) {
            super.onBindView(view);
            mView = view;
        }
    };
}