Merge "Import translations. DO NOT MERGE"
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index f02f838..77561bd 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -28,7 +28,6 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -42,7 +41,6 @@
 import android.view.View;
 import android.widget.DatePicker;
 import android.widget.TimePicker;
-
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -308,9 +306,10 @@
             removeDialog(DIALOG_TIMEPICKER);
             showDialog(DIALOG_TIMEPICKER);
         } else if (preference == mTime24Pref) {
-            set24Hour(((CheckBoxPreference)mTime24Pref).isChecked());
+            final boolean is24Hour = ((CheckBoxPreference)mTime24Pref).isChecked();
+            set24Hour(is24Hour);
             updateTimeAndDateDisplay(getActivity());
-            timeUpdated();
+            timeUpdated(is24Hour);
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -321,8 +320,9 @@
         updateTimeAndDateDisplay(getActivity());
     }
 
-    private void timeUpdated() {
+    private void timeUpdated(boolean is24Hour) {
         Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
+        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, is24Hour);
         getActivity().sendBroadcast(timeChanged);
     }
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index ec4ebc7..8582bc6 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -133,7 +133,6 @@
     // Constants for state save/restore
     private static final String SAVE_KEY_HEADERS_TAG = ":settings:headers";
     private static final String SAVE_KEY_CURRENT_HEADER_TAG = ":settings:cur_header";
