Add support for saving and using the Preference's key value

- modify the SQlite data model
- update Index code for managing the key value
- pass the key when launching a Fragment or and Activity
- implement a small animation for highlighting the Preference
from a Search result

Change-Id: I617643a4e5e3b752ece8f45ce7d5429037e479da
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 35893ff..d575153 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -26,12 +26,15 @@
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceGroupAdapter;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.widget.Button;
+import android.widget.ListAdapter;
 
 /**
  * Base class for Settings fragments, with some helper functions and dialog management.
@@ -41,6 +44,7 @@
     private static final String TAG = "SettingsPreferenceFragment";
 
     private static final int MENU_HELP = Menu.FIRST + 100;
+    private static final int HIGHLIGHT_DURATION_MILLIS = 750;
 
     private SettingsDialogFragment mDialogFragment;
 
@@ -66,6 +70,47 @@
         if (!TextUtils.isEmpty(mHelpUrl)) {
             setHasOptionsMenu(true);
         }
+
+        final Bundle args = getArguments();
+        if (args != null) {
+            final String key = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+            final int position = findPositionFromKey(getPreferenceScreen(), key);
+            if (position >= 0) {
+                final ListAdapter adapter = getListView().getAdapter();
+                if (adapter instanceof PreferenceGroupAdapter) {
+                    ((PreferenceGroupAdapter) adapter).setActivated(position);
+
+                    getListView().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            ((PreferenceGroupAdapter) adapter).setActivated(-1);
+                            ((PreferenceGroupAdapter) adapter).notifyDataSetChanged();
+                        }
+                    }, HIGHLIGHT_DURATION_MILLIS);
+                }
+            }
+        }
+    }
+
+    private int findPositionFromKey(PreferenceGroup group, String key) {
+        if (group != null) {
+            int count = group.getPreferenceCount();
+            for (int n = 0; n < count; n++) {
+                final Preference preference = group.getPreference(n);
+                final String preferenceKey = preference.getKey();
+                if (preferenceKey != null && preferenceKey.equals(key)) {
+                    return n;
+                }
+                if (preference instanceof PreferenceGroup) {
+                    PreferenceGroup nestedGroup = (PreferenceGroup) preference;
+                    final int nestedPosition = findPositionFromKey(nestedGroup, key);
+                    if (nestedPosition >= 0) {
+                        return n + 1 + nestedPosition;
+                    }
+                }
+            }
+        }
+        return -1;
     }
 
     protected void removePreference(String key) {