Make the DatePicker respect the date format setting if the date is numeric.

In some locales, there are no abbreviated month names; the abbreviated
date formats are essentially numeric.  If the user is in such a locale,
have the DatePicker respect the date format setting so that the order
of the fields will match other numeric-only dates.

In locales that have abbreviated month names, continue to use the order
that is normal in spelled-out dates.

And update the order in updateDate() so that the new order is reflected
if you change the order setting and immediately go to change the date
without leaving and returning to the Date & Time settings in between.

At the same time, change DateFormat.getDateFormatOrder() back to working
the way it did in cupcake (prioritizing the date order preference over
the locale), even though the DatePicker no longer calls the method.

Bug 1805085
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 3d10f17..524f941 100644
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -284,6 +284,12 @@
      */
     public static java.text.DateFormat getDateFormatForSetting(Context context,
                                                                String value) {
+        String format = getDateFormatStringForSetting(context, value);
+
+        return new java.text.SimpleDateFormat(format);
+    }
+
+    private static String getDateFormatStringForSetting(Context context, String value) {
         if (value != null) {
             int month = value.indexOf('M');
             int day = value.indexOf('d');
@@ -291,7 +297,7 @@
 
             if (month >= 0 && day >= 0 && year >= 0) {
                 String template = context.getString(R.string.numeric_date_template);
-                if (year < month) {
+                if (year < month && year < day) {
                     if (month < day) {
                         value = String.format(template, "yyyy", "MM", "dd");
                     } else {
@@ -311,7 +317,7 @@
                     }
                 }
 
-                return new java.text.SimpleDateFormat(value);
+                return value;
             }
         }
 
@@ -321,7 +327,7 @@
          * so that we get a four-digit year instead a two-digit year.
          */
         value = context.getString(R.string.numeric_date_format);
-        return new java.text.SimpleDateFormat(value);
+        return value;
     }
     
     /**
@@ -347,7 +353,11 @@
     /**
      * Gets the current date format stored as a char array. The array will contain
      * 3 elements ({@link #DATE}, {@link #MONTH}, and {@link #YEAR}) in the order    
-     * preferred by the user.
+     * specified by the user's format preference.  Note that this order is
+     * only appropriate for all-numeric dates; spelled-out (MEDIUM and LONG)
+     * dates will generally contain other punctuation, spaces, or words,
+     * not just the day, month, and year, and not necessarily in the same
+     * order returned here.
      */    
     public static final char[] getDateFormatOrder(Context context) {
         char[] order = new char[] {DATE, MONTH, YEAR};
@@ -380,22 +390,10 @@
     }
     
     private static String getDateFormatString(Context context) {
-        java.text.DateFormat df;
-        df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
-        if (df instanceof SimpleDateFormat) {
-            return ((SimpleDateFormat) df).toPattern();
-        }
-
         String value = Settings.System.getString(context.getContentResolver(),
                 Settings.System.DATE_FORMAT);
-        if (value == null || value.length() < 6) {
-            /*
-             * No need to localize -- this is an emergency fallback in case
-             * the setting is missing, but it should always be set.
-             */
-            value = "MM-dd-yyyy";
-        }
-        return value;
+
+        return getDateFormatStringForSetting(context, value);
     }
 
     /**
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 3b9f1de..5e76cc3 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -31,6 +31,7 @@
 import com.android.internal.widget.NumberPicker.OnChangedListener;
 
 import java.text.DateFormatSymbols;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 
 /**
@@ -101,7 +102,8 @@
         mMonthPicker = (NumberPicker) findViewById(R.id.month);
         mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
         DateFormatSymbols dfs = new DateFormatSymbols();
-        mMonthPicker.setRange(1, 12, dfs.getShortMonths());
+        String[] months = dfs.getShortMonths();
+        mMonthPicker.setRange(1, 12, months);
         mMonthPicker.setSpeed(200);
         mMonthPicker.setOnChangeListener(new OnChangedListener() {
             public void onChanged(NumberPicker picker, int oldVal, int newVal) {
@@ -146,7 +148,7 @@
         init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null);
         
         // re-order the number pickers to match the current date format
-        reorderPickers();
+        reorderPickers(months);
         
         if (!isEnabled()) {
             setEnabled(false);
@@ -161,29 +163,69 @@
         mYearPicker.setEnabled(enabled);
     }
 
-    private void reorderPickers() {
-        char[] order = DateFormat.getDateFormatOrder(mContext);
-        
-        /* Default order is month, date, year so if that's the order then
-         * do nothing.
+    private void reorderPickers(String[] months) {
+        java.text.DateFormat format;
+        String order;
+
+        /*
+         * If the user is in a locale where the medium date format is
+         * still numeric (Japanese and Czech, for example), respect
+         * the date format order setting.  Otherwise, use the order
+         * that the locale says is appropriate for a spelled-out date.
          */
-        if ((order[0] == DateFormat.MONTH) && (order[1] == DateFormat.DATE)) {
-            return;
+
+        if (months[0].startsWith("1")) {
+            format = DateFormat.getDateFormat(getContext());
+        } else {
+            format = DateFormat.getMediumDateFormat(getContext());
         }
-        
+
+        if (format instanceof SimpleDateFormat) {
+            order = ((SimpleDateFormat) format).toPattern();
+        } else {
+            // Shouldn't happen, but just in case.
+            order = new String(DateFormat.getDateFormatOrder(getContext()));
+        }
+
         /* Remove the 3 pickers from their parent and then add them back in the
          * required order.
          */
         LinearLayout parent = (LinearLayout) findViewById(R.id.parent);
         parent.removeAllViews();
-        for (char c : order) {
-            if (c == DateFormat.DATE) {
-                parent.addView(mDayPicker);
-            } else if (c == DateFormat.MONTH) {
-                parent.addView(mMonthPicker);
-            } else {
-                parent.addView (mYearPicker);
+
+        boolean quoted = false;
+        boolean didDay = false, didMonth = false, didYear = false;
+
+        for (int i = 0; i < order.length(); i++) {
+            char c = order.charAt(i);
+
+            if (c == '\'') {
+                quoted = !quoted;
             }
+
+            if (!quoted) {
+                if (c == DateFormat.DATE && !didDay) {
+                    parent.addView(mDayPicker);
+                    didDay = true;
+                } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) {
+                    parent.addView(mMonthPicker);
+                    didMonth = true;
+                } else if (c == DateFormat.YEAR && !didYear) {
+                    parent.addView (mYearPicker);
+                    didYear = true;
+                }
+            }
+        }
+
+        // Shouldn't happen, but just in case.
+        if (!didMonth) {
+            parent.addView(mMonthPicker);
+        }
+        if (!didDay) {
+            parent.addView(mDayPicker);
+        }
+        if (!didYear) {
+            parent.addView(mYearPicker);
         }
     }
 
@@ -192,6 +234,7 @@
         mMonth = monthOfYear;
         mDay = dayOfMonth;
         updateSpinners();
+        reorderPickers(new DateFormatSymbols().getShortMonths());
     }
 
     private static class SavedState extends BaseSavedState {