-    private static final String SAVE_KEY_TITLES_TAG = ":settings:titles";
 
     /**
      * When starting this activity, the invoking Intent can contain this extra
@@ -587,7 +586,6 @@
             // We are restarting from a previous saved state; used that to
             // initialize, instead of starting fresh.
             mInitialTitle = getTitle();
-            setTitleFromBackStack();
 
             ArrayList<Header> headers =
                     savedInstanceState.getParcelableArrayList(SAVE_KEY_HEADERS_TAG);
@@ -599,6 +597,7 @@
                     setSelectedHeader(mHeaders.get(curHeader));
                     mInitialHeader = mCurrentHeader;
                 }
+                setTitleFromBackStack();
             }
         } else {
             String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
@@ -713,18 +712,23 @@
 
     @Override
     public void onBackStackChanged() {
-        setTitleFromBackStack();
+        if (setTitleFromBackStack() == 0) {
+            setSelectedHeaderById(mInitialHeader.id);
+        }
     }
 
-    private void setTitleFromBackStack() {
+    private int setTitleFromBackStack() {
         final int count = getFragmentManager().getBackStackEntryCount();
+
         if (count == 0) {
             setTitle(mInitialTitle);
-            setSelectedHeaderById(mInitialHeader.id);
-            return;
+            return 0;
         }
+
         FragmentManager.BackStackEntry bse = getFragmentManager().getBackStackEntryAt(count - 1);
         setTitleFromBackStackEntry(bse);
+
+        return count;
     }
 
     private void setTitleFromBackStackEntry(FragmentManager.BackStackEntry bse) {
diff --git a/src/com/android/settings/indexer/Index.java b/src/com/android/settings/indexer/Index.java
index 414c4d6..5139e0c 100644
--- a/src/com/android/settings/indexer/Index.java
+++ b/src/com/android/settings/indexer/Index.java
@@ -68,7 +68,9 @@
 
     private static final String[] MATCH_COLUMNS = {
             IndexColumns.DATA_TITLE,
+            IndexColumns.DATA_TITLE_NORMALIZED,
             IndexColumns.DATA_SUMMARY,
+            IndexColumns.DATA_SUMMARY_NORMALIZED,
             IndexColumns.DATA_KEYWORDS
     };
 
@@ -280,8 +282,7 @@
 
                 final int outerDepth = parser.getDepth();
                 final AttributeSet attrs = Xml.asAttributeSet(parser);
-                final String fragmentTitle = getData(attrs,
-                        com.android.internal.R.styleable.Preference, com.android.internal.R.styleable.Preference_title);
+                final String fragmentTitle = getDataTitle(attrs);
 
                 String title = getDataTitle(attrs);
                 String summary = getDataSummary(attrs);
@@ -290,9 +291,7 @@
                 // Insert rows for the main PreferenceScreen node. Rewrite the data for removing
                 // hyphens.
                 inserOneRowWithFilteredData(database, localeStr, title, summary, fragmentName,
-                        fragmentTitle, iconResId, rank, keywords, NON_BREAKING_HYPHEN, EMPTY);
-                inserOneRowWithFilteredData(database, localeStr, title, summary, fragmentName,
-                        fragmentTitle, iconResId, rank, keywords, NON_BREAKING_HYPHEN, HYPHEN);
+                        fragmentTitle, iconResId, rank, keywords);
 
                 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                         && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
@@ -306,9 +305,7 @@
 
                     // Insert rows for the child nodes of PreferenceScreen
                     inserOneRowWithFilteredData(database, localeStr, title, summary, fragmentName,
-                            fragmentTitle, iconResId, rank, keywords, NON_BREAKING_HYPHEN, EMPTY);
-                    inserOneRowWithFilteredData(database, localeStr, title, summary, fragmentName,
-                            fragmentTitle, iconResId, rank, keywords, NON_BREAKING_HYPHEN, HYPHEN);
+                            fragmentTitle, iconResId, rank, keywords);
                 }
 
             } catch (XmlPullParserException e) {
@@ -322,37 +319,47 @@
 
         private void inserOneRowWithFilteredData(SQLiteDatabase database, String locale,
                 String title, String summary, String fragmentName, String fragmentTitle,
-                int iconResId, int rank, String keywords, String seq, String replacement) {
+                int iconResId, int rank, String keywords) {
 
             String updatedTitle;
-            String updateSummary;
-            if (title != null && title.contains(seq)) {
-                updatedTitle = title.replaceAll(seq, replacement);
-            } else {
-                updatedTitle = title;
+            if (title != null) {
+                updatedTitle = title.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
             }
-            if (summary != null && summary.contains(seq)) {
-                updateSummary = summary.replaceAll(seq, replacement);
-            } else {
-                updateSummary = summary;
+            else {
+                updatedTitle = EMPTY;
             }
+
+            String updatedSummary;
+            if (summary != null) {
+                updatedSummary = summary.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
+            } else {
+                updatedSummary = EMPTY;
+            }
+
+            String normalizedTitle = updatedTitle.replaceAll(HYPHEN, EMPTY);
+            String normalizedSummary = updatedSummary.replaceAll(HYPHEN, EMPTY);
+
             insertOneRow(database, locale,
-                    updatedTitle, updateSummary,
+                    updatedTitle, normalizedTitle, updatedSummary, normalizedSummary,
                     fragmentName, fragmentTitle, iconResId, rank, keywords);
         }
 
-        private void insertOneRow(SQLiteDatabase database, String locale, String title,
-                                  String summary, String fragmentName, String fragmentTitle,
+        private void insertOneRow(SQLiteDatabase database, String locale,
+                                  String updatedTitle, String normalizedTitle,
+                                  String updatedSummary, String normalizedSummary,
+                                  String fragmentName, String fragmentTitle,
                                   int iconResId, int rank, String keywords) {
 
-            if (TextUtils.isEmpty(title)) {
+            if (TextUtils.isEmpty(updatedTitle)) {
                 return;
             }
             ContentValues values = new ContentValues();
             values.put(IndexColumns.LOCALE, locale);
             values.put(IndexColumns.DATA_RANK, rank);
-            values.put(IndexColumns.DATA_TITLE, title);
-            values.put(IndexColumns.DATA_SUMMARY, summary);
+            values.put(IndexColumns.DATA_TITLE, updatedTitle);
+            values.put(IndexColumns.DATA_TITLE_NORMALIZED, normalizedTitle);
+            values.put(IndexColumns.DATA_SUMMARY, updatedSummary);
+            values.put(IndexColumns.DATA_SUMMARY_NORMALIZED, normalizedSummary);
             values.put(IndexColumns.DATA_KEYWORDS, keywords);
             values.put(IndexColumns.FRAGMENT_NAME, fragmentName);
             values.put(IndexColumns.FRAGMENT_TITLE, fragmentTitle);
diff --git a/src/com/android/settings/indexer/IndexDatabaseHelper.java b/src/com/android/settings/indexer/IndexDatabaseHelper.java
index 243f7b8..3e6396e 100644
--- a/src/com/android/settings/indexer/IndexDatabaseHelper.java
+++ b/src/com/android/settings/indexer/IndexDatabaseHelper.java
@@ -28,7 +28,7 @@
     private static final String TAG = "IndexDatabaseHelper";
 
     private static final String DATABASE_NAME = "search_index.db";
-    private static final int DATABASE_VERSION = 100;
+    private static final int DATABASE_VERSION = 101;
 
     public interface Tables {
         public static final String TABLE_PREFS_INDEX = "prefs_index";
@@ -39,7 +39,9 @@
         public static final String LOCALE = "locale";
         public static final String DATA_RANK = "data_rank";
         public static final String DATA_TITLE = "data_title";
+        public static final String DATA_TITLE_NORMALIZED = "data_title_normalized";
         public static final String DATA_SUMMARY = "data_summary";
+        public static final String DATA_SUMMARY_NORMALIZED = "data_summary_normalized";
         public static final String DATA_KEYWORDS = "data_keywords";
         public static final String FRAGMENT_NAME = "fragment_name";
         public static final String FRAGMENT_TITLE = "fragment_title";
@@ -60,8 +62,12 @@
                     ", " +
                     IndexColumns.DATA_TITLE +
                     ", " +
+                    IndexColumns.DATA_TITLE_NORMALIZED +
+                    ", " +
                     IndexColumns.DATA_SUMMARY +
                     ", " +
+                    IndexColumns.DATA_SUMMARY_NORMALIZED +
+                    ", " +
                     IndexColumns.DATA_KEYWORDS +
                     ", " +
                     IndexColumns.FRAGMENT_NAME +
@@ -113,6 +119,13 @@
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        if (newVersion > 100) {
+            Log.w(TAG, "Detected schema version 100. " +
+                    "Index needs to be rebuilt for schema version 101");
+            // We need to drop the tables and recreate them
+            dropTables(db);
+            bootstrapDB(db);
+        }
     }
 
     private String getBuildVersion(SQLiteDatabase db) {
@@ -144,8 +157,10 @@
     public void onOpen(SQLiteDatabase db) {
         super.onOpen(db);
 
+        Log.i(TAG, "Using schema version: " + db.getVersion());
+
         if (!Build.VERSION.INCREMENTAL.equals(getBuildVersion(db))) {
-            Log.w(TAG, "Index needs to be rebuilt");
+            Log.w(TAG, "Index needs to be rebuilt as build-version is not the same");
             // We need to drop the tables and recreate them
             dropTables(db);
             bootstrapDB(db);